[우분투] IPv6 사용 Develop Tip

최근에 IPv6 사용의 필요가 있었습니다.
그간 거의 사용을 하지 않았다가, 이제사 사용하면서
약간의 구글링이 필요했습니다.
이번에도 까먹지 않기 위하여 정리를 해 봅니다.
(나이가 들 수록, 정리하는 시간 대비 점점 더 찾는 참조를 하는 시간이 많아집니다 ^^)

참고로, 우분투 데스크탑에서는
NetworkManager 라는 프로그램이 그놈 환경에 붙어서 IP 설정을 하게 됩니다.
이 방법보다는 /etc/network/interfaces 파일 설정에 의한 설정을 더 잘 하게되는데요,
우분투 데스크탑 버전에서 NetworkManager를 비 활성화 시키기 위하여,

$ sudo apt-get purge network-manager
를 시키면 됩니다.

또한 /etc/network/interfaces 설정파일에 IPv4 및 IPv6지정은 다음과 같습니다.

$ sudo vi /etc/network/interfaces
# ipv4 setting
auto eth0
iface eth0 inet static
        address 192.168.1.139
        netmask 255.255.255.0
        gateway 192.168.1.254
# ipv6 setting
auto eth3
iface eth3 inet6 static
     address  2011::192:168:1:139
     netmask  64

위와 같이 설정하면 됩니다.

참고로, 위에서처럼 IPv6를 설정하고 나면,
$ ifconfig eth3
eth3      Link encap:Ethernet  HWaddr 00:90:fb:22:65:03 
          inet6 addr: fe80::290:fbff:fe22:6503/64 Scope:Link
          inet6 addr: 2011::192:168:1:139/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:195 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18368 (18.3 KB)  TX bytes:20662 (20.6 KB)
          Memory:f7ce0000-f7d00000

위에서와 같이 inet6 주소가 두개 보이는데,
Scope:Link는 맥주소를 가지고 무조건 만들어주는 주소이고, (fe80:...)
2... 로 시작하는 Scope:Global IPv6 주소가 보입니다.
실제 Scope:Global IPv6 주소가 있어야만 서로 다른 호스트끼리 통신이 되더군요.

이제 간단히 테스트를 해 봐야 하는데, 우선 로컬에서 PING이 되는지 확인합니다.
참고로 TCP, UDP 인 경우 Layer3만 IPv6로 변환되고 그 이후 레이어는 기존 IPv4와 동일한데 반하여
ICMP인 경우 ICMPv6를 사용합니다.

$ ping6 -I eth3 2011::192:168:1:139
PING 2011::192:168:1:139(2011::192:168:1:139) from 2011::192:168:1:139 eth3: 56 data bytes
64 bytes from 2011::192:168:1:139: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 2011::192:168:1:139: icmp_seq=2 ttl=64 time=0.010 ms
64 bytes from 2011::192:168:1:139: icmp_seq=3 ttl=64 time=0.010 ms

참고로, 로컬 룹백 핑6 테스트는,
$ ping6 -I lo "::1"
PING ::1(::1) from ::1 lo: 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.007 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.008 ms

이제는 같은 네트워크 대역에 있는 다른 호스트가
2011::192:168:1:98 이라고 설정을 했다고 가정하고,
그 곳으로 핑백을 해보면,

$ ping6 -I eth3 "2011::192:168:1:98"
PING 2011::192:168:1:98(2011::192:168:1:98) from 2011::192:168:1:139 eth3: 56 data bytes
64 bytes from 2011::192:168:1:98: icmp_seq=1 ttl=64 time=3.37 ms
64 bytes from 2011::192:168:1:98: icmp_seq=2 ttl=64 time=0.140 ms
64 bytes from 2011::192:168:1:98: icmp_seq=3 ttl=64 time=0.150 ms

와 같이 다른 호스트로 IPv6 핑이 되는 것을 확인했구요...

마지막으로 wget을 IPv6로 해 보겠습니다.

$ wget -6q -O - "http://[2011::192:168:1:98]"
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>


또한 6tunnel 이라고 하여 간단히 IPv4 응용프로그램을 ipv6로 터널링 하는 프로그램이 있습니다.
사용법은,

$ sudo apt-get install 6tunnel
$ sudo 6tunnel -dv 80 2011:192:168:1:98

와 같이 터널링을 해 놓으면

$ sudo wget -q -O - "http://localhost"

결과가 잘 나옵니다.

위와 같이 간단히 IPv6 통신에 대해서 살펴보았습니다.

기타 필요한 정보들... (블로그참조)

* 멀티캐스트 주소

FF01::1 - All Nodes Address

FF01::2 - All Routers Address

 

* 멀티캐스트 주소의 범위(Scope)

. FF01 - Node Local

. FF02 - LInk Local

. FF05 - Site Local

. FF06-FF0D - Various "admistrative" Scopes

. FF0E - Global Scope

 

* loop back address

::1

 

* link-Local Address prefix

FE80

* 현재 listening하고 있는 V6 소켓 보기

netstat -l -A inet6

 

기본적으로 netstat에서 -A inet6 옵션만 더 설정해주면 된다.

 

* 라우팅 정보 보기

route -A inet6



IPv6 공격 도구 관련


아직까지 많은 수의 IPv6 공격도구가 존재하지는 않지만, 이와 관련된 사이트에서 여러가지 유용한 정보를 얻을 수가 있다.

 

The Hacker's Choice(THC) - (http://thc.segfault.net/)

IPv6뿐만 아니라 IPv4환경에서의 공격도구들에 대한 다양한 정보가 포함되어 있다.

 

thc-ipv6-0.7.tar.gz(http://thc.segfault.net/thc-ipv6/) 파일을 다운받아 압축풀고 컴파일해서 실행해보면 몇가지 도구들을 실행해 볼 수 있다. 잘 동작하는 편이다.

 

* NMAP(http://insecure.org/nmap/)

V4/V6를 통털아 가장 널리쓰이고 유용한 스캐닝도구(공격도구라고 부르기는 좀 힘들지 않나 생각한다)이다. 대부분은 리눅스 배포판에도 설치되어 있어서 쉽게 사용할 수있다.

옵션중에서 -6 를 사용하면 V6 스캐닝도 가능하다.(2007/02/15 현재. V6 스캐닝은 전체 기능중 일부분의 기능에서만 지원한다)

 

Sendip6(http://www.laurentconstantin.com/en/netw/#download)

공격툴이라고 하기 보다는 패킷을 생성해서 보낼 수 있는 도구이며 상당히 다양한 기능을 가지고 있다.

 

<*> V6에서의 스캐닝 및 정보수집 - alive6와 NMAP을 연계해 사용

NMAP에서 V6스캐닝은 특정호스트를 지정해야지만 된다. 이는 V6는 주소공간이 V4에 비해 비약적으로 증가하여 이전방식으로 스캐닝을 시도하면 하염없는 시간이 걸리기 때문이라고 볼 수 있다. 그래서, 여러가지 변종방식의 스캐닝에 대한 연구들이 이루어져왔는데, 소규모 네트워크에서 V6스캐닝을 체험할 수 있는 방법은 THC에서 V6도구를 다운받아 그중 alive6를 실행해서 현재 네트워크에 있는 시스템들을 알아오고, 그 다음에 이렇게 알게된 시스템에 대해 NMAP을 실행하는 방법을 사용하면 할 수 있다.

 

alive6에서는 FF02::1 멀티캐스트 주소로 ICMPv6 패킷을 보낸다. 이 주소는 Link local Scope에서 모든 노드들에게 전달되는 멀티캐스트 주소이므로 동일 라우터에 연결된 시스템에 대해서는 살아있는지 여부를 알 수 있게 된다.


덧글

  • 지훈현서아빠 2011/09/24 10:25 # 답글

    ipcalc 라고 유틸리티가 있는데, ipv6용 동일 유틸리티는 sipcalc 라고 있습니다~
  • 지훈현서아빠 2011/09/24 11:48 # 답글

    IPv4와 IPv6의 헤더를 자세히 비교해 놓은 것은
    http://emca.tistory.com/tag/IPv6
    를 참고하시고,
    libnet 프로그램 개발 참고는,
    http://libnet.sourcearchive.com/documentation/1.1.4-2/libnet-functions_8h_3d7de8968c2087df7a22140d7993e267.html#3d7de8968c2087df7a22140d7993e267
    를 참고하시면 됩니다.
  • 우분투 2012/05/22 16:45 # 삭제 답글

    네트워크 관리자 삭제하고 저렇게해도 안되고

    인터넷도 끈켜버렸네요 네트워크관리자어떻게살리죠?
  • 오그리 2015/05/01 17:39 # 삭제 답글

    위 네트워크 매니저 삭제하면 인터넷 연결 끊깁니다. 잘 보고 하세요
    이분은 그런것들을 설명하고 해야지. 무조건 실행하라고 하면,, 초보자들은 어찌합니까?
    참네..
  • 오그리 2015/05/01 17:39 # 삭제 답글

    위 네트워크 매니저 삭제하면 인터넷 연결 끊깁니다. 잘 보고 하세요
    이분은 그런것들을 설명하고 해야지. 무조건 실행하라고 하면,, 초보자들은 어찌합니까?
    참네..
  • 족발한번먹자 2018/02/07 13:44 # 삭제 답글

    inet6 addr: fe80::290:fbff:fe22:6503/64 Scope:Link 는 동일 스위치 상의 장비들 간에 사용하기를 권고하는 주소입니다.

    이를 이용하여 통신하려면, scope_id를 알아야 합니다.
    ----- ip addr show 명령으로 얻는 방법 -----------
    [root@localhost test]# ip addr show
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    2: mgnt0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.220/24 brd 192.168.0.255 scope global mgnt0
    3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:56 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8e89:a5ff:fece:8956/64 scope link
    valid_lft forever preferred_lft forever
    4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:57 brd ff:ff:ff:ff:ff:ff
    5: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:58 brd ff:ff:ff:ff:ff:ff
    6: eth3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:59 brd ff:ff:ff:ff:ff:ff
    7: eth4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether 8c:89:a5:ce:89:5a brd ff:ff:ff:ff:ff:ff
    8: eth5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether 8c:89:a5:ce:89:5b brd ff:ff:ff:ff:ff:ff
    9: eth6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether 8c:89:a5:ce:89:5c brd ff:ff:ff:ff:ff:ff
    10: eth7: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8c:89:a5:ce:89:5d brd ff:ff:ff:ff:ff:ff
    inet 50.50.50.50/24 brd 50.50.50.255 scope global eth7
    11: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
    12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 8c:89:a5:ce:89:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.149/24 brd 192.168.1.255 scope global br0
    inet6 fe80::8e89:a5ff:fece:8956/64 scope link
    valid_lft forever preferred_lft forever
    13: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 8c:89:a5:ce:89:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.165/24 brd 192.168.0.255 scope global br1
    inet6 fe80::8e89:a5ff:fece:8958/64 scope link
    valid_lft forever preferred_lft forever
    [root@localhost test]
    출력결과의 좌측에 1,2,3,~,13이 scope_id입니다.

    원격지의 IPv6 link local address가 fe80::a6bf:1ff:fe21:db02 이고 포트번호가 50013인 daytime서비스가 수행중이라고 가정하면 다음과 같이 수행할 수 있습니다.
    그리고, 로컬장비의 scope_id가 12인 br0 인터페이스를 경유해서 연결한다고 가정하겠습니다.
    링크로컬주소+%+스콥id 를 ipv6주소로 간주하게 됩니다.즉, fe80::a6bf:1ff:fe21:db02%12 이렇게 되겠지요.
    이는 마치 ping6 사용시 -I "인터페이스명"과 유사하다고 보면 됩니다.

    [root@localhost test]# telnet fe80::a6bf:1ff:fe21:db02%12 50013
    Trying fe80::a6bf:1ff:fe21:db02%br0...
    Connected to fe80::a6bf:1ff:fe21:db02%12 (fe80::a6bf:1ff:fe21:db02%br0).
    Escape character is '^]'.
    Wed Feb 7 13:29:28 2018
    Connection closed by foreign host.
    [root@localhost test]

    결과가 제대로 나옴을 알 수 있습니다.

    ----------- 프로그램에서 scope_id를 얻는 방법 --------
    struct sockaddr_in6의 자료구조 중 하나 입니다.
    #include <string.h> // strcmp
    #include <net/if.h> // if_nametoindex()
    #include <ifaddrs.h> // getifaddrs()
    #include <netdb.h> // NI_ constants

    // returns 0 on error
    // 호출 getScopeForIp("eth0");
    // 리턴값이 scope_id이고 이를 이용하여 소켓연결을 하면됩니다.
    unsigned getScopeForIp(const char *ip){
    struct ifaddrs *addrs, *addr;
    char ipAddress[NI_MAXHOST];
    unsigned scope=0;
    // walk over the list of all interface addresses
    getifaddrs(&addrs);
    for(addr=addrs;addr;addr=addr->ifa_next){
    if (addr->ifa_addr && addr->ifa_addr->sa_family==AF_INET6){ // only interested in ipv6 ones
    getnameinfo(addr->ifa_addr,sizeof(struct sockaddr_in6),ipAddress,sizeof(ipAddress),NULL,0,NI_NUMERICHOST);
    // result actually contains the interface name, so strip it
    for(int i=0;ipAddress[i];i++){
    if(ipAddress[i]=='%'){
    ipAddress[i]='

구글애드텍스트