现在你应该已经拥有一个可以工作的 MIPL 补丁内核,安装了用户级工具,并在启动时启用了自动启动。如果出现任何问题,请仔细检查以上章节。
我们在测试平台中使用的地址是站点本地地址。你也可以使用全局地址,但请注意,链路本地地址将无法工作! 我们的测试平台由四个节点组成;请参见图 “Mobile IPv6 测试平台”。
HA - 家乡代理: HA 位于家乡网络,地址为fec0:106:2700::2,带有一个无线接口。
MN - 移动节点: 当 MN 位于“家乡网络”时,它的地址为fec0:106:2700::4。当 MN 移动到另一个网络时,它会生成一个新的“转交”地址。
R - 路由器: 这是从家乡网络到互联网的路由器。它有一个无线接口,地址为fec0:106:2700::1和一个有线接口,地址为fec0:106:2300::2.
AR - 接入路由器: AR 和 R 之间的链路是我们的“互联网” - 但在本测试用例中仅为交叉电缆(可以是任何网络)。AR 有两个接口;连接到 R 的有线接口的地址为fec0:106:2300::1,无线接口的地址为fec0:106:1100::1.
Mobile IPv6 测试平台
在我们开始测试移动 IP 之前,我们需要一个完全可用的 IPv6 网络。所有节点都应该能够互相 ping 通。这是至关重要的部分。 例如,如果 AR 无法 ping 通 HA,则不会有绑定更新。
我将简要介绍如何使用 IPv6 启动并运行我们的网络。有关设置 IPv6 网络的更多信息,你可以阅读 Peter Bieringer 的优秀 Linux IPv6 HOWTO。
为了简单起见,我关闭了加密 - 请注意,在处理无线网络时,应始终使用加密!
另请注意,不同的无线网络具有不同的 ESSID!
MN: 移动节点有一个无线接口。应关闭转发,但应接受 autoconf 和 ra
# 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 在访问的 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 |
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: 接入路由器(在外部网络上)也有两个接口;一个无线和一个有线。必须启用转发。
# 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 |
你可以使用 sysctl 而不是修改 proc 变量。
注意:我们在测试平台上设置静态路由。现在你应该能够从每台主机 ping 通所有主机。
最后的配置是 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 |
接下来,启动 mobile-IP
# /etc/init.d/mobile-ip6 start Starting Mobile IPv6: OK |
你可以通过执行ifconfig在 HA 上验证它是否已启动。如果隧道启动,ip6tnl1,则 mobile-ip6 已启动
你还将看到 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] ... |
当 MN 进入新网络时,它会执行链路本地地址配置,如果成功,则进入下一阶段。我将让 [RFC2462] (IPv6 无状态地址自动配置) 描述下一阶段
“自动配置的下一阶段涉及获取路由器通告或确定没有路由器存在。如果路由器存在,它们将发送路由器通告,指定主机应执行哪种类型的自动配置。如果不存在路由器,则应调用有状态自动配置。”
“路由器定期发送路由器通告,但连续通告之间的延迟通常会比执行自动配置的主机想要等待的时间长。为了快速获得通告,主机向所有路由器多播组发送一个或多个路由器请求。” --- 第 8 页
这就是我们使用 RADVD 的地方。
阅读 [RFC2462] 了解有关 IPv6 无状态地址自动配置的更多详细信息。
我们将在 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; }; }; |
然后我们启动它
# /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 地址(这是多余的),除了你的静态地址之外
为了使 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 |