自从 FreeBSD 4.0之后,系统就已经内置对IPv6的支持了,FreeBSD的IPv6实现都基于KAME计划。需要注意的是,并不是KAME计划中的所有内容和最新更改都加入FreeBSD系统中,一些特性并没有成为FreeBSD系统的一部分,但KAME可以完整的运行在FreeBSD系统中,事实上,他们的开发工作都是基于BSD Unix的,因此也可以下载他们的最新发布的代码,得到更完整、但处于试验目的的IPv6支持。
1) IPv6 支持
如果没有因为定制系统取消 IPv6支持,FreeBSD已经支持IPv6,由于IPv6的自动配置特征,就为网络界面设置了一个缺省地址。
$ ifconfig sis0 inet6
sis0: flags=8843 mtu 1500
inet6 fe80::2d0:9ff:fea3:49fa%sis0 prefixlen 64 scopeid 0x1
命令行中的 inet6就是表示IPv6地址,而地址形式为fe80::2d0:9ff:fea3:49fa%sis0,其中前缀fe80就是根据本地网络界面设置的IPv6地址类型,而最后八个字节为根据本地网卡的有关参数生成的数据,对于以太网卡,这就是MAC地址,而%sis0定义了地址所在的网络界面名字,这主要用于组播环境。后面的prefixlen定义了前缀长度,缺省情况下这种Ipv6地址使用64位前缀来区分网络地址和节点地址。而使用MAC地址作为节点地址,就极大的减轻了网络中地址分配的难题,简化了管理工作。而scopeid是一个索引,对于这种基于网络界面的地址用于表示网络界面的序号。
上面的地址是最基本的 IPv6地址,它的前缀都是fe80,主要用于内部网络之间的相互通信,如果需要和外部网络进行通信,就比较困难了,因为这难以设置路由。更标准的办法是为网络界面手工设置IPv6地址,由于IPv6的特性,通常仍然保留原有的fe80地址用于本地网络通信,而设置多个alias地址。
# ifconfig sis0 inet6 3ffe::12 prefixlen 48
如果网络中有 IPv6路由器存在的话,就不需要手工配置IPv6地址,系统会自动从路由器中获取网络地址(网络前缀),然后使用本地MAC地址填充,成为一个有效的、可路由的IPv6地址,这就是IPv6的自动配置功能,类似于IPv4网络中的DHCP协议。
# ifconfig sis0 inet6
sis0: flags=8843 mtu 1500
inet6 fe80::2d0:9ff:fea3:49fa%sis0 prefixlen 64 scopeid 0x1
inet6 3ffe:501:ffff:1000:2d0:9ff:fea3:49fa prefixlen 64 autoconf
上例中,第二个地址就是自动配置的地址,前面的前缀为 IPv6路由器中设置的,而autoconf就标示了这种类型的地址,这个地址与前面地址的区别就是它的路由已知,因而没有 ” %sis0 ” 这样的后缀。
为了支持 IPv6,除了地址设置之外,还需要设置诸如网关、一些系统sysctl变量以控制网络行为等等,以设置一个基本的IPv6环境。如果这些设置通过手工的方法来进行的话,通常比较麻烦,幸运的是,通过设置rc.conf变量,FreeBSD能自动配置IPv6基本环境。最基本的变量是 ” ipv6_enable ” ,它就包括了执行自动地址配置、添加组播路由等设置,而 ” ipv6_defaultrouter ” 就用于设置 IPv6的缺省路由地址等等。
有些应用程序, IPv4和IPv6差异比较大,系统提供了它们的IPv6对应版本,例如ping的IPv6版本ping6、ipfw的对应版本ip6fw等等,它们的用法通常是类似的。
# ping6 ::1
而另一些程序对于 IPv6和IPv4没有太大的差别,就可以直接使用IPv6地址,或者使用参数表示是IPv6。例如:
# route add -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject
# route add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject
上述两个指令来源于系统的 rc.network6,用于屏蔽内部地址的数据包。而rc.network6就是系统IPv6初始设置脚本,通过这个脚本可以学习到更多的IPv6设置细节。
需要注意的,为了正常利用网络功能,需要对 IPv6地址进行域名解析,除了正确设置DNS服务器之外,还需要将一些缺省的地址,例如本地地址 ” ::1 ” , ” fe80::1%lo0 ” 等放入 /etc/hosts文件,事实上这都包括在系统缺省安装的hosts文件中了。
2) IPv6 网关支持
与 IPv4不同,IPv6的主机和网关差异比较大,在IPv4中,任何主机都可以打开路由功能,但它是被动的,等待其他系统认可才可以。而在IPv6中,路由器需要主动广播自身,以便告诉网络内的系统进行自动网络配置,告诉上游的路由器设置正确路由。因此,这需要执行两步操作,首先要打开针对IPv6的包转发功能,然后还要运行rtadvd守护进程,进行路由器广播。
通常情况下,这需要设置 ” ipv6_gateway_enable ” 和 ” rtadvd_enable ” 两个变量为 ” Yes ” 。
然而,如果为了正确启动 rtadvd,还需要设置其配置文件,缺省位置为/etc/rtadvd.conf。
default::chlim#64:raflags#0:rltime#1800:rtime#0:retrans#0::pinfoflags#192:vltime#2592000:pltime#604800:mtu#0:
sis0::addrs#1:addr="3ffe:501:ffff:1000::":prefixlen#64:tc=default:
上面是一个简单的例子,但为了提高性能,必然需要对其中的参数进行更细的调整,以适合网络情况。
进一步,可以在系统中运行 route6d等路由交换协议,支持RIP6等动态路由数据交换协议。对于这些涉及比较复杂的路由设置、网络规划内容,由于不是本书主要关心的内容,因此对此感兴趣的FreeBSD用户可以阅读RFC以及有关资料,进一步深入研究IPv6。
3) 升级与迁移
虽然 IPv6肯定是未来网络协议的发展方向,但真正要全面升级到IPv6也是极不现实的,因为有太多的问题存在。因而,将网络移植到IPv6是一个逐步的过程,这个时候也不能脱离现有的网络,依靠现有的IPv4互联网能带来很多便利。因此,就需要一些额外的技术,例如虚拟通道和协议转换等,以便将新网络架构在旧有网络之上。
FreeBSD就对此提供了足够的支持,系统支持gif、stf和faith逻辑网络界面,以便能配置各种虚拟通道,进行协议转换。
u gif通道
人们可以在自己的局域网中非常简单的构建 IPv6网络,但一旦需要将多个IPv6的网络相互连接起来,就遇到种种问题。问题的关键在于,人们已经能够通过IPv4相互连接,因此就没有必要重新购置一套完整的IPv6连接设备。但如果直接在原有的IPv4网络设备上配置IPv6,一方面这些网络设备,是否全部支持IPv6仍然存在问题,另一方面这些网络设备也不一定属于同一个组织,网络设备繁多也对配置工作量提出了很多要求。
因此,直接修改网络设备的配置支持 IPv6是不现实的,而虚拟通道显然是一种有效的解决方法。就是说,将IPv6的数据包,重新使用IPv4包装一次,将这个包通过现有的IPv4网络传输到对方,就不必介意这个网络是否支持IPv6了。当对方接收到数据,再重新解开数据包,获得真实数据。这个过程就相当于一个虚拟的点对点连接的通道,可以将这个通道的端点映射为一个虚拟的网络界面,那么可以直接在这个网络界面上执行IPv6网络配置,而不需要考虑中间的具体传输过程了。
根据这个原则,就可以创建 gif虚拟通道,显然这需要涉及本地的IPv4地址、远端的IPv4地址,这样虚拟通道才能确定两个端点。
首先,创建虚拟通道需要创建虚拟通道设备,通常是 gif0、gif1等等,应该选用一个没有被使用的gif通道设备,或者重新创建它。注意,在FreeBSD 4.1之前,gif通道设备不能随意创建,而是在系统定制的时候确定的,就无法使用下面的创建命令。
# ifconfig gif create
gif0
# ifconfig gif0
gif0: flags=8010 mtu 1280
# ifconfig gif0 destroy
# ifconfig gif0 create
上面的过程展示了使用 create建立通道,使用destroy撤消通道,以及再次创建通道的过程,注意,第一次创建使用的是网络界面的类型,因此ifconfig将创建的设备名自动显示出来,具体的设备序号由系统按顺序确定。而第二次就直接使用一个不存在的虚拟设备名字,ifconfig将直接创建它。
然后就可以为通道指定两端的地址,这需要使用 gifconfig命令,其中第一个地址为本地地址,而第二个地址为对方地址。
# gifconfig gif0 inet 192.168.100.1 192.168.1.1
也可以将创建 gif虚拟界面指令和配置指令放在一起:
# ifconfig gif2 create tunnel 192.168.100.1 192.168.1.1
然后,就可以使用 ifconfig为gif0网络界面设置地址了。
# ifconfig gif0 inet6 3ffe::2 prefixlen 64
当然,真正要使用上面的通道进行通信,还必须在两端同时进行这样的配置,仅仅是一端是不够的。
为了在启动时自动设置 gif通道,首先需要设置gif_interfaces变量,包括具体需要设置的gif通道设备名,然后再对每个通道设备设置其端点地址。下面为设置范例:
gif_interfaces= ” gif0 gif1 ”
gifconfig_gif0= ” 192.168.100.1 192.168.1.1 ”
gifconfig_gif1= ” 192.168.10.1 192.168.111.1 ”
u stf通道
使用 gif通道可以将两个分离的IPv6网络通过IPv4网络连接起来,但是需要注意的是,这个设置需要两端同时手工进行,特别是需要配置特别多的连接的时候,那么