Linux Mobile IPv6 HOWTO

Lars Strand

2004-04-20

修订历史
版本 1.22004-04-20修订人: LKS
更新了链接。将许可协议改回 GFDL
版本 1.12004-02-04修订人: LKS
添加了 "在多个外部 LAN 中漫游" 和 "返回家乡"。进行了一些清理和重构。
版本 1.02003-12-02修订人: TMM
由 LDP 审核
版本 0.5.22003-11-26修订人: LKS
大量清理。感谢 John Levon levon [at] movementarian.org
版本 0.5.12003-11-22修订人: LKS
由于某些 GFDL 问题,将许可协议从 GFDL 更改为 OPL
版本 0.52003-11-18修订人: LKS
转换为 XML Docbook。进行了一些清理。
版本 0.42002-11-07修订人: LKS
修复了一些错误 + 更新。感谢 Henrik Petander petander (at) tcs hut fi。
版本 0.3.12003-11-03修订人: LKS
更新到 MIPL relase 1.0 (kernel 2.4.22)。
版本 0.32003-08-05修订人: LKS
初始版本。

本文档描述了设置和使用 Linux 移动 IPv6 的软件和步骤。


目录
1. 简介
1.1. 什么是移动 IP?
1.2. 为什么使用移动 IP?
1.3. 它是如何工作的?
2. IPv6
3. Linux 的移动 IPv6
3.1. 修补内核
3.2. 用户空间工具
3.3. MIPv6 设备节点
3.4. 自动启动
4. 测试平台
4.1. 测试用例
4.2. 分步配置
5. 进行一些测试
5.1. 预测试
5.2. 移动检测
5.3. ping6
5.4. 内核 IP 路由表
5.5. 在多个外部 LAN 中漫游
5.6. 返回家乡
5.7. 真实环境测试 - 平滑切换
6. 常见问题
7. 有用的资源
8. 版权、致谢和杂项
8.1. 版权和许可
8.2. 如何生成本文档
8.3. 反馈
8.4. 致谢
A. GNU 自由文档许可证
A.1. 序言
A.2. 适用性和定义
A.3. 逐字复制
A.4. 批量复制
A.5. 修改
A.6. 合并文档
A.7. 文档集合
A.8. 与独立作品聚合
A.9. 翻译
A.10. 终止
A.11. 本许可证的未来修订
A.12. 附录:如何将此许可证用于您的文档

1. 简介

本文档描述了设置和使用 Linux 移动 IPv6 的软件和步骤。"IPv6 中的移动性支持" 草案 回答了移动 IP 的内容原因


1.1. 什么是移动 IP?

"每个移动节点始终由其归属地址标识,无论其当前连接到 Internet 的哪个位置。当远离其归属网络时,移动节点还会与转交地址关联,该地址提供有关移动节点当前位置的信息。寻址到移动节点归属地址的 IPv6 数据包通过移动节点的归属代理 (HA) 透明地路由到其转交地址。该协议使 IPv6 节点能够缓存移动节点的归属地址与其转交地址的绑定,然后将任何目标地址为移动节点的数据包直接发送到该转交地址。" --- draft-ietf-mipv6-24, 第 1-2 页。


1.2. 为什么使用移动 IP?

"如果在 IPv6 中没有对移动性的特定支持,当移动节点离开其归属链路(在其归属 IPv6 子网前缀正在使用的链路上)时,寻址到移动节点(主机或路由器)的数据包将无法到达该移动节点,因为路由是基于数据包目标 IP 地址中的子网前缀。为了在移动后继续通信,移动节点可以在每次移动到新链路时更改其 IP 地址,但是当移动节点更改位置时,该移动节点将无法维护传输层和更高层连接。IPv6 中的移动性支持尤其重要,因为在 IPv6 的生命周期内,移动计算机很可能占 Internet 人口的大多数或至少相当大的比例。" --- draft-ietf-mipv6-24, 第 6 页。

有关所有详细信息,请阅读 "IPv6 中的移动性支持" 草案


1.3. 它是如何工作的?

移动 IP

  1. 移动节点 (MN) 漫游到外部网络并获取新的转交地址。

  2. MN 执行与其归属代理 (HA) 的绑定更新(新转交地址在 HA 处注册)。HA 向 MN 发送绑定确认。

  3. 对应节点 (CN) 想要联系 MN。HA 拦截目标地址为 MN 的数据包。

  4. 然后,HA 使用 MN 的转交地址将所有数据包从 CN 隧道传输到 MN。

  5. 当 MN 回答 CN 时,它可以使用其当前的转交地址(并执行与 CN 的绑定),并直接与 CN 通信(优化路由),或者它可以将其所有数据包通过 HA 隧道传输。

有关说明,请参见图 "移动 IP"


2. IPv6

IP 版本 6 (IPv6) 是 Internet 协议的新版本,旨在作为 IP 版本 4 (IPv4) 的后继者 [RFC-791]。从 IPv4 到 IPv6 的更改主要分为以下几类

您应该对 IPv6 无状态自动配置有基本的了解,才能完全理解 '移动 IPv6' (MIPv6) 的工作方式。您可以在 [RFC2462] 中阅读有关 IPv6 无状态地址自动配置的信息。

有关 IPv6 的更多信息,请访问 IETF 的 IPv6 工作组


3. Linux 的移动 IPv6

目前有两种可用的移动 IPv6 Linux 实现。英国兰卡斯特大学拥有最古老的 (?) 实现 (http://www.cs-ipv6.lancs.ac.uk/MobileIP/)。支持的最新内核是 2.1.90,并且与 IETF 移动 IPv6 草案 v5 兼容(当前修订版为 v24)。自 1998 年以来,代码和网站尚未更新,因此被认为是过时的。

另一个实现,即最新的实现,是赫尔辛基理工大学的 MIPL 项目。支持的最新内核是 2.4.22,并且它们具有针对即将到来的 2.6 内核的补丁(请参见 FAQ)。访问 http://www.mobile-ipv6.org/ 以获取论文、软件或浏览邮件存档。


3.1. 修补内核

MIPL MIPv6 实现需要内核补丁。该实现修改了 IPv6 内核堆栈,因此必须重新编译内核。安装过程已得到很好的记录,但我将提供一个简短的分步说明。

请注意!对两个不同内核的需求(一个用于 MN,一个用于 HA)已过时。只需在同一内核中编译对 MN 和 HA 的支持即可。无法同时作为 MN 和 HA 运行;选择哪种模式取决于加载了哪些模块。

  1. http://www.mobile-ipv6.org/ 下载最新的 Linux MIPv6 源代码。今天的最新版本是:mipv6-1.0-v2.4.22。最后四个数字对应于应应用补丁的 Linux 内核

          # 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
        
  2. ftp.kernel.org 下载并解压缩相应的 Linux 内核版本

           # 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
         
  3. 应用 MIPv6 补丁

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

    --dry-run 选项检查补丁是否能够正确应用。如果您收到任何失败的 hunks,则不应继续。如果一切正常,请执行

     
          # patch -p1 < /usr/local/src/mipv6-1.0-v2.4.22/mipv6-1.0-v2.4.22.patch 
        
  4. 现在您的内核树已准备好进行配置。运行您最喜欢的 make *config。MIPv6 选项位于 "网络选项" 下。以下选项应存在于 ".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
       

    使用调试消息,可以更容易地找出出现问题的原因。此外,报告错误时,调试消息非常有帮助。

    为了确保您拥有所有正确的选项,您可以运行chkconf_kernel.sh,这是一个包含在 MIPL tarball 中的小型 shell 脚本。

  5. 接下来,您应该编译并安装您的内核。

    提示:为了轻松地区分此内核与其他内核,您可以更改/usr/src/linux/Makefile中的 "EXTRAVERSION" 变量,例如 "-MIPv6-1"

阅读 Linux 内核 HOWTO 以获取有关如何修补、编译和安装新内核的详细说明。


3.2. 用户空间工具

用户空间工具mipdiag,必须安装配置文件和 init 脚本,该模块才能正常工作

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

3.3. MIPv6 设备节点

MIPv6 模块还需要一个新的设备节点条目。发出命令

      # mknod /dev/mipv6_dev c 0xf9 0
    

3.4. 自动启动

  1. 红帽

    所有 init 脚本都位于/etc/init.d/中,它们被符号链接到正确的运行级别(/etc/rcX.d/)。您可以发出命令

       # chkconfig --add mobile-ip6
            

    以在启动时启用 MIPv6,或

       # chkconfig --del mobile-ip6
            

    从启动中删除 MIPv6。

  2. Debian

    如果您很幸运地运行 Debian,则可以发出命令

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

    以设置所有必要的链接。

  3. Slackware

    Slackware 用户的所有启动/运行级别脚本都位于/etc/rc.d中。由于 'configure' 不检查 "/etc/rc.d",您可以添加 INIT_SLACK="/etc/rc.d",然后将 INIT_SLACK 添加到 'configure' 中的 INITDIRS(在 configure 中搜索 INITDIR)。由于您正在运行 Slackware,您可能已经知道了这一点。以下命令应该可以解决问题

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

    如果您不破解 Makefile,则mobile-ip6脚本安装在 '/' (然后您可以将其移动到 /etc/rc.d/)。


4. 测试平台

现在您应该拥有一个可工作的 MIPL 修补内核,已安装的用户级别工具,并且已启用在启动时自动启动。如果出现任何问题,请仔细阅读以上各节。


4.1. 测试用例

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

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

  2. MN - Mobile Node (移动节点): 当 MN 在 "家乡网络"时,它具有地址fec0:106:2700::4。 当 MN 漫游到另一个网络时,它会生成一个新的 "转交" 地址。

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

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

移动 IPv6 测试平台


4.2. 逐步配置

4.2.1. 建立一个功能完善的 IPv6 网络

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

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

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

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

  1. MN: 移动节点有一个无线接口。 转发应该关闭,但应该接受自动配置和 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. 配置移动 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. 接下来,启动移动 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 将生成一个新地址,该地址与其自身 MAC 地址与 HA 的前缀组合在一起。 我认为无法避免生成此地址。
(2)
我们原来的静态 IPv6 地址
(3)
启动时生成的链路本地地址。

5. 进行一些测试

5.1. 预测试

按照上面所示执行每个配置; 尤其重要的是在家乡网络和访问的网络上使用不同的 ESSID。

当您在 MN 上启动 mobile-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 地址配置一个新的 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 的前缀和 MAC 地址生成的新 "国外" 地址
(2)
多余的家乡网络地址(由于 HA radvd 消息和 MN autoconf 设置为 "true")。
(3)
"原始" (家乡) 地址
(4)
启动时生成的链路本地地址

几乎在同一时间,MN 将执行到 HA 的绑定更新。 在您的 tcpdump 窗口中,您将看到多个发往 HA 的数据包。 要验证是否已从 MN 发送并确认绑定更新

      # 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)
收到一个绑定 ACK。
(2)
发送了一个绑定 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
     

您还可以使用统计选项 (-s) 和 "绑定缓存" (-c) 选项在 HA 上验证它

     # 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 AR 的 eth1 (fec0: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: \  (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 做的一件有趣的事情是将默认路由更改为隧道。 新的默认路由变为

    # 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' 漫游到 'visitnet2'。

  3. 在 'visitnet2' 时,MN 会生成一个新的 IPv6 地址并向 HA 进行新的绑定更新。

  4. 然后 MN 返回家乡。 (参见下一节。)

位于 "visitnet2" 的 AR 的配置与另一个 AR(位于 "visitnet")完全相同,只是使用了地址fec0:106:1000::/64而不是fec0:106:1100::/64.

要使移动节点从 'visitnet' 漫游到 'visitnet2',请发出命令 (在 MN 上)

     # 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 (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 将执行到 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
    

MN 将知道它已返回家乡,因为 HA 正在发送设置了 HA-bit (AdvHomeAgentFlag) 的 radvd 消息,请参阅 第 4.2.4 节

您可以看到 MN "已返回家乡",因为 HA 上的绑定缓存信息已刷新(为空)

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

5.7. 实际测试 - 平滑切换

要真正了解移动 IP 的工作原理,请启动 GnomeMeeting(参见图 GnomeMeeting 并启动一个网络会议。 注意!您必须使用最新的 GnomeMeeting 才能获得对 IPv6 的支持!然后执行一个 "漫游",您可以看到几乎平滑的切换。

使用带有 IPv6 的 GnomeMeeting 来测试两个无线网络之间的漫游


6. 常见问题解答

  1. 问: 为什么我们必须创建/dev/mipv6_dev条目?

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

  2. 问: 是否支持内核 2.6.x?

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

    以下是关于 2.6 内核系列的 MIPL 状态的简短概述:

    我们与 USAGI 项目合作完成了 Mobile IPv6 的内核基础设施。该基础设施支持路由优化、隧道和策略路由。

    我们目前正在开发用户空间守护进程,该守护进程处理 MIPv6 信令并控制内核部分的操作。用户空间部分也在顺利进行中。但是,协议逻辑仍然缺失,因此目前还没有任何东西供用户测试。我们应该在三月底之前准备好一个运行良好且经过测试的原型。

  3. 问:MIPL 是否支持 IPSec?

    答:在 2.4.x 上不支持 IPSec。2.6 系列的 MIPL 从一开始就将支持 IPSec。您可以使用第三方 IPSec 实现。

  4. 问:如何控制用于 MN 和 CN 之间通信的路由类型(通过 HA 隧道或通过使用绑定更新/确认的直接通信)?

    答:您可以通过以下方式控制:

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

    如果您不想使用返回路由能力和路由优化,请将其设置为 0,使用以下命令:

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

    然后 MN 将仅通过家乡隧道与 CN 进行通信。

  5. 问:不同的无线网络可以有不同的 ESSID/WEP 密钥吗?

    答:可以,但是您必须在新到达网络时更改此设置。来自 MIPL 的 MIPv6 无法自动执行此操作。

  6. 问:如果 MN 已通过多个访问 LAN,然后返回家乡;该接口仍然具有来自所有访问网络的自动生成的 IPv6 地址!有没有办法“刷新/删除”这些地址?

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

    # ifconfig eth0 inet6 del <ipv6-地址>

  7. 问:主机 B 有两个接口,分配了两个不同的子网。当我从主机 A ping B 时,它没有响应!为什么?主机 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”命令来执行此操作

    # route -A inet6 add default gw <ipv6-主机>

    或者使用较新的“ip”命令

    # ip route ::/0 via <ipv6-主机>

  9. 问:为什么主机发送一个多播地址而不是一个任播地址,以请求路由器请求?

    答:因为主机希望从每个路由器获得答案,而不仅仅是从任何路由器获得答案。目的是能够获得所有参数并选择“最佳”默认路由器。

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

    答:它认为它之前的路由器仍然可以访问。这可能是由于路由器通告中的非常长的生命周期导致的。检查路由器中发送路由器通告的程序的配置。如果该程序支持路由器通告间隔,则您可以使用它来帮助 MN 检测移动,方法是将间隔的使用设置为on。有关详细信息,请参见 man radvd.conf


7. 有用资源

  1. Linux 的 Mobile IPv6 http://www.mipl.mediapoli.com/

  2. Mobile IP 工作组 (IETF) http://www.ietf.org/html.charters/mobileip-charter.html

  3. Mobile IPv6 草案 http://www.ietf.org/internet-drafts/draft-ietf-mobileip-ipv6-24.txt

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

  5. RFC2460 互联网协议,版本 6 (IPv6) 规范 http://www.ietf.org/rfc/rfc2460.txt

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

  7. RFC2462 IPv6 无状态地址自动配置 http://www.ietf.org/rfc/rfc2462.txt

  8. Peter Bieringer 的 Linux IPv6 HOWTO (英文) http://ldp.linux.no/HOWTO/Linux+IPv6-HOWTO/

  9. 网络应用程序的 IPv6 支持的当前状态 http://www.deepspace6.net/docs/ipv6_status_page_apps.html

  10. Linux 内核 HOWTO http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html_single/Kernel-HOWTO.html


8. 版权、致谢和杂项

8.1. 版权和许可

版权所有 (c) 2003, 2004 Lars Strand。

根据 GNU 自由文档许可证,版本 1.2 或自由软件基金会发布的任何更高版本的条款,允许复制、分发和/或修改本文档;没有不变部分,没有封面文字,也没有封底文字。许可证的副本包含在标题为“GNU 自由文档许可证”的部分中。


8.2. 本文档是如何制作的

本文档最初是在 Emacs 中使用 LaTeX 编写的。 HTML 版本使用 latex2html 创建。 后来它被转换为 DocBook XML。

本文档的最新版本可以在以下位置找到

HTML:http://www.tldp.org/HOWTO/Mobile-IPv6-HOWTO/


8.3. 反馈

需要建议、更正、补充。欢迎贡献者并表示感谢。不需要火焰。

我总是可以通过以下方式联系到我

主页:http://www.gnist.org/~lars


8.4. 致谢

本文档是安全通信互操作网络 (INSC 任务 6) 的一部分制作的

感谢 Andreas Hafslund (andreha [at] unik.no) 的初始支持。 还要感谢 UniK(大学研究生中心)http://www.unik.no 和 FFI(挪威国防研究所)http://www.ffi.mil.no 的硬件支持。

还要感谢我引用的其他 HOWTO 作者的作品

Peter Bieringer 的Linux IPv6 HOWTO(英文)


A. GNU 自由文档许可证

版本 1.2, 2002 年 11 月

版权所有 (C) 2000,2001,2002 自由软件基金会,Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 每个人都被允许复制和分发本许可证文档的完整副本,但不允许更改它。


A.1. 前言

本许可证的目的是使手册、教科书或其他功能性和有用的文档在自由意义上“自由”:确保每个人都拥有有效自由来复制和重新分发它,无论是否对其进行修改,无论是商业还是非商业的。 其次,本许可证为作者和出版商保留了一种方法来获得其作品的荣誉,同时不被认为对他人所做的修改负责。

本许可证是一种“copyleft”,这意味着文档的衍生作品本身必须在相同意义上是自由的。它补充了 GNU 通用公共许可证,这是一个为自由软件设计的 copyleft 许可证。

我们设计本许可证是为了将其用于自由软件的手册,因为自由软件需要自由文档:一个自由程序应该附带提供与软件相同的自由的手册。但是本许可证不仅限于软件手册;它可以用于任何文本作品,无论主题或是否作为印刷书籍出版。我们主要推荐本许可证用于其目的是指导或参考的作品。


A.2. 适用性和定义

本许可证适用于任何手册或以任何媒介存在的其他作品,其中包含版权所有者发出的声明,声明可以根据本许可证的条款分发该作品。此类声明授予一项全球性的、免版税的许可证,无限期地使用该作品,但须符合本文所述的条件。“文档”(Document),下文是指任何此类手册或作品。公众的任何成员都是被许可人,并被称为“您”(you)。如果您以根据版权法需要许可的方式复制、修改或分发作品,则您接受该许可。

文档的“修改版本”(Modified Version)是指包含文档或其一部分的任何作品,无论是逐字复制,还是经过修改和/或翻译成另一种语言。

“辅助部分”(Secondary Section)是文档的指定附录或前言部分,专门处理文档的出版商或作者与文档的总体主题(或相关事项)之间的关系,并且不包含任何可以直接归入该总体主题的内容。(因此,如果文档部分是数学教科书,则辅助部分可能不会解释任何数学。)该关系可能是与主题或相关事项的历史联系,或关于它们的法律、商业、哲学、道德或政治立场的问题。

“不变部分”(Invariant Sections)是某些辅助部分,其标题已指定为不变部分的标题,在声明该文档根据本许可证发布的声明中。如果某个部分不符合上述辅助部分的定义,则不允许将其指定为不变部分。文档可能包含零个不变部分。如果文档没有标识任何不变部分,则不存在不变部分。

“封面文字”(Cover Texts)是在声明该文档根据本许可证发布的声明中列出的某些文本短语,作为封面文字或封底文字。封面文字最多可以有 5 个单词,封底文字最多可以有 25 个单词。

文档的“透明”(Transparent)副本是指一种机器可读的副本,以一种其规范可供公众使用的格式表示,该格式适合于使用通用文本编辑器或(对于由像素组成的图像)通用绘画程序或(对于绘图)一些广泛可用的绘图编辑器直接修改文档,并且适合于输入到文本格式化程序或自动翻译成适合输入到文本格式化程序的各种格式。以其他透明文件格式制作的副本,其标记或缺少标记的安排是为了阻止或劝阻读者后续修改,则不是透明的。如果将图像格式用于大量文本,则该图像格式不是透明的。不是“透明”的副本称为“不透明”(Opaque)。

透明副本的合适格式示例包括不带标记的纯 ASCII 码,Texinfo 输入格式,LaTeX 输入格式,使用公开可用的 DTD 的 SGML 或 XML,以及符合标准的简单 HTML、PostScript 或 PDF,这些格式都设计为便于人工修改。透明图像格式的示例包括 PNG、XCF 和 JPG。不透明格式包括仅能由专有文字处理器读取和编辑的专有格式,DTD 和/或处理工具未普遍可用的 SGML 或 XML,以及某些文字处理器出于输出目的而生成的机器生成 HTML、PostScript 或 PDF。

“标题页”是指,对于印刷书籍,标题页本身,以及紧随其后、足以清晰地包含本许可证要求出现在标题页上的材料的页面。对于没有标题页格式的作品,“标题页”是指作品标题最显著出现的位置附近的文本,位于正文开始之前。

“名为 XYZ 的章节”是指文档中一个命名的子单元,其标题恰好为 XYZ,或者包含 XYZ,并在其后用括号括起 XYZ 在另一种语言的翻译。(此处 XYZ 代表以下提到的特定章节名称,例如“致谢”、“献词”、“背书”或“历史”。) 当您修改文档时,“保留章节标题”意味着该章节根据此定义仍然是“名为 XYZ 的章节”。

文档可能在声明本许可证适用于该文档的声明旁边包含“免责声明”。 这些免责声明被视为通过引用包含在本许可证中,但仅限于免除担保:这些免责声明可能具有的任何其他含义均无效,并且对本许可证的含义没有影响。


A.3. 逐字复制

您可以以任何媒介复制和分发文档,无论是商业用途还是非商业用途,前提是本许可证、版权声明以及声明本许可证适用于该文档的许可证声明在所有副本中都得到复制,并且您没有在本许可证的条款上增加任何其他条件。您不得使用技术措施来阻止或控制对您制作或分发的副本的阅读或进一步复制。但是,您可以接受补偿以换取副本。如果您分发足够多的副本,还必须遵守第 3 节中的条件。

您还可以按照上述相同的条件出借副本,并且您可以公开展示副本。


A.4. 大量复制

如果您发布超过 100 份的文档印刷副本(或通常具有印刷封面的媒体副本),并且文档的许可证声明要求提供封面文本,则必须将副本包裹在带有所有封面文本的封面上,这些文本必须清晰易读:正面封面的文本位于正面封面上,背面封面的文本位于背面封面上。两个封面还必须清晰且易读地将您标识为此类副本的出版商。正面封面必须以相同的突出程度和可见性呈现完整的标题及其所有单词。您可以在封面上添加其他材料。如果修改仅限于封面,只要它们保留文档的标题并满足这些条件,则在其他方面可以将其视为逐字复制。

如果任何一个封面的所需文本过于冗长而无法清晰地容纳,则应将列出的第一个文本(尽可能多地容纳)放在实际封面上,并将其余文本延续到相邻页面上。

如果您发布或分发超过 100 份的不透明副本,则必须在每个不透明副本中包含一份机器可读的透明副本,或者在每个不透明副本中或与之一起声明一个计算机网络位置,供公众通过公共标准网络协议访问以下载文档的完整透明副本,且不包含任何附加材料。如果您使用后一种选择,则必须采取合理谨慎的步骤,在您开始大量分发不透明副本时,确保该透明副本在声明的位置保持可访问,直到您向公众分发(直接或通过您的代理或零售商)该版本的最后一个不透明副本至少一年后。

建议(但不是必需的)您在重新分发大量副本之前与文档的作者联系,以便他们有机会向您提供文档的更新版本。


A.5. 修改

您可以根据上述第 2 节和第 3 节的条件复制和分发文档的修改版本,前提是您完全在本许可证下发布修改版本,并将修改版本视为文档,从而允许拥有副本的任何人分发和修改修改版本。此外,您必须在修改版本中执行以下操作:

  1. 在标题页(以及封面,如果有)上使用与文档标题以及以前版本标题不同的标题(如果以前有任何版本,则应在文档的历史记录部分中列出)。如果该版本的原始出版商允许,您可以使用与以前版本相同的标题。

  2. 在标题页上,列出作为作者的一个或多个人员或实体,他们对修改版本的修改负责,以及文档的至少五位主要作者(如果主要作者少于五位,则列出所有主要作者),除非他们免除您此要求。

  3. 在标题页上注明修改版本的出版商的名称,作为出版商。

  4. 保留文档的所有版权声明。

  5. 在其他版权声明旁边添加适当的版权声明,声明您的修改。

  6. 在版权声明之后立即包含一个许可证声明,允许公众根据本许可证的条款使用修改版本,格式如 附录 所示。

  7. 在该许可证声明中保留文档许可证声明中给出的不变章节和所需封面文本的完整列表。

  8. 包含本许可证的未修改副本。

  9. 保留名为“历史”的章节,保留其标题,并向其添加一项,至少说明修改版本的标题、年份、新作者和出版商,如标题页所示。如果文档中没有名为“历史”的章节,则创建一个说明文档的标题、年份、作者和出版商的章节,如其标题页所示,然后添加一个项目,描述修改版本,如前一句所述。

  10. 保留文档中提供的网络位置(如果有),用于公众访问文档的透明副本,同样保留文档中提供的用于访问其所基于的先前版本的网络位置。 这些可以放在“历史”部分中。您可以省略在文档本身发布前至少四年发布的作品的网络位置,或者如果它所指的版本原始出版商允许。

  11. 对于任何名为“致谢”或“献词”的章节,保留该章节的标题,并保留该章节中每个贡献者致谢和/或献词的所有实质和语气。

  12. 保留文档的所有不变章节,其文本和标题均未修改。章节编号或等效项不被视为章节标题的一部分。

  13. 删除任何名为“背书”的章节。 修改版本中不得包含此类章节。

  14. 请勿将任何现有章节重新命名为“背书”,或者在标题上与任何不变章节冲突。

  15. 保留任何免责声明。

如果修改版本包含新的前言章节或附录,这些章节符合辅助章节的条件并且不包含从文档复制的材料,您可以选择将其中一些或全部章节指定为不变的。 为此,请将它们的标题添加到修改版本的许可证声明中的不变章节列表中。 这些标题必须与任何其他章节标题不同。

您可以添加一个名为“背书”的章节,前提是其中仅包含各方对您的修改版本的背书——例如,同行评审声明或文本已被组织批准为标准的权威定义。

您可以在修改版本中封面文本列表的末尾添加一个最多五个单词的段落作为正面封面文本,以及一个最多 25 个单词的段落作为背面封面文本。 任何一个实体只能添加(或通过安排添加)一段正面封面文本和一段背面封面文本。 如果文档已经包含相同封面的封面文本,该文本先前由您或通过由您代表的同一实体安排添加,则您不得添加另一个文本;但是,您可以在获得添加旧文本的先前出版商的明确许可后替换旧文本。

文档的作者和出版商不通过本许可证允许使用他们的姓名进行宣传或断言或暗示对任何修改版本的认可。


A.6. 合并文档

您可以将文档与其他在本许可证下发布的文档合并,根据上述 第 4 节中关于修改版本的定义,前提是您在组合中包含所有原始文档的所有不变章节,未修改,并将它们全部列为组合作品的许可证声明中的不变章节,并且您保留所有免责声明。

组合作品只需要包含本许可证的一个副本,并且多个相同的不变章节可以用单个副本替换。 如果有多个同名但内容不同的不变章节,请通过在其末尾添加(在括号中)该章节的原始作者或出版商的姓名(如果已知)或唯一的编号,来使每个此类章节的标题唯一。 对组合作品的许可证声明中的不变章节列表中的章节标题进行相同的调整。

在组合中,您必须合并各个原始文档中名为“历史”的任何章节,形成一个名为“历史”的章节;同样合并任何名为“致谢”的章节,以及任何名为“献词”的章节。 您必须删除所有名为“背书”的章节。


A.7. 文档集合

您可以创建一个由文档和其他在本许可证下发布的文档组成的集合,并使用包含在集合中的单个副本替换各个文档中本许可证的各个副本,前提是您遵循本许可证中关于逐字复制每个文档的所有其他方面的规则。

您可以从此类集合中提取单个文档,并在本许可证下单独分发,前提是您将本许可证的副本插入到提取的文档中,并在逐字复制该文档的所有其他方面都遵循本许可证。


A.8. 与独立作品的聚合

文档或其衍生作品与其他单独和独立的文档或作品在存储或分发介质的卷上或卷中汇编在一起,如果汇编产生的版权不用于限制汇编用户的合法权利,超出单个作品允许的范围,则称为“聚合”。 当文档包含在聚合中时,本许可证不适用于聚合中本身不是文档的衍生作品的其他作品。

如果第 3 节的封面文字要求适用于这些文档副本,那么如果该文档小于整个集合的一半,则该文档的封面文字可以放置在将该文档括在集合内的封面上,或者如果该文档是电子形式,则放置在封面的电子等效物上。否则,它们必须出现在将整个集合括起来的印刷封面上。


A.9. 翻译

翻译被认为是一种修改,因此您可以根据第 4 节的条款分发文档的翻译版本。用翻译版本替换不变章节需要获得其版权持有者的特别许可,但是您可以包含一些或全部不变章节的翻译版本,以及这些不变章节的原始版本。您可以包含本许可证的翻译版本,以及文档中的所有许可证声明和任何免责声明,前提是您还包括本许可证的原始英文版本以及这些声明和免责声明的原始版本。如果本许可证或声明或免责声明的翻译版本与原始版本之间存在差异,则以原始版本为准。

如果文档中的章节标题为“致谢”、“献词”或“历史”,则保留其标题(第 1 节)的要求(第 4 节)通常需要更改实际标题。


A.10. 终止

除非本许可证明确规定,否则您不得复制、修改、再许可或分发该文档。任何其他复制、修改、再许可或分发该文档的尝试均无效,并将自动终止您在本许可证下的权利。但是,根据本许可证从您那里收到副本或权利的各方,只要这些各方保持完全遵守,其许可证将不会终止。


A.11. 本许可证的未来修订

自由软件基金会可能会不时发布 GNU 自由文档许可证的新修订版本。此类新版本在精神上将与当前版本相似,但在细节上可能会有所不同,以解决新的问题或疑虑。请参阅 https://gnu.ac.cn/copyleft/。

许可证的每个版本都有一个唯一的版本号。如果文档指定本许可证的特定编号版本“或任何后续版本”适用于它,您可以选择遵循该指定版本或自由软件基金会已发布的任何后续版本(非草案)的条款和条件。如果文档未指定本许可证的版本号,您可以选择自由软件基金会曾经发布的任何版本(非草案)。


A.12. 附录:如何在您的文档中使用本许可证

要在您编写的文档中使用本许可证,请在文档中包含一份本许可证的副本,并在标题页之后放置以下版权和许可证声明

版权所有 (c) 年份 您的姓名。 根据 GNU 自由文档许可证第 1.2 版或自由软件基金会发布的任何后续版本条款,允许复制、分发和/或修改本文档;没有不变章节,没有封面文字,也没有封底文字。 许可证的副本包含在标题为“GNU 自由文档许可证”的章节中。

如果您有不变章节、封面文字和封底文字,请将“with...Texts”行替换为以下内容

其中不变章节为 LIST THEIR TITLES,封面文字为 LIST,封底文字为 LIST。

如果您有不变章节而没有封面文字,或者三种情况的其他组合,请合并这两种替代方案以适应实际情况。

如果您的文档包含重要的程序代码示例,我们建议您在自由软件许可证(例如 GNU 通用公共许可证)下并行发布这些示例,以允许它们在自由软件中使用。