在 Linux 服务器节点上支持 IPv6
当前版本的 IP 协议 IPv4 已被证明是稳健的、易于实现的、可互操作的,并且经受住了扩展到当今互联网规模的考验,其中大部分互联网都使用了 IPv4——现在已经将近 20 年了。尽管 IPv4 已经很老旧,但它的弹性令人瞩目,但它开始出现问题。IPv4 的最初设计没有考虑到当今非常重要的几个问题,例如提供地址紧缺问题解决方案的大地址空间、移动性、安全性、自动配置和服务质量。
为了解决这些问题,互联网工程任务组 (IETF) 开发了一套协议和标准,称为 IP 版本 6 (IPv6),其中包含了许多更新 IPv4 的概念和提议方法。IPv6 的一些功能包括新的报头格式、更大的地址空间(128 位)、高效且分层的寻址和路由基础设施、无状态和有状态地址安全的可用性、内置安全性、对移动性的更好支持以及用于邻居节点交互的新协议。因此,IPv6 不仅将解决 IPv4 中的许多问题,还将增加许多改进。IPv6 预计将逐步取代 IPv4,两者将在过渡期内共存多年。
Linux 有两个主要的 IPv6 实现:作为 Linux 内核一部分的实现和 USAGI (UniverSAl playGround for IPv6) 实现。USAGI 项目致力于为 Linux 提供生产质量的 IPv6 协议栈,并与 WIDE、KAME 和 TAHI 项目紧密合作。它由来自各个组织的志愿者运营,通过交付 IPv6 协议栈为 Linux 和 IPv6 社区做出贡献。目前,不同的发行版团队正在进行许多努力,USAGI 正在努力统一它们,以便所有 Linux 发行版都只有一个 IPv6 实现。
为了本文的目的,我们使用了来自 kernel.org 的 Linux 内核 2.4.5。我们首先展示如何构建支持 IPv6 的内核,然后展示如何升级基本网络软件以支持 IPv6,最后展示如何使用 www.freenet6.net 项目的服务将启用 IPv6 的服务器连接到 IPv6 互联网。
第一步是从 kernel.org 下载 Linux 内核并解压缩
tar -xzf linux-2.4.5.tar.gz
您将得到一个名为 linux 的目录。您需要将此目录移动到 /usr/src 并将其重命名为 linux-2.4.5 以反映内核版本。接下来,您需要创建一个指向 2.4.5 源代码目录的链接
ln -s /usr/src/linux-2.4.5 /usr/src/linux完成上述操作后,您需要配置新内核以启用对 IPv6 的支持
cd /usr/src/linux make xconfig (or menuconfig)我们需要在内核配置中启用两个选项。首先,转到“代码成熟度级别”并启用“开发/不完整代码/驱动程序”
"Prompt for development and/or incomplete code/drivers" YES

图 1. 启用对实验性功能的支持
然后转到“网络选项”。在那里,您将启用 IPv6 协议
IPv6 Protocol (EXPERIMENTAL) YES

图 2. Linux 内核 IPv6 配置
这就是您在内核级别需要做的所有配置。接下来,您应该保存此配置并通过单击“保存并退出”按钮退出(参见图 3)。这将在 /usr/src/linux 中创建一个 .config 文件,它是内核配置文件。现在您可以按照以下步骤编译内核
make clean make dep make bzImage
结果将是在 /usr/src/linux/arch/i386/boot/ 中创建的新内核映像。如果您添加了其他功能作为模块,您需要通过应用以下命令来编译和安装模块
make modules make modules_install
此时,您需要将新的启用 IPv6 的引导映像复制到 /boot
cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.ipv6并更新您的 System.map 文件
cp /usr/src/linux/System.map \ /boot/System.map-2.4.5-ipv6 ln -fs /boot/System.map-2.4.5-ipv6 /boot/System.map剩下的最后一步是更新 /etc/lilo.conf 文件,为新的启用 IPv6 的内核添加条目。编辑 /etc/lilo.conf 文件并添加一个新条目,如下所示
image=/boot/bzImage.ipv6 label=linux_ipv6 root=/dev/hda1 # change this to reflect your own # partition read-only然后通过应用以下命令更新 LILO 配置
/sbin/lilo这将添加一个名为 linux_ipv6 的条目,该条目将在启动时在 LILO 中显示。现在您可以重新启动服务器了。当 LILO 出现时,选择启动 linux_ipv6。 瞧!!您的系统将在内核中启用 IPv6 支持的情况下启动。在提示符下键入 ifconfig 以验证并查看结果。它应该在您的环回配置中显示 IPv6 本地地址 ::1(参见图 4)。

图 4. ifconfig 环回
一旦内核支持 IPv6,您需要安装一些工具来测试您的设置,并将 IPv6 传输与其他系统一起使用。首先,您需要基本的网络实用程序来支持 IPv6,以便能够配置您的接口,此外还需要一些其他 IP 实用程序,例如 ping6、telnet6 等,并能够进行一些基本的 IPv6 测试。
有三个软件包提供这些实用程序:net-tools、iputils 和 NetKit 实用程序。必备软件包是前两个;NetKit 是可选的。此外,如果您希望能够调试可能出现的潜在 IPv6 网络问题,您需要在 tcpdump 和 libpcap 中支持 IPv6。在以下各节中,我们将介绍上述所有软件包的安装。
net-tools 是一个用于控制 Linux 网络的程序集合,其中包括 arp、hostname(domainname、dnsdomainname、nisdomainname)、ifconfig、ipmaddr、iptunnel、netstat、rarp、route 和 plipconfig 等命令。此软件包可从 www.tazenda.demon.co.uk/phil/net-tools 下载。
要在您的系统上安装该软件包,首先将软件包直接下载到 /usr/src 中。然后分别输入以下命令
cd /usr/src tar xIvf net-tools-1.60.tar.bz2 cd net-tools-1.60 ./configure.sh config.in
配置将询问您需要回答的几个问题,以便能够配置 net-tools。建议您对以下问题回答“是”
INET6 (IPv6) protocol family (HAVE_AFINET6) [n] y SIT (IPv6-in-IPv4) support (HAVE_HWSIT) [n] y Build iptunnel and ipmaddr (HAVE_IP_TOOLS) [n] y然后,您需要编译并安装 net-tools
make make install二进制文件将安装在 /sbin 和 /bin 中,您可以开始使用它们,前提是您已重新启动到启用 IPv6 的内核中。
此软件包包括以下工具:ping、ping6、traceroute6、rdisc、clockdiff、tftpd、tracepath、tracepath6 和 arping。您系统上安装的 IP 实用程序可能不支持 IPv6。第一步是检查当前安装的版本是否符合 IPv6 标准,方法是在命令 shell 中键入以下内容
rpm -q --qf "%{NAME}-%{VERSION}\n" iputils
如果结果是 iputils-20000121 或更新版本,则您无需执行最新 iputils 软件包的安装。否则,您需要按照以下步骤在您的系统上安装实用程序。首先,从 ftp.inr.ac.ru/ip-routing 下载软件包。对于我们的设置,我们使用了 iputils-ss001110.tar.gz。接下来,在 /usr/src 中解压软件包
tar -xzf iputils-ss001110.tar.gz最后,使用 make 编译 iputils。
该软件包不提供 make install。因此,您可以自由地将二进制文件放置在您选择的目录中。但是,您需要确保您拥有的旧版本工具不会与路径中的新版本冲突。将新二进制文件保存在 /usr/local/iputils/bin/ 中。该软件包为每个工具提供手册页。您还需要将新手册页移动到 man 搜索的目录中;要检查 man 路径中的目录,请键入 manpath。
这些实用程序是使用和测试新 IPv6 配置的基本工具。NetKit 包括以下工具:ping、finger、telnet、rwho 及其各自的守护程序。这些是非常有用的实用程序,因为我们可以使用 IPv6 支持编译它们。该软件包可从 freshmeat.net/projects/netkit 下载。我们测试的版本是 nkit-0.5.1.tar.gz。
以下是在 Linux 服务器上安装这些实用程序的步骤。首先,从引用的网站下载最新的 NetKit 软件包。然后将下载的文件移动到 /usr/src。使用以下命令解压软件包
tar -xzf nkit-0.5.1.tar.gz
接下来,运行 ./configure。使用 make clean 和 make 编译,并将二进制文件复制到 /usr/local/bin
cp telnet/telnet /usr/local/bin/telnet6 cp telnetd/in.telnetd /usr/local/sbin/in.telnetd6 cp finger/finger /usr/local/bin/finger6 cp ping/ping /usr/local/bin/ping6 cp fingerd/in.fingerd /usr/local/sbin/in.fingerd6此时,您应该具有基本功能,例如,您可以 ping6 您的本地 IPv6 环回(图 5)。

图 5. ping6 运行中
请注意,如果您使用的是 Red Hat 7.x,则需要将补丁应用于 NetKit 软件包。该补丁可从 ftp.bieringer.de/pub/linux/IPv6/netkit 获得。
如果您需要了解 IPv6 网络/连接的数据包级别发生了什么,您需要在 libpcap 和 tcpdump 中启用 IPv6。 libpcap 是一个独立于系统的用户级数据包捕获接口,它为低级别网络监控提供了可移植框架。另一方面,tcpdump 是一个提供网络监控和数据采集的工具。
如果您需要这些功能,您需要下载最新版本并在您的系统上安装它们。我们测试的版本是 tcpdump 3.6.2 和 libpcap 0.6.2。首先,从 www.tcpdump.org 下载软件包并将它们移动到 /usr/src。然后使用以下命令解压它们
tar -xzf libpcap-0.6.2.tar.gz tar -xzf tcpdump-3.6.2.tar.gz
解压后,您将有两个目录,每个软件包一个目录。接下来,您需要对每个软件包执行以下步骤;但是,您需要先将其应用于 libpcap,然后再应用于 tcpdump。首先,运行配置脚本,同时启用 IPv6
./configure --enable-ipv6然后使用 make clean 和 make 编译。最后,使用 make install 安装二进制文件。
完成这些步骤后,您需要调整您的路径以包含支持 IPv6 的新二进制文件。您可能还想编辑 /etc/profile 并将 /usr/local/sbin 和 /usr/local/bin 包含在您的 PATH 变量中,并重新加载 /etc/profile 以使新更改生效
source /etc/profile
如果您希望能够 telnet6 到您的系统,您需要使用 inet6 支持编译 xinetd。通常,安装的 inetd 守护程序尚未准备好处理 IPv6 地址。因此,您需要升级到 xinetd。要下载最新版本的 xinetd,请访问 synack.net/xinetd。我们的设置使用 xinetd-2.1.8.8p3 进行了测试。
将 xinetd-2.1.8.8p3.tar.gz(或最新版本)下载到 /usr/src 并使用以下命令解压它
tar -xzf xinetd-2.1.8.8p3.tar.gz
接下来,运行配置脚本
./configure --with-inet6 --prefix=/usr/local/bin--prefix=/usr/local/bin 用于指定生成的二进制文件应位于 /usr/local/bin 下。然后编译并安装
make clean make make install接下来,您需要从旧的 inet.conf 创建配置文件
/usr/sbin/xconv.pl < /etc/inetd.conf > /etc/xinetd.conf其中 /usr/sbin 是 xinetd 可执行文件的路径。
作为旁注,您需要确保在 xconv.pl 脚本中,第一行包含 Perl 二进制文件的正确路径才能执行。
接下来,您需要在 /etc/xinetd.conf 中进行一些非常小的更改,以反映 telnet6d 和 tftp6d 的使用,而不是通常的 IPv4 Telnet 和 TFTP 守护程序。完成这些操作后,您将可以设置通过 IPv6 对系统进行 Telnet 和 FTP。
有各种各样的应用程序支持 IPv6。但是,我们只提及一个服务器应用程序,即 Apache Web 服务器。Apache 是互联网上最流行的 Web 服务器(来源:Netcraft.com)。最新的 beta 版本 Apache 2.0.16 beta 包括对 IPv6 的支持,这使其成为测试 IPv6 设置的良好应用程序。如果您下载最新版本的 Apache Web 服务器并在您的系统上安装它,您将能够通过 IPv6 提供网页服务。
图 6 显示了 Mozilla 浏览器尝试访问 “http://[::1]” 的屏幕截图,这是 IPv6 本地环回地址。
为了您的方便,您可能需要更新 /etc/hosts 文件以包含
::1 ip6-localhost ip6-localhost
然后,您可以改用 ip6-localhost 而不是 ::1。
不要忘记检查 /etc/protocols。如果下面提到的条目不存在,您需要添加它们以支持 IPv6 协议
ipv6 41 IPv6 # IPv6 ipv6-route 43 IPv6-Route # Routing Header for IPv6 ipv6-frag 44 IPv6-Frag # Fragment Header for IPv6 ipv6-crypt 50 IPv6-Crypt # Encryption Header # for IPv6 ipv6-auth 51 IPv6-Auth # Authentication Header # for IPv6 ipv6-icmp 58 IPv6-ICMP icmpv6 icmp6M # ICMP for # IPv6 ipv6-nonxt 59 IPv6-NoNxt # No Next Header for IPv6 ipv6-opts 60 IPv6-Opts # Destination Options # for IPv6
早在 1996 年,当第一个 IETF IPv6 规范完成时,人们有兴趣建立一个 IPv6 测试骨干网。在 1996 年的 IETF-蒙特利尔会议期间,诞生了 6bone(IPv6 骨干网)。它使用 3ffe::/16 范围内的测试(但仍然有效)地址。最初,骨干网的大部分是通过当前 IPv4 互联网上的隧道完成的。这在 IPv4 互联网上创建了一个虚拟 IPv6 网络。如今,6bone 由本地链路和隧道链路组成。6bone 用于测试,因此组织之间没有服务级别协议,但这并不意味着它不可靠或无效。来自和去往 3ffe::/16 的任何流量都是有效的,没有任何限制。
1999 年 7 月,三个区域注册机构 ARIN(美洲)、RIPE(欧洲和非洲)和 APNIC(亚洲)开始向提供商提供常规的非测试地址,从 2001::/16 范围开始。所有拥有该范围地址的站点都构成了生产 IPv6 互联网。
要连接到 6bone 或 IPv6 互联网,您需要(如 IPv4 中一样)提供服务的提供商。如果您无法直接找到提供商,或者如果您当前的提供商不提供服务,那么简单的解决方案是建立一个到愿意为您提供传输服务的提供商或站点的隧道。
就像互联网早期一样,一个旨在帮助人们开始使用 IPv6 的项目正在提供免费和自动化的隧道服务,可以将任何个人或组织连接到 IPv6 互联网。该项目称为 Freenet6.net,由咨询公司 Viagénie 运营,作为一项免费的、志愿的和尽力而为的服务。由于可以轻松快速地访问互联网,该服务在社区中非常受欢迎。
Freenet6 以隧道代理 (RFC 3053) 为模型,其中在节点和隧道代理之间建立 IPv6 over IPv4 隧道。Freenet6 是一个增强版本,其中节点使用隧道设置协议 (TSP) 与服务器协商隧道的建立。客户端节点可以是主机或路由器。TSP 服务器 Freenet6 不仅提供隧道,还为服务的任何用户提供大地址空间。提供的地址空间是 /48,它提供(16 位)65,536 个子网,每个子网最多可以有 264 个节点(64 位)。这比当前整个互联网还要多!此地址空间已分配给用户,并且即使客户端节点的 IPv4 地址发生更改,它仍然存在。这使任何用户或组织都可以自由地为服务器和服务拥有数十亿个地址;这在 IPv4 中使用 NAT 很难做到。
IPv6 over IPv4 隧道是通过配置另一端点的 IPv4 和 IPv6 地址来建立的。当其中一个端点的 IPv4 地址更改时,隧道的两个端点都需要相应地更改其配置。当 IPv4 节点进行拨号或经常更改地址时,这尤其麻烦。在 Freenet6 服务中实现的 TSP 可以配置为处理此问题。每次隧道客户端更改其 IPv4 地址时,例如,在启动时使用 DHCP 服务,TSP 客户端都会向服务器发送更新且经过身份验证的信息,以便隧道保持活动状态。Freenet6 服务支持的客户端节点包括 Linux、FreeBSD、OpenBSD、NetBSD、Windows、Solaris 和 Cisco。图 7 说明了 Freenet6 的基本架构。

图 7. 具有一台主机的 Freenet6 架构
要在 Linux 上安装 IPv6 后使用 Freenet6 服务,您必须执行以下步骤。首先,访问 www.freenet6.net 并注册用户名。然后下载 Linux 的 TSP 客户端。按照说明编译并安装它。接下来,配置提供的 tspc.conf 文件。添加您的用户名和密码。然后启动 tspc 客户端
tspc -vf tspc.conf
您可能希望将 tspc 客户端命令放在启动序列中,以便即使您的 IPv4 地址发生更改,它也会在启动时自动重新启用隧道。
如果您有一个主机,Freenet6 可以为您提供一个 IPv6 地址,如果您有一个路由器,它可以为您提供完整的 /48 地址空间。Freenet6 将配置 Linux 以适应角色。
在路由器情况下,您将收到一个 /48 地址空间,并且路由器上的第一个子网将配置为路由器通告。这意味着该子网上的主机将接收前缀并自动配置自身,如图 8 所示。
有很多方法可以连接到 IPv6 互联网。Freenet6 与 TSP 协议一起,实现了轻松的 IPv6 隧道连接和永久地址空间,因此即使您更改 IPv4 地址,IPv6 地址和连接也保持稳定。
作为我们在加拿大爱立信研究院开放架构研究部门的活动之一,我们正在进行几个与 IPv6 相关的项目,例如在我们的电信级服务器节点上支持 IPv6、移植应用程序服务器以与 IPv6 协同工作,以及在不同的 IPv6 领域建立研究项目。
我们开展的一项有趣的活动是试验当前可用的 Linux IPv6 实现,并提出建议,以确定为我们的 Linux 处理器采用哪种实现。这些建议基于 IPv6 实现的特性,例如其开发速度、其对标准的符合性以及其性能与其他实现相比如何。结果在 6 月 26 日至 29 日在加拿大渥太华举行的 Linux Symposium 会议期间进行了展示 (www.linuxsymposium.org/2002/view_txt.php?text=abstract&talk=93)。
在 2002 年,我们将继续在我们的 Linux 集群上支持 IPv6。我们目前的工作方向是在 Linux 的 SIP 和 SCTP 实现上支持 IPv6,以及构建一个能够测试运行在 IPv6 上的平台和应用程序的性能和可扩展性的 IPv6 基准测试环境。
最后,重要的是要知道 IPv6 的关键优势之一是地址。任何人都可以接收与当前 IPv4 地址空间一样多的地址。这使用户可以完全自由地部署服务器和服务,而无需担心 NAT 问题和有限的地址空间。欢迎来到在互联网上部署服务的自由!
我们要感谢爱立信开放架构研究部门批准发布本文,感谢 Canarie, Inc. (www.canarie.ca) 资助了 Freenet6 项目的部分资金,并感谢 David Gordon (David.Gordon@Ericsson.ca) 在 ECUR 实验室设置 IPv6 节点以及编辑和审阅本文方面提供的帮助。
Ibrahim Haddad (Ibrahim.Haddad@Ericsson.com) 目前是加拿大蒙特利尔爱立信公司研究部门的研究员。他主要从事用于实时全 IP 网络的运营商级服务器节点的研究,并代表爱立信参加开放源代码开发实验室的技术组。 Marc Blanchet 在 Viagénie 工作,Viagénie 是一家专门从事 IP 工程、IPv6 和网络安全的咨询公司。他自 1995 年以来一直参与 IPv6,并撰写了许多关于 IPv6 的 IETF 文档。他还撰写了 Wiley 出版的《Migrating to IPv6》。