IPv6 的地址获取方式与 IPv4 有所不同。在 IPv4 中,主机 IP 地址的自动配置必须由 DHCP 服务器来支持,这被称为有状态的自动配置(StatefulAutoconfiguration);而在 IPv6 中,除了 DHCP 的 v6版本,还引入了无状态的自动配置( StatelessAutoconfiguration )。这项新技术无需 DHCP 服务器支持,所有支持 IPv6 的路由器都监听各主机发送的自动配置请求包, IPv6 路由器对这类请求包的回复里面包含了一些 IPv6 地址的前缀( prefix )信息,主机在收到这样的包以后,可以根据自己的一些已有信息(比如 MAC 地址),生成自己的 IPv6 地址。
本文是在现有的 IPv4 网络环境中模拟 IPv6 环境,自然不存在物理的 IPv6 路由器,但是通过 Linux 平台上的 radvd 工具也可以模拟无状态自动配置,它同样可以监听局域网内各 IPv6 主机发送的自动配置请求并作出响应,这样,这些主机就可以获得各自的 IPv6 地址,并利用这些地址进行相互间的通信。而图X中的客户端正是使用这种方式与代理服务器通信的。
这里以 SLES10 平台上的 radvd-0.9-13.2 为例来说明 radvd 的配置和启动过程。
从 SLES10 的安装光盘中找到 radvd-0.9-13.2.i586.rpm 进行安装
# rpm -ivh radvd-0.9-13.2.i586.rpm
配置运行 radvd 的主机的 IPv6 地址信息
# ip a a 2002:9ba:b4e:6::1/64 dev ethX
# ip r a 2002:9ba:b4e:6::/64 dev ethX
这里的 ethX 表示的是此主机监听局域网数据包的网卡设备
radvd 安装后其配置文件位于 /etc/radvd.conf ,在这个文件中加入配置信息
interface ethX
{
AdvSendAdvert on;
MinRtrAdvInterval 5;
MaxRtrAdvInterval 10;
AdvDefaultPreference low;
prefix 2002:9ba:b4e:6::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};
};
同上,这里的 ethX 表示的是此主机监听局域网数据包的网卡设备。prefix 段表明了该局
域网配置 IPv6 地址的前缀。
确保系统启动了对 IPv6 数据包的转发功能
# sysctl -w net.ipv6.conf.all.forwarding=1
启动 radvd
# /etc/init.d/radvd start
在 radvd 启动成功后,通过 ps 命令可以看到系统中有一个 radvd 的 daemon 进程处于运行状态。若对局域网中的其他主机运行 ifconfig 命令可以看到这些主机已经自动配置了 IPv6 地址,其前缀( prefix )与 radvd 配置文件中的值一致。
2.2.4 配置 Apache 服务器
Apache 服务器是整个模拟 IPv6 环境的核心部分,它将监听来自 IPv6 网络连接的数据包,并将其通过 IPv4 网络转发到服务器端。这里使用了 Apache 服务器的 mod_proxy 模块,相信这一模块提供的 Forward Proxy 功能已为大家所熟知,并被广泛采用。这一模块同时还提供了 Reverse Proxy 功能,本文就采用了此技术来实现转发功能。运行 Reverse Proxy 的 Apache 服务器对于客户端而言就是一台实际的 Web 服务器,客户端将从该服务器获取和上传所有的数据,具体的配置方法如下文所述。
大多数的 Linux 平台已经安装了 Apache 服务器,对于已经安装了 Apache 服务器的平台,必须保证其支持 IPv6,并且加载了 mod_proxy和mod_ssl 模块。当然也可以从 Apache 的源代码开始编译一个新的 Apache 服务器。
首先需要确定 Apache 服务器监听 IPv6 地址,一般而言,在 httpd.conf 中有如下一条:
Listen 80
这表明该 Apache 服务器监听所有的主机地址,自然也包括 IPv6 的地址。若原 Apache 服务器配置了监听一些特定的地址,确保这些地址中包含代理服务器与客户端通信使用的 IPv6 地址。
对于代理服务器的配置,这里需要使用 Apache 服务器的 mod_proxy 模块中的 ProxyPass 指示字,在 Apache 配置文件中加入如下的配置语句。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
ServerName ipv6-server-proxy
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /request
ErrorLog "logs/proxypass-error_log"
CustomLog "logs/proxypass-access_log" common
</VirtualHost>
这里的 ProxyPass 指示语的含义是所有对此 Apache 服务器的 /request 目录的访问都将转发到 。若此 Apache 服务器的 IPv6 地址为2002:9ba:b4e:6::3,则客户端若访问
[2002:9ba:b4e:6::3]/request
实际获得的数据将来自于
这样,在客户端看来,与其通信的服务器是一个支持 IPv6 的服务器端,而实际上是 Apache 代理将远程的服务器端映射到了本地的 IPv6 网络。在这种环境下,客户端就可以来开发和测试自身对 IPv6 的支持了,而无需考虑服务器端对此协议的支持。
上述语句添加的位置由 Apache 的配置文件结构决定,目前许多版本的 Apache 采用多个配置文件,即由一个主的配置文件 httpd.conf 来包含其他子项配置文件,如 httpd-vhosts.conf,httpd-ssl.conf 文件等,而不是所有的配置信息全部写在 httpd.conf 文件中。这里推荐将上述配置语句写入 httpd-vhosts.conf 文件中,然后在主配置文件 httpd.conf 文件加入下面这条包含此文件。
Include httpd-vhosts.conf
这里默认 httpd-vhosts.conf 与 httpd.conf 在同一目录下,多数情况下要加入 httpd-vhosts.conf 的相对路径。
对于需要使用 HTTPS 连接的应用程序,其 Apache 服务器的配置有所不同,参见下一节2.2.5中的具体介绍。
在配置好以后,即可启动/重启 Apache 服务器来使得刚才的配置生效。
# /etc/init.d/httpd restart