在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

时间:2023-12-30 13:26:14

在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境

1 IPv6简介

IPv6(Internet Protocol Version 6)作为 IPv4 的升级版本,它是作为一共软件升级安装在设备和
操作系统中。为什么需要使用 IPv6,一个最直接的答案就是目前广泛应用的 IPv4 已经无法提供足够的 IP 地址来满足迅速增长的网络。IPv4 采用32位地址长度,只有大约43亿个地址,很快就将被分配完毕。而 IPv6 采用128位的地址长度,几乎可以不受限制的提供地址。当然扩大地址空间只是 IPv6 的众多优势中的重要一项,除此之外,IPv6 还能够提高网络的整体吞吐量、改善服务质量(QoS)、安全性有更好的保证、支持即插即用和移动性、更好实现多播功能等等。

2 在 IPv4 环境中模拟 IPv6 网络

正如上节中所述,目前许多与网络应用相关的软件已经加入了对 IPv6 的支持,更有大量的软件正在处于对 IPv6 支持的开发阶段。但是就开发而言,目前许多开发环境并没有对 IPv6 提供很好的支持,尤其当所开发的应用需要经过较老的路由甚至公共网络时。如果希望通过升级网络设备来支持开发环境,将是一笔不小的花费,有时甚至是不现实的(比如短期内升级公共网络支持 IPv6)。

研究如何在现有的 IPv4 网络环境中模拟出 IPv6 环境,使得开发和测试工作能够顺利进行,显得尤为重要。

2.1 IPv6 网络要求及现有的网络环境

图1显示了典型的 HTTP 网络应用,如果需要对这样的网络应用提供 IPv6 的支持,开发和测试人员可能会碰到如下三种情形:

客户端和服务器运行于同一个局域网中,如图1-a

客户端和服务器运行于同一个 Intranet 中,它们之间的网络通路需要经过路由,如图1-b

客户端和服务器分别处于不同的地域,它们之间由 Internet 提供连接,如图1-c。

图 1. 三种典型的 HTTP 网络应用

在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

在这三种不同的情形下,IPv6 的网络环境要求是不同的。对于情形1,只需客户端和服务器所运行的操作系统支持 IPv6 即可通过 IPv6 协议进行通信,若需要提供 Global 地址的通信,则可以通过在局域网内的某台机器上运行一个软件 IPv6 路由来支持,因此其针对 IPv6 的开发和测试相对简单。 对于情形2,由于客户端和服务器之间经过运行于 IP 层的路由,因此要求网络通路上经过的所有路由器均支持 IPv6。 这可能是一个不小的挑战,因为很多 Intranet 环境并没有提供支持 IPv6 的路由。对于情形3,这就要求 Internet 提供 IPv6的支持,就短期看来,Internet 提供全面的 IPv6 支持还不太可能。

因此,在情形2和情形3的环境中,网络硬件支持将成为开发和测试支持 IPv6 的网络应用程序的最大障碍,在2.2节中将给出如何运用现有的 IPv4 网络来进行 IPv6 应用程序的开发和测试,同时又保证其在真实的 IPv6 环境中正常运行。

2.2 利用现有 IPv4 网络模拟 IPv6 环境

2.2.1 模拟环境构建的基本原理

图2 - 图3显示了 IPv6 模拟环境的框图,这里存在两种情形,但具体的配置是类似的。
对于开发客户端 IPv6 应用程序,其框图如 图2;而对于开发服务器端 IPv6 应用程序,其框图如 图 3 。其基本原理就是利用代理技术将原来被 IPv4 网络阻断的客户端或服务器端映射到位于同一局域网内的代理服务器上,这样“客户端”与“服务器端”就可以进行基于 IPv6 的网络通信了。 在 图2 中,我们需要代理服务器与客户端运行于同一局域网中,在客户端看来,此代理服务器是一个具备了 IPv6 支持能力的“服务器”,即使真正的服务器端并没有支持 IPv6 ,也可以进行客户端的开发和测试。在 图3中,我们需要一台机器与服务器端运行于同一局域网中,在服务器端看来,此代理服务器是一个具备了 IPv6 支持能力的“客户端”。

图 2. 利用代理将服务器端映射到与客户端同一局域网内

在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

图 3. 利用代理将客户端映射到与服务器端同一局域网内

在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

下面仅以客户端的IPv6环境为例来讲述整个模拟环境的构建过程。

2.2.2 环境的建立

操作系统平台: Linux(Centos),内核需支持 IPv6,2.6以上版本最佳,

软件: radvd(Router ADVertisement Daemon),
这是一个运行于 Linux 平台之上的提供 IPv6 路由配置信息的软件,可以替代 IPv6 路由来进行无状态的地址自动配置。

2.2.3 启动 radvd

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中的客户端正是使用这种方式与代理服务器通信的。

1. 使用命令yum install radvd 安装radvd

在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

2.配置运行 radvd 的主机的 IPv6 地址信息

# ip a a 2002:9ba:b4e:6::1/64 dev ethX

# ip r a 2002:9ba:b4e:6::/64 dev ethX

这里的 ethX 表示的是此主机监听局域网数据包的网卡设备

3.确保系统启动了对 IPv6 数据包的转发功能

# sysctl -w net.ipv6.conf.all.forwarding=1

或者 永久添加  :在/etc/sysctl.conf      中配置 net.ipv6.conf.all.forwarding = 1

4.radvd 安装后其配置文件位于 /etc/radvd.conf ,在这个文件中加入配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface eth0
{
         AdvSendAdvert on;
         MinRtrAdvInterval 5;
         MaxRtrAdvInterval 10;
         AdvDefaultPreference low;
         prefix 2002:9ba:b4e:6::/64
         {
                  AdvOnLink on;
                  AdvAutonomous on;
                  AdvRouterAddr off;
         };
};

同上,这里的 ethX 表示的是此主机监听局域网数据包的网卡设备。prefix 段表明了该局

域网配置 IPv6 地址的前缀。

5.启动 radvd

# /etc/init.d/radvd start

或者:service radvd start

在 radvd 启动成功后,通过 ps -ef | grep radvd 命令可以看到系统中有一个 radvd 的 daemon 进程处于运行状态。若对局域网中的其他主机运行 ifconfig 命令可以看到这些主机已经自动配置了 IPv6 地址,其前缀( prefix )与 radvd 配置文件中的值一致

在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

6.配置优化:

第2步和第3步在系统重启后配置将会丢失,我们可以通过修改配置文件的方法让配置在系统重启后依然生效,具体配置如下:

  1、依次执行以下命令

    #cd /etc/sysconfig

      #vi network

 添加以下内容:

NETWORKING_IPv6=yes
IPV6FORWARDING=yes
IPV6INIT=yes
IPV6_DEFAULTGW=2002:db8:1:0::A%eth0

2、修改文件:/etc/sysconfig/network-scripts/ifcfg-eth0

添加以下内容:

IPV6INIT=yes
IPV6to4INIT=yes
IPV6FORDING=yes
IPV6ADDR=2002:db8:1:0::1/64

3、修改文件/etc/sysctl.conf

添加以下内容:

net.ipv6.conf.all.forwarding = 1