<< Back to man.ChinaUnix.net

 

 

 

 

 

 

 

Linux下移动IPv6实现指南

 

 

 

Lars Strand lars@unik.no

 

 

 

 

2003730

 

 

 

 

 

 

内容

1 介绍.... 2

1.1          移动IP的概念... 2

1.2          为何使用移动IP... 2

1.3          工作机制... 2

2     IPv6. 2

3    Linux下的MIPv6实现.... 3

3.1          给内核打补丁... 3

3.2          用户空间工具... 4

3.3          MIPv6设备节点... 4

3.4          自动启动... 5

4     实验床... 5

4.1          实验场景... 5

4.2          配置过程详解... 5

4.2.1       搭建功能完备的IPv6网络... 5

4.2.2       配置移动IPv6. 6

4.2.3       AR上配置radvd. 8

4.2.4       HA上配置radvd. 9

5     若干实验... 11

5.1          预测试... 11

5.2          移动检测... 11

5.3          ping6. 13

5.4          内核IP路由表... 13

5.5          移动时经过数个外地LAN.. 14

5.6          返回家乡网络... 15

5.7          实时测试-平滑切换... 15

6     FAQ.. 15

7     有用资源... 16

8     版权、致谢与其它... 17

8.1          版权与许可... 17

8.2          该文档如何产生... 17

8.3          反馈... 17

8.4          致谢... 17

 

 

 

 

 

1 介绍

本文档描述了在Linux平台下的软件和建立与使用移动IPv6的步骤。draft-ieft.mipv6-ipv6回答了移动IP的概念与使用它的原因。

1.1    移动IP的概念

    每个移动节点总是由其家乡地址识别,而于其当前接入Internet位置无关。当离开家乡链路时,移动节点也与一个转交地址相关联,该转交地址包含了移动节点当前位置的信息。寻址到移动节点家乡地址的IPv6报文分组经过其家乡代理(HA)被透明的路由到其转交地址。该协议使IPv6节点能够缓存移动节点家乡地址和其转交地址的绑定,然后在直接发送目的为移动节点的所有报文分组到该转交地址。

1.2   为何使用移动IP

若在IPv6中没有对移动性的特定支持,因为路由是根据报文分组目的IP地址中的子网前缀进行路由,则当移动节点离开其家乡链路(其家乡IPv6子网前缀使用的链路)时,发送给移动节点(主机或路由器)的报文分组不能够到达。为保证移动情况下的持续通信,移动节点在每次移动到一个新链路时都能改变其IP地址,但移动节点在改变位置时就无法保持传输层和更高层的连接。因为移动计算机在IPv6部署期间可能占Internet上通信设备的大多数或起码是可观比例,所以IPv6移动性支持尤为重要。

全部细节,参见移动IPv6移动性支持RFC3775)(见“资源”部分)。

1.3   工作机制

 

1:移动IP

 

1.       移动节点(MN)到达外地网络并得到一个新转交地址。

2.       MN执行与其家乡代理(HA)的绑定更新(新转交地址在HA那里注册)。HA发送一条绑定确认给MN

3.       通信对端(CR)要联系MNHA截获目的是MN的报文分组。

4.       然后HA使用MN的转交地址从CR通过隧道发送所有报文分组到MN

5.       MN应答CR时,它可以使用其当前的转交地址(执行与CR的绑定)并与CR直接通信(优化路由)或者通过隧道经过HA传输所有报文分组。

解释如图1所示意。

2       IPv6

IP版本6IPv6)是一个新版本的Internet协议,作为IP版本4IPv4[RFC-791]的后续版本而设计。IPv6IPv4相比主要有以下变化:

  扩展的寻址功能

  首部格式简化

  对扩展与选项的改善支持

  流标签功能

  认证与保密功能

  为充分理解MIPv6的工作原理,您应当对IPv6无状态自动配置有基本了解。您可对RFC2462中的IPv6无状态地址自动配置进行研究。

  通常需了解IPv6更多信息,请访问IPv6工作组(IETF)网站-见链接的资源部分。

3         Linux下的MIPv6实现

目前有两个可用的Linux下移动IPv6实现的版本。英国的兰开夏大学有最早(?)的实现(http://www.c8-ipv6.lancs.ac.uk/MobileIP/)。所支持的最新内核版本为2.1.90,与IETF移动IPv6草案第五版(目前是第24版)相兼容。代码与站点从1998开始就一直未更新,因此它被认为是过时的。

另外一个不断更新的实现由HUT(赫尔辛基技术大学)开发。所支持的最新内核版本是2.6.8.1。需要文档与软件请访问http://www.mipl.mediapoli.com/或浏览邮件压缩文档。

3.1   给内核打补丁

HUT MIPv6需要内核补丁。该实现对IPv6内核栈作了修改,因此需要重新编译内核。实现软件包中有很好的安装过程帮助文档,但我会给出一个简要的指南。

请注意!MNHA不再需要两个不同的内核。只需对一个内核进行编译以提供对MNHA的支持。不可能同时作为MNHA运行;而是根据所加载的模块来进行选择。

1.       http://www.mobile-ipv6.org下载最新的Linux MIPv6源代码。目前最新发布的版本是:mipv6-2.0-rc2-linux-2.6.8.1。考虑到稳定性问题,我们使用mipv6-1.1-v2.4.26。最后4个数字对应于应使用补丁的Linux内核版本。

# cd /usr/local/src

# wget http://www.mobile-ipv6.org/download/mipv6-1.1-v2.4.26.tar.gz

# tar zxfv mipv6-1.1-v2.4.26.tar.gz

 

2.ftp.kernel.org 下载并解压对应的Linux内核版本:

# cd /usr/src

# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2

# tar jxvf linux-2.4.26.tar.bz2

# ln -s linux-2.4.26 linux

# cd linux

3.应用MIPv6补丁:

# patch -p1 --dry-run < /usr/local/src/mipv6-1.1-v2.4.26/mipv6-1.1-v2.4.26.patch

--dry-run检查补丁能否正确应用。若返回任何错误结果,则不应继续进行。若一切正常,则

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

4.删除源代码中残留的.o文件以及其它从属文件。

#make mrproper

5.现在开始对内核树进行配置。运行make menuconfigMIPv6选项在“Networking Options”内。以下选项应当出现。

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

使用调试信息,更易于发现问题所在。调试信息也非常有助于报告bug

为确保开启了所有正确选项,您可运行包含在MIPL中的一个小的shell脚本:chkconf_kernel.sh

 

6.接下来您应当编译并安装内核。

提示:为更容易的将该内核与其它内核相区分,您可以改变/usr/src/linux/Makefile中的"EXTRAVERSION"变量,比如"-MIPv6-1"

#make dep

#make bzImage

#make clean

#make modules

#make modules_install //生成了/lib/modules/2.4.26

7.把bzImage复制到boot目录并在/boot下生成 initrd img文件:

#cp /usr/src/linux/arch/i386/boot/bzImage /boot

#cd /boot

#mkinitrd initrd-2.4.26.img 2.4.26

8.修改grub设置:

#vi /etc/grub.conf

添加以下几行:

title Red Hat Linux (test)

root (hd0,2)

kernel /boot/bzImage ro root=/dev/hda3(根据实际情况)

initrd /boot/initrd-2.4.26.img

 

3.2   用户空间工具

用户空间工具mipdiag,配置文件和初始化脚本必须作为模块安装才能正确运行:

# cd /usr/local/src/mipv6-1.1-v2.4.26

# ./configure

# make && make install

3.3   MIPv6设备节点

MIPv6模块也需要一个新的设备节点表项。执行命令:

# mknod /dev/mipv6_dev c 0xf9 0

3.4   自动启动

1.       Red Hat:

所有初始化脚本都位于/etc/init.d/,它们符号链接到正确的运行级(/etc/rcX.d/),您可执行命令:

# chkconfig --add mobile-ip6

以使MIPv6随系统启动,或

# chkconfig --del mobile-ip6

使MIPv6不随系统启动。

4       实验床

现在您应该有了一个打上MIPL补丁的可正常运行的内核,安装了用户级工具并启用了引导时的自动启动。若出现任何错误,仔细对照以上各部分。

4.1   实验场景

我们在实验床中使用站点本地地址。您也可使用全球地址,但一定要注意链路本地地址无效!实验床包含4个节点;见图“移动IPv6实验床”。

1.HA-家乡代理:HA位于家乡网络,地址为fec0:106:2700::2,有一个无线网络网卡。

2.       MN-移动节点:MN在“家乡网络”时,其地址为fec0:106:2700::4。当MN移动到另一个网络时,它获得一个新的“转交”地址。

3.R-Router这是位于家乡网络和Internet之间的路由器。它有一个无线网卡,地址为fec0:106:2700::1和一个有线网卡,地址为fec0:106:2300::2

4.AR-Access Router:ARR之间的链路是我们的“internet-但在该实验场景中只是一根网线(可以是任何网络)。AR有两个网卡;有线网卡地址为fec0:106:2300::1,无线网卡地址为fec0:106:1100::1

 

移动IPv6实验床

4.2   配置过程详解

4.2.1               搭建功能完备的IPv6网络

在我们开始测试移动IP以前,需要一个功能完备的IPv6网络。所有节点之间应能相互ping通。这是关键部分。比如,若AR无法pingHA,就没有绑定更新。

我会给出搭建网络的方法和使用IPv6运行的简单步骤。搭建IPv6网络的更多信息,参见Peter BieringerLinux IPv6 HOWTO

为简单起见,我禁用了加密功能-注意:在与无线网络打交道时,您应总使用加密!
也请注意不同的无线网络有不同的ESSID

1.MN:移动节点有一个无线网卡。应禁用转发功能,但应接受自动配置与路由广播:

# 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

2.HA家乡代理有一个无线网卡。应启用转发,因为它使用正常路由来将截获的报文分组从物理网卡发送到虚拟隧道网卡。注意:必须添加缺省路由,否则在与位于外地LAN上的MN通信时会出现问题。一个可能的解决方法是使用HA作为家乡网络的缺省路由。

# 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

3.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

4.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

注意:我们在实验床设置了静态路由。所有主机之间应该都可以相互ping通。

4.2.2               配置移动IPv6

MIPv6设置中最后要在network-mip6.conf中进行配置。RedHat系统中,该文件位于/etc/sysconfig/。该文件内容应非常容易理解。

1.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

2.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

3.接着,启动移动IP

# /etc/init.d/mobile-ip6 start

Starting Mobile IPv6: OK

您通过在HA上执行ifconfig命令来验证其是否启动。若建立了隧道,ip6tnl1,则启动了移动ip6

# 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

          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

          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)

①隧道建立,准备连接。

②另外一条隧道就绪。

您也会看到mipv6模块被加载(MN)。

# 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来到一个新网络时,它进行链路本地地址配置,若成功则进入下一阶段。[RFC2462]IPv6无状态地址自动配置)描述了下一阶段:

“自动配置的下一阶段包括获得一条路由广播或确定没有路由器的存在。若存在路由器,则它们会发送具体规定主机应进行何种自动配置的路由器广播。若路由器不存在,则应当触发有状态自动配置。”

“路由器定期发送路由器广播,但连续广播之间的延迟通常比执行自动配置的主机愿意等待的时间更长。为快速获得一条广播,主机向全路由器组播组发送一条或多条路由器请求”。—第8页。

这是我们使用RADVD所在。

IPv6无状态地址自动配置相关的更多细节请阅读[RFC2462]

我们在AR的无线网卡上配置RADVDradvd.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;

};

};

然后我们启动它:

# /etc/init.d/radvd start

您现在应可使用radvdump命令来确定所有radvd报文都正确的定期发送:

# 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并启用“autoconf”(在proc中)时,除静态地址以外,您也会在MN上得到一个自动生成的IPv6地址:

4.2.4               HA上配置radvd

为使MN能知道其位于家乡网络,HA也应发出RA。因此我们应该也在HA上启用RADVD/etc/radvd.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;

};

};

也应在HA上执行radvdump命令以检查是否发送了radvd报文:

# 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

          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: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

  一个新的(多余的)自动生成的地址。因为我们在/proc/sys/net/ipv6/conf/eth0/autoconf中设置autoconf1,所以MN会产生一个由HA的前缀和其MAC地址组合成的新的地址。我不认为能避免这个地址的产生。

  原始静态IPv6地址。

  引导时生成的链路本地地址。

5       若干实验

5.1   预测试

如上进行每项配置;家乡网络与所访问网络具有不同的ESSID尤为重要。

当您在MN上启动移动IPv6时,您会看到组播路由器请求报文:

# 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   移动检测

通常情况下移动检测采用邻居不可达性检测来在缺省路由器不在双向可达时进行检测。此时,移动节点必须发现一台缺省路由器(通常位于新链路上)。

为便于了解所发生的情况,您应为每条命令使用一个xterm窗口:

# watch ifconfig eth0

# watch route -A inet6

# tcpdump -i eth0 -vv ip6 or proto ipv6

为“移动”到另一个网络,您可在MN上执行以下命令:

# iwconfig eth1 essid visitnet

MN位于另一个无线网络,因为它发送出了“路由器请求”(组播),AR将使用其前缀进行响应。然后MN会使用所接收到的前缀和其MAC地址来进行自身配置。若您输入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

          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: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

   组合AR的前缀与MAC地址所生成的新的“外地”地址

   多余的家乡网络地址(因为HA radvd报文与MN autoconf设置为“true”)。

   “原始”(家乡)地址

   引导时生成的链路本地地址

几乎同时,MN会执行与HA的绑定更新。在tcpduom窗口中,您会看到几个报文分组发送到HA。为对绑定更新已发送以及来自MN的确认进行验证:

# mipdiag -s

      Mobile IPv6 Statistics

      NEncapsulations           : 0

      NDecapsulations           : 0

      NBindUpdatesRcvd          : 0

      NBindAcksRcvd             : 1   

      NBindNAcksRcvd            : 0

      NBindRqsRcvd              : 0

      NBindUpdatesSent          : 1   

      NBindAcksSent             : 0

      NBindNAcksSent            : 0

      NBindRqsSent              : 0

      NBindUpdatesDropAuth      : 0

      NBindUpdatesDropInvalid   : 0

      NBindUpdatesDropMisc      : 0

      NBindAcksDropAuth         : 0

      NBindAcksDropInvalid      : 0

      NBindAcksDropMisc         : 0

      NBindRqsDropAuth          : 0

      NBindRqsDropInvalid       : 0

      NBindRqsDropMisc          : 0

  接受到一条绑定ACK报文。

  发送一条绑定UPDATE报文。

您也可用以下命令对绑定进行验证(在MN上):

# 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上用statistics选项(-s)和“binding cache”(-c)选项对其进行验证:

 

     # 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 ping AReth1fec0:106:1100::1):

# 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: \ 

     fec0:106:2700::4 > fec0:106:1100::1: icmp6: echo request \

     (len 64, hlim 64) (len 104, hlim 255)

 

     12:13:51.797675 fec0:106:2700::2 > fec0:106:1100:0:202:a5ff:fe6f:a08a: \

     fec0:106:1100::1 > fec0:106:2700::4: icmp6: echo reply \

     (len 64, hlim 62) (len 104, hlim 253)

   报文分组首先使用MN的新IPv6地址从MNHA

   接着从HAAR

   然后ARHA进行响应并将报文分组通过隧道传输给MN

现在可看到更新后的统计结果(MN上的):

# mipdiag -s

Mobile IPv6 Statistics

NEncapsulations           : 56

NDecapsulations           : 25

...

5.4   内核IP路由表

MIPv6所做的一件有意思的事情是改变到隧道的缺省路由。新的缺省路由成为:

# route -A inet6

Kernel IPv6 routing table

Destination      Next Hop       Flags Metric Ref    Use Iface

::/0             ::             UD    64     0        0 ip6tnl1

....

若这样没有添加缺省路由,则可手动进行添加:

# ip route ::/0 via dev ip6tnl

5.5   移动时经过数个外地LAN

移动到数个所访问的网络,与移动到一个网络完全相同。您所必考虑的唯一一点是将为每个所访问的网络生成新地址。

 

MN移动经过数个不同的LAN

1.MN先访问'visitnet',我们前面已经实现。

2.接着MN'visitnet' t移动到'visitnet2'

3.'visitnet2'时,MN生成一个新IPv6地址并向HA发送一条新的绑定更新。

4.然后MN返回家乡网络(见下一部分)。

除使用地址fec0:106:1000::/6代替fec0:106:1100::/64之外,位于"visitnet2"AR被配置为另一个AR(位于"visitnet")。

  执行以下命令(在MN上),使移动节点从'visitnet'移动到'visitnet2'

# iwconfig eth0 essid visitnet2

    

 

然后您会看到MN配置自身到新网络:

 

 

    # 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

          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

'visitnet2'的新的自动配置的地址。
注意!当到达一个新网络时,您可能要在MN上重新启动移动ipv6

# /etc/init.d/mobile-ip6 restart

Stopping Mobile IPv6: OK

Starting Mobile IPv6: OK

MN会向HA发送一条新绑定更新。注意新的“转交地址”:

# 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上的“绑定缓存”已经更新:

    # 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   返回家乡网络

您可以执行以下命令使MN返回家乡网络:

# iwconfig eth0 essid homenet

因为HA使用设置了HA-位(AdvHomeAgentFlag)发送出了radvd报文,所以MN就知道其返回了家乡网络,见4.2.4节。

因为HA的绑定缓存信息已经清除(空的),所以您可看到MN“返回了家乡网络”:

Mobile IPv6 Binding cache

Home Address      Care-of Address                     Lifetime  Type

5.7   实时测试-平滑切换

为获得对移动IP机制的生动体验,启动GnomeMeeting程序。注意!您必须使用最新的GnomeMeeting以获得对IPv6的支持!然后进行“移动”,您可看到几乎平滑的切换。

使用提供IPv6支持的GnomeMeeting测试两个无线网络之间的漫游情况。

6       FAQ

1.问:为何必须创建/dev/mipv6_dev表项?

  答:dev文件主要是为了用户空间工具、mipdiag能够通过设备文件使用ioctl调用对内核参数进行修改。mknod使用移动ip6模块可识别的参数创建了特殊的设备文件。

2. 问:有任何对内核2.6.x支持吗?

  答:这是MIPL邮件列表上Henrik Petander的回答

   “这是对MIPL 2.6内核系列状态的简要概述:”

“我们已与USAGI计划组合作完成了移动IPv6的内核基础设施。基础设施实现了路由优化、隧道与策略路由。”

“现在我们正在对用户空间daemon进行开发,它负责处理MIPv6信令并对内核部分的运行进行控制。用户空间部分的进展也相当顺利。但是,仍缺乏协议逻辑性,因此实际上还没有可供用户进行测试的部分。我们应该在三月底准备好功能正常,可供测试的原型。”

3. 问:MIPL是否支持IPsec

  答:2.4.x不支持IPsec2.6系列的MIPL一开始就会支持IPsec。您可使用第三方的IPsec实现。

4. 问:我怎样能控制用于MNCN之间通信的路由的类型(通过HA的隧道或使用绑定更新/确认的直接通信)?

  答:您可采用以下方法实现控制:

/proc/sys/conf/net/ipv6/mobility/accept_return_routability

若您不想使用返回路由可达性与路由优化,就设置其为0

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

MN会仅通过家乡隧道与CN进行通信。

5. 问:不同的无线网络能否使用不同的ESSID/WEP密钥?

  答:可以,但您必须在到达新网络时进行改变。MIPv6无法自动这么做。

 

6. 问:如果MN已移动经过几个所访问的LAN,然后返回家乡网络;网卡还是有来自所有所访问网络的自动生成的IPv6地址!有任何方法能够“清空/删除”这些地址吗?

  答:不,我不知道任何能够自动删除这些地址的方法,但您可以手动删除:

# ifconfig eth0 inet6 del <ipv6-address>

7. 问:主机B有两块网卡,分配了两个不同的子网。当我在主机ApingB时,没有任何响应!为什么?主机A知道主机B(子网)的位置!

  答:主机B不知道主机A的位置(B不知道A所在网络的位置),因此您必须添加一条路由表项:

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

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

 

8. 问:在IPv6中如何设置缺省网关?

  答:使用传统“路由”:

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

或更加新的 "ip" 命令:

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

9. 问:为何主机在要求路由器请求时,发送组播地址而不是任播地址?

  答:因为主机需要从所有而不仅仅是任何一台路由器得到答案。这样就能获得所有参数并选择最“佳”的缺省路由器。

10. 问:为何MN没注意到它已经移动了?

  答:它认为以前的路由器仍然可达。可能是路由器广播的很长寿命导致的。检查路由器上发送路由器广播的程序的配置。若程序支持路由器广播间隔配置,则您可通过设置间隔使用为on来帮助MN进行移动检测。细节见man radvd.conf的执行结果。

7       有用资源

1.Linux下移动IPv6实现http://www.mipl.mediapoli.com/

2.移动IP工作组(IETFhttp://www.ietf.org/html.charters/mobileip-charter.html

3.移动IPv6移动性支持(RFC3775http://www.ietf.org/rfc/rfc3775.txt

4. IPv6工作组 (IETF) http://www.ietf.org/html.charters/ipv6-charter.html

5. RFC2460 Internet协议,第6版(IPv6)规范http://www.ietf.org/rfc/rfc2460.txt

6. RFC2461 IP 6(IPv6)邻居发现http://www.ietf.org/rfc/rfc2461.txt

7. RFC2462 IPv6 Stateless Address Autoconfiguration http://www.ietf.org/rfc/rfc2462.txt

8. Peter BieringerLinux IPv6 指南(英文) http://ldp.linux.no/HOWTO/Linux+IPv6-HOWTO/

9. IPv6目前对网络用程序支持情况http://www.deepspace6.net/docs/ipv6_status_page_apps.html

10. linux内核编译手记http://www.20cn.net/ns/cn/zs/data/20030317231808.htm

8       版权、致谢与其它

8.1   版权与许可

8.2   该文档如何产生

8.3   反馈

8.4   致谢