2011년 4월 8일 금요일

Linux Mobile IPv6 HOWTO (2004)

원저자 : Lars Strand (lars (at) unik.no)

번역자 : 김영민 (blhole (at) venus.uos.ac.kr)

이 문서는 [http]Linux Mobile IPv6 HOWTO 2004-04-20의 번역입니다.

1 소개 

이 문서는 리눅스에서 모바일 IPv6를 설치하고 사용하기 위해 소프트웨어들을 어떻게 구성하는지 설명한다. [http]Mobility Support in IPv6 draft에 모바일 IP가 무엇이며 왜 필요한지 기술되어 있다.

1.1 모바일 IP는 무엇인가? 

각각의 모바일 노드는 인터넷상의 현재 접속해 있는 위치에 관련없이 항상 home address를 이용해 통신한다. 모바일 노드가 홈에서 벗어나 다른 곳에서 인터넷을 사용할 때는 부가적으로 모바일 노드의 현재 위치를 나타내는 care-of address를 부여 받는다. 모바일 노드의 home address를 목적지 주소로 하는 IPv6 패킷들은 모바일 노드의 home agent (HA)에 의해 care-of address로 보내진다. 모바일 노드는 모바일 IP 프로토콜의 지원으로 자신의 home address와 care-of address의 맵핑정보를 유지할 수 있고, 이 정보를 이용해서 HA를 거치지 않고 직접 care-of address로 패킷을 전송할 수 있다.

1.2 왜 모바일 IP를 사용해야 하는가? 

모발일 IP 기능이 없어 IPv6에서 노드의 이동성을 지원하지 못한다면, 기본적인 라우팅은 패킷의 목적지 주소를 포함하는 서브넷으로 보내지므로, 모바일 노드(호스트 또는 라우터)가 home link에 있지 않을 경우 모바일 노드로 보내지는 패킷을 수신할 수 없다. 모바일 노드가 다른 link로 이동하더라도 계속 통신을 유지하기 위해서 새로운 link로 이동할 때마다 해당 서브넷주소를 가지고 IP 주소를 변경해야 한다. 그러나, 전송 계층이나 상위 계층의 통신을 그대로 유지할 수는 없을 것이다. IPv6의 보급으로 이동 컴퓨터들을 늘어날 것이므로 IPv6에서의 이동성 지원은 매우 중요하다.

1.3 모바일 IP의 동작방식 

http://wiki.kldp.org/pds/LinuxMobileIPv6/Mobile-IP.png

Mobile IP

  • 모바일 노드(MN)가 다른(foreign) 네트워크로 이동하고
새로운 care-of-address를 부여 받는다.
  • MN이 자신의 HA (home agent) 와 binding update를 수행한다
(새로운 care-of-address가 HA에 등록된다). HA는 MN에게 bining acknowledgement 를 보낸다.
  • CN (Correspondent Node)이 MN과 통신하길 원하는 경우,
HA가 CN이 MN에게 보내는 패킷을 가로챈다.
  • 패킷을 가로챈 후 HA는 CN에서 MN으로 가는 모든
패킷들을 MN의 care-of-address로 터널링한다.
  • MN이 CN에게 응답할 경우, MN은 현재 사용중인 care-of-address
를 사용할 수도 있다. (그리고 CN으로의 바인딩을 수행한다) MN은 CN과 직접 통신(최적화된 라우팅)하거나 HA를 통해 터널링 할 수도 있다.

위의 그림과 설명을 함께 보라.

2 IPv6 

IP 버전 6 (IPv6)는 IP 버전 4[http]RFC-791의 차기 버전으로 설계된 인터넷 프로토콜(IP)의 새로운 버전이다.

모바일 IPv6 (MIPv6)가 어떻게 동작하는지를 완벽하게 이해하기 위해서는 IPv6의 무상태 자동 주소 설정에 대한 기본적인 지식을 가져야만 한다. [http]RFC2462에서 IPv6의 무상태 자동 주소 설정 에 대해 읽는 것을 권장한다.

일반적인 IPv6 정보를 얻기 위해서 [http]IETF의 IPv6 워킹 그룹을 방문하라.

3 리눅스를 위한 모바일 IPv6 

현재 이용가능한 모바일 IPv6 구현물은 두 가지가 존재한다. 영국의 Lancaster 대학 은 [http]가장 오래된(?) MIPv6 구현을 보유하고 있다. 지원하는 가장 최근 커널 버전은 2.1.90이며, IETF 모바일 IPv6 draft-v5(현재는 v24)을 기초로 구현한 버전이다. 이 구현은 1998년 이후로 갱신된 것이 전혀 없으므로 본 문서에서는 고려하지 않는다.

다른 최신 구현은 헬싱키 대학 (Helsinki University of Technology)의 MIPL 프로젝트이다. 지원하는 가장 최근의 커널 버전은 2.4.22이고 조만간 정식 배포할 2.6커널의 패치도 개발하였다(자주 하는 질문을 보라). 관련문서와 소프트웨어, 개발 과정등을 볼려면 [http]http://www.mobile-ipv6.org를 방문하라.

3.1 커널 패치 

MIPL MIPv6 구현은 커널 패치를 요구하므로 IPv6 커널을 수정하고 재 컴파일 해야 한다. 설치과정을 정리한 문서는 잘 되어 있지만, 여기서는 간략한 단계별 설치방법을 제시한다.

주목! MN을 위한 커널과 HA를 위한 커널, 이렇게 두 개의 커널을 사용하는 방식은 예전 방식이다. 현재는 하나의 커널에 MN과 HA을 모두 지원할 수 있도록 컴파일 한다. 그러나, 동시에 MN과 HA의 역할을 수행할 수는 없으며, 어떠한 모듈이 올려지느냐에 따라 MN이나 HA의 역할을 수행한다.

현재의 가장 최신 버전은 mipv6-1.0-v2.4.22이다. v이후의 마지막 숫자 네 개는 커널을 패치할 때 사용해야 하는 커널의 버전이다.

# cd /usr/local/src
# wget http://www.mobile-ipv6.org/download/mipv6-1.0-v2.4.22.tar.gz
# tar zxfv mipv6-1.0-v2.4.22.tar.gz


# cd /usr/src
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.22.tar.bz2
# tar jxvf linux-2.4.22.tar.bz2
# ln -s linux-2.4.22 linux
# cd linux


  • MIPv6 패치를 적용한다.
# patch -p1 --dry-run < /usr/local/src/mipv6-1.0-v2.4.22/mipv6-1.0-v2.4.22.patch


--dry-run 옵션은 패치 명령이 올바르게 수행될 수 있는지를 검사하기만 하는 옵션이다. 에러 메시지가 출력되면 다음을 진행하지 말고 문제를 해결하라.

# patch -p1 < /usr/local/src/mipv6-1.0-v2.4.22/mipv6-1.0-v2.4.22.patch 


  • 현재 설정을 위한 커널트리가 구성 되어졌다. 선호하는 make *config 명령을 수행하라.
MIPv6 관련 옵션은 "Networking Options" 아래에 있다. 다음 옵션들이 ".config" 화일에 존재해야 한다.

CONFIG_EXPERIMENTAL=y 
CONFIG_SYSCTL=y
CONFIG_PROC_FS=y
CONFIG_MODULES=y
CONFIG_NET=y
CONFIG_NETFILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IPV6=m
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_IPV6_TUNNEL=m
CONFIG_IPV6_MOBILITY=m
CONFIG_IPV6_MOBILITY_MN=m
CONFIG_IPV6_MOBILITY_HA=m


MIPL은 아직 진행중인 프로젝트이므로 다음을 활성화하여 문제를 찾는데 도움을 얻을 수 있다.

CONFIG_IPV6_MOBILITY_DEBUG=y


버그를 보고할 때 디버그 메시지를 함께 보내주면 많은 도움이 될 것이다. 옵션이 올바르게 선택되었는지 검사하기 위해서 MIPL tarball에 포함된 작은 스크립트인 chkconf_kernel.sh를 실행할 수 있다.

  • 다음으로 커널을 컴파일하고 설치하라.
힌트: 기존에 사용하던 커널을 패치한 커널과 쉽게 구별할 수 있도록 하기 위해 /usr/src/linux/Makefile의 "EXTRAVERSION"을 수정할 수 있다. (예: -MIPv6-1)

커널을 패치하고 컴파일 하고 설치하는 방법에 대한 자세한 설명을 얻고자 한다면 [http]Linux Kernel HOWTO를 읽어라.

3.2 사용자 툴들 

모듈을 올바르게 작동하도록 하기 위해 사용자 툴인 mipdiag와 config 화일들, init 스크립트들이 설치되어야 한다.

# cd /usr/local/src/mipv6-1.0-v2.4.22
# ./configure
# make && make install

3.3 MIPv6 장치 노드 

MIPv6 모듈은 새로운 장치 노드 엔트리를 필요로 한다. 다음 명령을 수행하여 문자 장치 (Character Device) 를 추가하라.

# mknod /dev/mipv6_dev c 0xf9 0

3.4 자동 시작 

  • Red Hat:
모든 init 스크립트는 해당하는 /etc/rcX.d/ 에 생성되며 /etc/init.d 에 심볼릭 링크들을 추가로 생성한다. 시스템을 시작할 때 MIPv6를 작동하도록 하기 위해 다음 명령을 이용하라.

# chkconfig --add mobile-ip6


시스템을 시작할 때 MIPv6를 작동하지 않도록 하기 위해 다음 명령을 이용할 수 있다.

# chkconfig --del mobile-ip6


  • Debian:
Debian을 선호한다면, 다음 명령을 이용하여 필요한 모든 링크들을 생성할 수 있다.

# update-rc.d -n mobile-ip6 start 75 3 4 5 . stop 05 1 2 6 .


  • Slackware:
Slackware에서는 모든 startup/runlevel 스크립트들이 /etc/rc.d에 들어있다. 'configure'가 "/etc/rc.d"를 검사하지 않으므로 INIT_SLACK="/etc/rc.d" 를 추가한 후 'configure'안의 INITDIRS를 찾아서 INIT_SLACK을 추가하라. Slackware 사용자라면 이미 이 과정이 필요한 것을 알고 있을 것이다. 다음 명령을 이용해 자동 시작을 설정한다.

# echo '/etc/rc.d/mobile-ip6 start' >> /etc/rc.d/rc.local


Makefile을 직접 수정하지 않으면 '/'에 mobile-ipv6 스크립트가 설치되므로 "/etc/rc.d/"로 옮겨 놓으면 된다.

4 실제로 모바일 IPv6 네트워크 만들기 

이제 정상적으로 설치된 MIPL 패치 커널과 사용자 툴들, 부팅할 때 자동으로 모바일 IPv6를 시작할 수 있는 설정이 갖추어져 있다. 만일 아직도 문제를 가지고 있다면 앞 절로 가서 문제를 해결하라.

4.1 네트워크 구성 

본 실험에서는 site-local IPv6 주소를 사용한다. Global 주소도 사용할 수 있지만 link local 주소를 사용하면 모바일 IPv6가 동작하지 않음을 주의하라. 실험을 위한 네트워크는 네 개의 노드로 구성되며, 그림 "Mobile IPv6 testbed"를 보라.

  • HA - Home Agent: 하나의 인터페이스를 가지며, 주소는 fec0:106:2700::2이고
home network에 위치한다.

  • MN - Mobile Node: MN의 주소는 home network에 있을 때 fec0:106:2700::4로 하고
다른 네트워크로 이동하였을 경우에는 새로운 care-of address를 부여 받는다.

  • R-Router: Home network을 인터넷으로 연결해 주는 라우터. 무선 인터페이스의
주소는 fec0:106:2700::1 이고 유선 인터페이스의 주소는 fec0:106:2300::2 이다.

  • AR - Access Router: AR과 R 사이의 링크를 인터넷 구름으로 볼 수 있으나,
실험에서는 크로스 케이블로 직접 연결한다. R과 연결되는 AR의 유선 인터페이스 주소는 fec0:106:2300::1 이며, 무선 인터페이스 주소는 fec0:106:1100::1 이다.

http://wiki.kldp.org/pds/LinuxMobileIPv6/mipv6-testbed.png

Mobile IPv6 testbed

4.2 단계별 설정 


4.2.1 완벽한 IPv6 네트워크 설정 

모바일 IP 실험을 시작하기 전에 완벽한 IPv6 네트워크를 설정해야 한다. 가능한 모든 노드들의 조합이 ping6를 이용해 통신 가능한지 확인 해야 한다. 이 과정은 매우 중요한데, 만일 AR이 HA에게 ping6를 이용한 통신에 실패한다면 모바일 IP 실험에서 어떠한 binding update도 실행되지 않을 것이다.

본 HOWTO에서는 IPv6 네트워크를 구성하고 동작하도록 만들기 위한 간략한 방법만을 제시한다. IPv6 네트워크를 구성하기 위한 더 자세한 설명은 Peter Bieringer의 [http]Linux IPv6 HOWTO를 보라.

본 HOWTO에서는 단순함을 위해 IPv6의 보안기능(encryption)은 고려하지 않지만, 실제 상황에서 무선 네트워크를 이용할 때는 반드시 보안기능을 이용해야만 한다.

또한, 네트워크가 다르면 ESSID도 다르다는 사실을 유념하라.

  • MN: MN은 무선 네트워크 인터페이스 하나를 가지며, 포워딩 기능을 꺼야 하고,
주소 자동 설정과 라우터에서 주기적으로 전송하는 정보 (Router Advertisement) 를 받을 수 있어야 한다(should accept autoconf and ra's):

# iwconfig eth0 mode ad-hoc essid homenet enc off
# ifconfig eth0 inet6 add fec0:106:2700::4/64
# echo "0" > /proc/sys/net/ipv6/conf/eth0/forwarding
# echo "1" > /proc/sys/net/ipv6/conf/eth0/autoconf
# echo "1" > /proc/sys/net/ipv6/conf/eth0/accept_ra
# echo "1" > /proc/sys/net/ipv6/conf/eth0/accept_redirects
# /etc/init.d/mobile-ip6 start


  • HA: HA도 무선 인터페이스 하나를 가지며, 무선 인터페이스를 통해 수신된 패킷을
가상의 터널 인터페이스로 전달하는 과정에서 정상적인 라우팅 기능을 사용하므로 포워딩 기능을 켜 주어야 한다. 주목: HA가 다른 네트워크로 이동한 MN과 통신할 수 있으므로 home network의 default route으로 R을 사용하도록 했다.

# iwconfig eth0 mode ad-hoc essid homenet enc off
# ifconfig eth0 inet6 add fec0:106:2700::2/64
# echo "1" > /proc/sys/net/ipv6/conf/eth0/forwarding
# echo "0" > /proc/sys/net/ipv6/conf/eth0/autoconf
# echo "0" > /proc/sys/net/ipv6/conf/eth0/accept_ra
# echo "0" > /proc/sys/net/ipv6/conf/eth0/accept_redirects
# ip route add ::/0 via fec0:106:2700::1
# /etc/init.d/mobile-ip6 start


  • R: 라우터 R은 무선과 유선 각 하나씩의 인터페이스를 갖는다. R은 포워딩 기능을 켜 주어야
한다.

# ifconfig eth0 inet6 add fec0:106:2300::2/64
# iwconfig eth1 mode ad-hoc essid homenet enc off
# ifconfig eth1 inet6 add fec0:106:2700::1/64
# echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
# echo "0" > /proc/sys/net/ipv6/conf/all/autoconf
# echo "0" > /proc/sys/net/ipv6/conf/all/accept_ra
# echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects
# ip route add fec0:106:1100::/64 via fec0:106:2300::1


  • AR: AR 또한 무선과 유선 각 하나씩의 인터페이스를 가지며, 포워딩 기능을 켜 주어야
한다.

# ifconfig eth0 inet6 add fec0:106:2300::1/64
# iwconfig eth1 mode ad-hoc essid visitnet enc off
# ifconfig eth1 inet6 add fec0:106:1100::1/64
# echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
# echo "0" > /proc/sys/net/ipv6/conf/all/autoconf
# echo "0" > /proc/sys/net/ipv6/conf/all/accept_ra
# echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects
# ip route add fec0:106:2700::/64 via fec0:106:2300::2


proc 변수들을 변경하는 대신에 sysctl을 사용할 수도 있다.

주목: 본 실험 환경은 정적인 경로 설정을 이용한다. 위의 설정이 모두 이루어지면 가능한 모든 호스트들의 조합에 대해 ping6가 가능할 것이다.

4.2.2 모바일 IPv6 설정 

MIPv6 설정은 network-mip6.conf에서 이루어진다. Debian과 slackware는 /etc/에 설정화일이 있고 redhat은 /etc/sysconfig/ 아래에서 설정화일을 찾을 수 있다. 설정화일에는 주석이 잘 첨부되어 있어 설정하기 어렵지 않을 것이다.

  • HA: HA를 설정하기 위한 화일은 다음 내용을 포함해야 한다.
# cat /etc/network-mip6.conf

# Home Agent configuration file
FUNCTIONALITY=ha
DEBUGLEVEL=1
MIN_TUNNEL_NR=1
MAX_TUNNEL_NR=5
TUNNEL_SITELOCAL=yes


  • MN: MN을 설정하기 위한 화일은 다음과 같다.
# cat /etc/network-mip6.conf

# Mobile Node configuration file
FUNCTIONALITY=mn
DEBUGLEVEL=1
TUNNEL_SITELOCAL=yes
MIN_TUNNEL_NR=1
MAX_TUNNEL_NR=3
HOMEDEV=mip6mnha1
HOMEADDRESS=fec0:106:2700::4/64 # MN's home adress
HOMEAGENT=fec0:106:2700::2/64 # HA's address


  • 다음으로 모바일 IP를 시작하라.
# /etc/init.d/mobile-ip6 start
Starting Mobile IPv6: OK


HA가 정상적으로 작동하는지 알아보기 위해 HA에서 ifconfig 명령을 실행시킨다. ip6tnl1과 같은 터널이 하나 이상 생성되었다면 mobile-ipv6가 시작된 것이다.

# ifconfig
eth1 Link encap:Ethernet HWaddr 00:02:2D:2D:DE:79
inet6 addr: fec0:106:2700::2/64 Scope:Site
inet6 addr: fe80::202:2dff:fe2d:de79/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:618 errors:6 dropped:6 overruns:0 frame:6
TX packets:1485 errors:22 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:87914 (85.8 KiB) TX bytes:252596 (246.6 KiB)
Interrupt:3 Base address:0x100

ip6tnl1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 (1)
UP POINTOPOINT RUNNING NOARP MTU:1460 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576 (576.0 b) TX bytes:624 (624.0 b)

ip6tnl2 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 (2)
UP RUNNING NOARP MTU:1460 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 b) TX bytes:560 (560.0 b)


(1) 터널이 활성화 되었으며 연결들을 위한 준비가 갖추어 졌음. (The tunnel is up and ready for connections.)

(2) 또 다른 터널이 준비 상태임.

MN에서는 mipv6 커널 모듈이 올려진 것을 볼 수 있다.

# lsmod
Module Size Used by Not tainted
mip6_mn 59888 0 (unused)
ipv6_tunnel 11448 1 [mip6_mn]
mip6_base 40728 0 [mip6_mn]
ipv6 179764 -1 [mip6_mn ipv6_tunnel mip6_base]
...

4.2.3 AR에서 radvd 설정 

MN이 새로운 네트워크로 이동했을 때, link-local 주소 설정을 시도하고 성공하면 다음 과정을 수행한다. 다음 과정은 [http]RFC2462에 설명되어 있는 내용이다(I'll let RFC2462 (IPv6 Stateless Address Autoconfiguration) describe the next phase) :

"주소 자동 설정의 다음 과정은 Router Advertisement(RA)를 수신하거나 RA를 건내줄 어떠한 라우터도 없는 두 가지 상황에서 시작한다. 라우터가 존재한다면, 호스트에서 어떠한 주소 자동 설정을 수행해야 하는지를 알려주는 RA를 보낼 것이다. 어떠한 라우터도 존재하지 않는다면, 이미 정해진 정보에 의한 주소 설정(stateful autoconfiguration)이 이루어 질 것이다."

"라우터들은 주기적으로 RA들을 전송한다. 그러나 연속한 두 RA간의 지연시간이 노드가 주소를 자동 설정하기 위해 기다릴 수 있는 시간보다 길 것이므로, 빠르게 RA를 얻기 위해서 호스트들은 "all-routers multicast group" 주소로 하나 이상의 "Router Solicitation" 메시지를 보낸다. "

본 절은 [http]RADVD를 사용한다.

"IPv6 Stateless Address Autoconfiguration"에 관한 더 상세한 정보를 얻고자 한다면 [http]RFC2462를 읽어라.

이제 AR의 무선 인터페이스에 RADVD를 설정할 것이다. radvd.conf는 다음을 포함해야만 한다.

# cat /etc/radvd.conf
interface eth1
{
AdvSendAdvert on;
AdvIntervalOpt on;

MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
AdvHomeAgentFlag off;

prefix fec0:106:1100::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};


그리고 나서 radvd를 시작한다.

# /etc/init.d/radvd start


radvd 메시지들이 주기적으로 보내어지고 있는지 확인하기 위해서 radvdump 명령을 이용할 수 있다.

# radvdump
Router advertisement from fe80::202:2dff:fe54:d1b2 (hoplimit 255)
Received by interface eth1
# Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump
AdvCurHopLimit: 64
AdvManagedFlag: off
AdvOtherConfigFlag: off
AdvHomeAgentFlag: off
AdvReachableTime: 0
AdvRetransTimer: 0
Prefix fec0:106:1100::/64
AdvValidLifetime: 2592000
AdvPreferredLifetime: 604800
AdvOnLink: on
AdvAutonomous: on
AdvRouterAddr: off
AdvSourceLLAddress: 00 02 2D 54 D1 B2


주목! HA에서 radvd를 사용하고 proc에서 autoconf를 활성화 했을 때, MN에 직접 설정한 주소 이외에 자동으로 IPv6 주소가 설정되지만 무시해도 된다.(which is superfluous)

4.2.4 HA에서 radvd 설정 

MN이 home network에 있는지를 알 수 있도록 하기 위해, HA도 RA들을 전송해야만 한다. HA의 /etc/radv.conf는 다음과 같다.

# cat /etc/radvd.conf
interface eth0
{
AdvSendAdvert on;
MaxRtrAdvInterval 3;
MinRtrAdvInterval 1;
AdvIntervalOpt off;
AdvHomeAgentFlag on;
HomeAgentLifetime 10000;
HomeAgentPreference 20;
AdvHomeAgentInfo on;
prefix fec0:106:2700::2/64
{
AdvRouterAddr on;
AdvOnLink on;
AdvAutonomous on;
AdvPreferredLifetime 10000;
AdvValidLifetime 12000;
};
};


radvd 메시지들이 전송되고 있는지 확인하기 위해 radvdump 명령을 이용한다.

# radvdump 
Router advertisement from fe80::202:2dff:fe54:d11e (hoplimit 255)
Received by interface eth0
# Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump
AdvCurHopLimit: 64
AdvManagedFlag: off
AdvOtherConfigFlag: off
AdvHomeAgentFlag: on
AdvReachableTime: 0
AdvRetransTimer: 0
Prefix fec0:106:2700::2/64
AdvValidLifetime: 12000
AdvPreferredLifetime: 10000
AdvOnLink: on
AdvAutonomous: on
AdvRouterAddr: on
AdvSourceLLAddress: 00 02 2D 54 D1 1E
AdvHomeAgentInfo:
HomeAgentPreference: 20
HomeAgentLifetime: 1000


# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:7D:F3:03:1A
inet6 addr: fec0:106:2700:0:290:7dff:fef3:31a/64 Scope:Site (1)
inet6 addr: fec0:106:2700::4/64 Scope:Site (2)
inet6 addr: fe80::290:7dff:fef3:31a/64 Scope:Link (3)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:513 errors:89 dropped:89 overruns:0 frame:85
TX packets:140 errors:41 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:56084 (54.7 Kb) TX bytes:19212 (18.7 Kb)
Interrupt:3 Base address:0x100


(1) 새롭게(superfluous) 자동으로 얻어진 주소. /proc/sys/net/ipv6/conf/eth0/autoconf 을 1로 설정하면 MN은 HA의 prefix와 자신의 MAC 주소를 이용해서 새로운 주소를 생성한다. 이 주소가 생기지 않도록 하는 방법은 없는 것 같다.

(2) 직접 설정한 IPv6 주소

(3) 부팅할 때 생성된 link-local 주소

5 모바일 IP 기능 확인 


5.1 준비 

이 절 앞의 모든 설정들이 완료되어야 한다. 특히 home network과 visited network에서 MN이 다른 ESSID 값을 갖도록 해야 한다는 사실이 중요하다.

MN에서 mobile-IPv6를 시작하면 "multicasting router solicitation" 메시지들을 볼 수 있다.

# tcpdump -i eth0 -vv ip6 or proto ipv6

...
13:32:54.681763 fe80::202:a5ff:fe6f:a08a > ff02::2: icmp6: router solicitation \
(src lladdr: 0:2:a5:6f:a0:8a) (len 16, hlim 255)

13:32:55.681763 fe80::202:a5ff:fe6f:a08a > ff02::2: icmp6: router solicitation \
(src lladdr: 0:2:a5:6f:a0:8a) (len 16, hlim 255)

13:32:57.681765 fe80::202:a5ff:fe6f:a08a > ff02::2: icmp6: router solicitation \
(src lladdr: 0:2:a5:6f:a0:8a) (len 16, hlim 255)
...

5.2 이동 감지 

일반적인 이동 감지는 더 이상 양방향 통신이 가능한 default router가 없는 상황을 감지하는 "Neighbor Unreachability Detection"을 통해 이루어진다. 양방향 통신이 가능한 default router가 없어지면, MN은 새로운 default router를 찾아야만 하며, 보통 새로운 네트워크의 default router를 발견한다.

노드 이동중에 무슨 일이 진행되는지를 살펴보기 위해 다음의 명령어들 각각에 대해 터미널을 띄우고 명령을 실행시킨다.

# watch ifconfig eth0
# watch route -A inet6
# tcpdump -i eth0 -vv ip6 or proto ipv6


새로운 네트워크로 이동하는 효과를 주기 위해서 MN에서 다음 명령을 실행하라.

# iwconfig eth1 essid visitnet


MN이 새로운 네트워크로 이동하고 나서 "router solicitation"메시지를 보내므로, 이를 수신한 AR이 있으면 자신의 prefix를 이용해 응답할 것이다. AR로부터 RA를 받은 MN은 수신한 prefix 정보와 자신의 MAC 주소를 이용하여 새로운IPv6 주소를 할당한다. "ifconfig eth0" 명령을 수행하면, 새로운 IPv6 주소를 볼 수 있다.

# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:7D:F3:03:1A
inet6 addr: fec0:106:1100:0:290:7dff:fef3:31a/64 Scope:Site (1)
inet6 addr: fec0:106:2700:0:290:7dff:fef3:31a/64 Scope:Site (2)
inet6 addr: fec0:106:2700::4/64 Scope:Site (3)
inet6 addr: fe80::290:7dff:fef3:31a/64 Scope:Link (4)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:854 errors:154 dropped:154 overruns:0 frame:148
TX packets:293 errors:58 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:96536 (94.2 Kb) TX bytes:44664 (43.6 Kb)
Interrupt:3 Base address:0x100


(1) AR의 prefix와 자신의 MAC주소를 이용해 생성된 새로운 "foreign" 주소

(2) "Superfluous" home network 주소 (참으로 설정된 HA radvd 메시지와 MN의 autoconf 기능에 의해 생성)

(3) 원래 home address

(4) link-local 주소

거의 동시에 MN은 HA와의 binding update를 수행할 것이다. tcpdump를 수행한 창에서 HA로 보내지는 몇 몇 패킷들을 볼 수 있을 것이다. HA가 Binding update가 보내고 MN으로 부터 응답을 받았는지를 확인하기 위해 HA에서 다음 명령을 수행하라.

# mipdiag -s
Mobile IPv6 Statistics
NEncapsulations : 0
NDecapsulations : 0
NBindUpdatesRcvd : 0
NBindAcksRcvd : 1 (1)
NBindNAcksRcvd : 0
NBindRqsRcvd : 0
NBindUpdatesSent : 1 (2)
NBindAcksSent : 0
NBindNAcksSent : 0
NBindRqsSent : 0
NBindUpdatesDropAuth : 0
NBindUpdatesDropInvalid : 0
NBindUpdatesDropMisc : 0
NBindAcksDropAuth : 0
NBindAcksDropInvalid : 0
NBindAcksDropMisc : 0
NBindRqsDropAuth : 0
NBindRqsDropInvalid : 0
NBindRqsDropMisc : 0


(1) binding ACK 하나를 수신

(2) binding UPDATE 하나를 전송

MN에서 binding을 확인하기 위해서는 다음 명령을 이용한다.

# mipdiag -l
Mobile IPv6 Binding update list
Recipient CN: fec0:106:2700::2
BINDING home address: fec0:106:2700::4 care-of address: fec0:106:1100:0:290:7dff:fef3:31a
expires: 936 sequence: 0 state: 1
delay: 3 max delay 32 callback time: 736


HA에서는 -c 옵션을 이용하여 "bindig cache"를 확인할 수 있다.

# mipdiag -c
Mobile IPv6 Binding cache
Home Address Care-of Address Lifetime Type
fec0:106:2700::4 fec0:106:1100:0:290:7dff:fef3:31a 971 2

5.3 ping6 

MN에서 AR의 eth1(fec0:106:1100::1)로 ping6를 시도해 보자.

# ping6 fec0:106:1100::1
PING fec0:106:1100::1(fec0:106:1100::1) from fec0:106:2700::4 : 56 data bytes
64 bytes from fec0:106:1100::1: icmp_seq=1 ttl=62 time=8.01 ms
64 bytes from fec0:106:1100::1: icmp_seq=2 ttl=62 time=8.02 ms
...


tcpdump를 이용해 패킷들이 어떻게 이동하는지를 확인할 수 있다.

12:13:51.789688 fec0:106:1100:0:202:a5ff:fe6f:a08a > fec0:106:2700::2: \   (1) 
fec0:106:2700::4 > fec0:106:1100::1: icmp6: echo request \ (2)
(len 64, hlim 64) (len 104, hlim 255)

12:13:51.797675 fec0:106:2700::2 > fec0:106:1100:0:202:a5ff:fe6f:a08a: \ (3)
fec0:106:1100::1 > fec0:106:2700::4: icmp6: echo reply \
(len 64, hlim 62) (len 104, hlim 253)


(1) MN의 새로운 IPv6 주소를 가지고 MN에서 HA로 이동하는 패킷

(2) HA로 부터 AR로 이동

(3) AR이 HA에게 응답하고 패킷을 MN에게 터널링한다.

MN에서 다음과 같은 통계 결과를 확인할 수 있다.

# mipdiag -s
Mobile IPv6 Statistics
NEncapsulations : 56
NDecapsulations : 25
...

5.4 커널 IP 라우팅 테이블 

MIPv6의 역할중 재미있는(?) 한가지는 default route를 터널로 변경하는 것이다. 새로운 default route가 다음과 같을 것이다.

# route -A inet6
Kernel IPv6 routing table
Destination Next Hop Flags Metric Ref Use Iface
::/0 :: UD 64 0 0 ip6tnl1
....


만일 default route이 변경되지 않았다면 수동으로 추가하라.

# ip route ::/0 via dev ip6tnl

5.5 몇몇 다른 서브넷으로 이동해 보기 

셋 이상의 네트워크를 이동하는 상황도 두 개의 네트워크 사이에서의 이동과 다르지 않다. 유념해야 할 사항은 MN이 모든 방문한 네트워크마다 새로운 주소를 할당한다는 사실이다.

http://wiki.kldp.org/pds/LinuxMobileIPv6/lanvisits.png

몇몇 다른 네트워크 사이를 이동하는 MN

  • 이전의 상황처럼 home network에서 'visitnet'을 방문한다.
  • MN이 'visitnet'에서 'visitnet2'로 이동하고 있다.
  • 'visitnet2'에서 MN은 새로운 IPv6 주소를 할당하고 HA에 새로운 'binding update'를
수행한다.

  • MN이 다시 home network으로 돌아온다. (다음 절을 보라.)
'visitnet2'에서의 AR은 'visitnet'에서의 AR의 구성과 같으나 주소만 다르게 구성한다. (prefix를 fec0:106:1100::/64에서 fec0:106:1000::/64로 변경하고 인터넷으로 연결하는 유선 인터페이스의 주소를 겹치지 않도록 한다.)

MN이 'visitnet'에서 'visitnet2'로 이동하는 효과를 주기 위해 MN에서 다음 명령을 수행하라.

# iwconfig eth0 essid visitnet2


MN이 'visitnet2'로 이동한 후 할당된 주소들을 다음 명령으로 확인할 수 있다.

# ifconfig eth0
eth1 Link encap:Ethernet HWaddr 00:90:7D:F3:03:1A
inet6 addr: fec0:106:1000:0:290:7dff:fef3:31a/64 Scope:Site (1)
inet6 addr: fec0:106:1100:0:290:7dff:fef3:31a/64 Scope:Site
inet6 addr: fec0:106:2700:0:290:7dff:fef3:31a/64 Scope:Site
inet6 addr: fec0:106:2700::4/64 Scope:Site
inet6 addr: fe80::290:7dff:fef3:31a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1073 errors:212 dropped:212 overruns:0 frame:204
TX packets:371 errors:72 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:120340 (117.5 Kb) TX bytes:56912 (55.5 Kb)
Interrupt:3 Base address:0x100


(1) 'visitnet2'에서 새로 할당된 주소

주목! MN이 새로운 네트워크로 이동했을 때, mobile-ipv6를 다시 시작해야 할지도 모른다.

# /etc/init.d/mobile-ip6 restart
Stopping Mobile IPv6: OK
Starting Mobile IPv6: OK


MN이 새로운 'binding update'를 수행한 후, 새로운 'care-of address'를 부여 받는다.

# mipdiag -l
Mobile IPv6 Binding update list
Recipient CN: fec0:106:2700::2
BINDING home address: fec0:106:2700::4 care-of address: fec0:106:1000:0:290:7dff:fef3:31a
expires: 973 sequence: 14 state: 1
delay: 3 max delay 32 callback time: 773


HA에서 갱신된 'binding cache'를 볼 수 있다.

# mipdiag -c
Mobile IPv6 Binding cache
Home Address Care-of Address Lifetime Type
fec0:106:2700::4 fec0:106:1000:0:290:7dff:fef3:31a 943 2

5.6 home으로 돌아오기 

MN을 home network로 돌아오는 효과를 주기 위해 다음 명령을 수행하라.

# iwconfig eth0 essid homenet


HA에서 HA-bit(AdvHomeAgentFlage)을 설정해서 radvd 메시지들을 보내고 있으므로(4.2.4절을 보라) MN은 자신이 home network으로 돌아온 것을 알 수 있다.

또한, HA의 'binding cache'에 어떠한 정보도 남아 있지 않은 것을 확인함으로서 MN이 home network에 온 것을 알 수 있다.

Mobile IPv6 Binding cache
Home Address Care-of Address Lifetime Type

5.7 실시간 응용 실험 - 부드러운 핸드오버 

모바일 IP가 어떻게 작동하는지를 생동감 있게 느끼기 위해 'GnomeMeeting'을 실행하고 'netmeeting'을 시작하라. 주목! IPv6를 지원하도록 하기 위해 가장 최신의 GnomeMeeting을 사용해야만 한다! 그리고 나서 네트워크들 사이를 이동하라. 아마도 미팅이 끊김없이 자연스럽게 이루어지는 것을 볼 수 있을 것이다.

http://wiki.kldp.org/pds/LinuxMobileIPv6/gnomemeeting1.png

두 무선 네트워크 사이의 로밍을 실험하기 위한 IPv6 지원 GnomeMeeting

6 자주 하는 질문 

  • Q: 왜 '/dev/mipv6_dev'를 만들어야 하나요?
A: 장치화일을 통한 ioctl 명령을 이용해서 mipdiag 사용자 툴이 kernel의 내부 변수들을 변경할 수 있다. mknod 명령을 이용해 mobile-ipv6 모듈에서 인식할 수 파라메터들을 포함한 특수 장치 화일을 생성한다.

  • Q: kernel 2.6.x도 지원하나요?
A: MIPL 메일링 리스트에서 [[http]http://www.mobile-ipv6.org/pipermail/mipl/2003-December/001871.html Henrik Petander의 답변]을 참고하라.

"다음에 2.6 kernel들을 위한 MIPL 구현의 짧은 정리를 제공한다."

"MIPL 프로젝트는 USAGI 프로젝트와의 협력으로 Mobile IPv6를 위한 커널의 기초를 완성했다. 그 내용은 경로 최적화와 터널링, 정책을 적용할 수 있는 경로 설정이다."

"MIPv6의 시그널링을 처리하고 커널 부분의 동작을 제어하는 사용자 데몬을 작성하고 있으며, 잘 진행되고 있으나, 프로토콜을 어떻게 설계해야 할지가 아직 미지수이다. 그래서 아직 사용자들이 테스트 해 볼 수 있는 수준에는 이르지 못했다. 3월 말까지는 마무리할 계획이다."

  • Q: MIPL이 IPSec을 지원하나요?
A: 2.4.x 커널에서는 지원하지 않으나, 2.6.x 커널을 위한 MIPL은 지원할 계획이다. 다른 곳에서 구현한 IPSec을 이용할 수도 있다.

  • Q: MN과 CN 사이의 통신에 사용되는 라우팅 유형(HA와의 터널링 또는 직접 통신)
을 선택하는 방법은 무엇인가요?

A: /proc/sys/conf/net/ipv6/mobility/accept_return_routability 를 이용하라.

'return routability' 와 경로 최적화를 사용하지 않으려면, 0으로 설정하라.

# echo 0 > /proc/sys/..../accept_return_routability

이렇게 하면 MN을 HA와의 터널링을 통해 CN과 통신할 것이다.

  • Q: 다른 무선 네트워크들이 다른 ESSID와 WEP 키를 가질 수 있나요?
A: 물론입니다. MIPL의 MIPv6는 자동으로 ESSID를 바꾸지 않으므로 새로운 네트워크에 도착했을 때 수동으로 ESSID와 WEP 키를 바꾸어 주어야 합니다.

  • Q: MN이 여러 다른 네트워크들을 방문하고 다시 home network으로 돌아올 때,
인테페이스에 모든 방문한 네트워크에서 설정된 IPv6주소를 유지합니다. 불필요한 주소들이 자동으로 지워지도록 하는 방법 없나요?

A: 주소들을 자동으로 제거하는 방법을 알지 못합니다. 그러나, 수동으로 지우면 됩니다.:

<b># ifconfig eth0 inet6 del <ipv6-address> </b>

  • Q: Host B has two interfaces with two different subnets assigned.
When I ping B from host A, it does not answer! Why not? Host A knows where host B (subnets) are!

A: The host B doesn't know where host A is (B doesn't know where A's net is), so you must add a route entry:

# ip route add fec0:106:2700::/64 via fec0:106:2300::1

or

# route -A inet6 add fec0:106:2700::/64 gw fec0:106:2300::1 dev eth0

  • Q: IPv6에서 default gateway를 설정하는 방법은?
A: route 명령을 이용하면

<b># route -A inet6 add default gw <ipv6-host> </b>

ip 명령을 이용하면

<b># ip route ::/0 via <ipv6-host> </b>

  • Q: 호스트가 'router solicitation' 메시지를 보낼 때, anycast 주소가 아닌 multcast
주소를 사용하는 이유는?

A: 호스트에서 임의의 한 라우터보다는 이웃의 모든 라우터로부터 응답을 받기 원하기 때문이다. 가능한 모든 정보를 수집해서 최상의 default router를 발견할 수 있는 장점이 있다.

  • Q: MN이 다른 네트워크로 이동한 사실을 자동적으로 알지 못하는 이유는?
A: Router Advertisement의 lifetime이 너무 길이 때문에, MN이 다른 네트워크로 이동했는데도 불구하고 MN은 아직도 이전 라우터와 통신할 수 있다고 생각한다. 라우터에서 Router Advertisement를 보내는 프로그램의 설정화일을 보라. 거기에 RA를 전송하는 간격을 조절하는 기능이 있다면, 그 설정을 켬으로서 MN의 이동 감지를 도울 수 있다. 더 자세한 설명을 위해 man radvd.conf 를 보라

7 유용한 자원들 

댓글 없음:

댓글 쓰기