4. 测试平台

现在你应该已经拥有一个可以工作的 MIPL 补丁内核,安装了用户级工具,并在启动时启用了自动启动。如果出现任何问题,请仔细检查以上章节。

4.1. 测试用例

我们在测试平台中使用的地址是站点本地地址。你也可以使用全局地址,但请注意,链路本地地址将无法工作! 我们的测试平台由四个节点组成;请参见图 “Mobile IPv6 测试平台”

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

  2. MN - 移动节点: 当 MN 位于“家乡网络”时,它的地址为fec0:106:2700::4。当 MN 移动到另一个网络时,它会生成一个新的“转交”地址。

  3. R - 路由器: 这是从家乡网络到互联网的路由器。它有一个无线接口,地址为fec0:106:2700::1和一个有线接口,地址为fec0:106:2300::2.

  4. AR - 接入路由器: AR 和 R 之间的链路是我们的“互联网” - 但在本测试用例中仅为交叉电缆(可以是任何网络)。AR 有两个接口;连接到 R 的有线接口的地址为fec0:106:2300::1,无线接口的地址为fec0:106:1100::1.

Mobile IPv6 测试平台

4.2. 逐步配置

4.2.1. 设置完全可用的 IPv6 网络

在我们开始测试移动 IP 之前,我们需要一个完全可用的 IPv6 网络。所有节点都应该能够互相 ping 通。这是至关重要的部分。 例如,如果 AR 无法 ping 通 HA,则不会有绑定更新。

我将简要介绍如何使用 IPv6 启动并运行我们的网络。有关设置 IPv6 网络的更多信息,你可以阅读 Peter Bieringer 的优秀 Linux IPv6 HOWTO

为了简单起见,我关闭了加密 - 请注意,在处理无线网络时,应始终使用加密!

另请注意,不同的无线网络具有不同的 ESSID!

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

你可以使用 sysctl 而不是修改 proc 变量。

注意:我们在测试平台上设置静态路由。现在你应该能够从每台主机 ping 通所有主机。

4.2.2. 配置 Mobile IPv6

最后的配置是 MIPv6 设置,在network-mip6.conf中。在 Debian/Slackware 中,该文件位于/etc/。(在 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. 接下来,启动 mobile-IP

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

你可以通过执行ifconfig在 HA 上验证它是否已启动。如果隧道启动,ip6tnl1,则 mobile-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 (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)
隧道已启动并准备好连接。
(2)
另一个隧道已准备就绪。

你还将看到 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 的地方。

阅读 [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 地址(这是多余的),除了你的静态地址之外

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 (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)
一个新的(多余的)自动生成地址。由于我们设置了autoconf/proc/sys/net/ipv6/conf/eth0/autoconf1,MN 将生成一个新地址,该地址结合了 HA 的前缀和它自己的 MAC 地址。我不认为可以避免生成此地址。
(2)
我们原始的静态 IPv6 地址
(3)
启动时生成的链路本地地址。