专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Unix/FreeBsd » koikame:FreeBSD实现基于KAME计划对IPv6的支持 »正文

koikame:FreeBSD实现基于KAME计划对IPv6的支持

来源: 发布时间:星期四, 2008年12月4日 浏览:4次 评论:0

  自从 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网络连接起来,但是需要注意的是,这个设置需要两端同时手工进行,特别是需要配置特别多的连接的时候,那么

如果本文没有解决您的问题,请进老妖怪开发者社区提问

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: