陈 利
(芜湖职业技术学院网络工程学院,安徽芜湖 241003)
关键字:IPv6隧道;封装;抓包;分析;隧道中继
现阶段,绝大多数网络仍然采用IPv4 协议,称为IPv4 网络.IPv4 网络本身固有的缺陷使得其被IPv6 网络取代成为必然.但IPv4 网络要完全过渡到IPv6 网络还需要相当长的一段时间[1].在IPv4 和IPv6 共存时期,诸如IPv4 网络与IPv6 网络能否互访、如何互访,IPv6 网络如何跨越IPv4网络实现通信等问题,是目前网络通信中面临的现实问题.
借助IPv6 过渡技术可以解决上述一系列问题.IPv6 过渡技术概括起来分为双协议栈技术、隧道技术和网络地址转换及协议转换技术[2].在网络设备上同时启用IPv4 协议栈和IPv6 协议栈,其与IPv4 网络、IPv6 网络通信时分别使用IPv4 协议、IPv6 协议即为双协议栈技术.该技术是应用最广泛、最基础的IPv6 过渡技术.
在网络应用系统中,隧道技术是将一种协议的报文封装在另一种协议中后再进行传输的技术,它实质上是数据的多次封装技术[3].IPv6 过渡技术中的隧道技术针对IPv6 报文再封装IPv4 报头,从而实现在IPv4 网络中传输IPv6 数据的目的[4].通过IPv6 隧道技术可以实现IPv6 网络跨IPv4 网络互通的目的,从而解决当前以IPv4 技术为主的网络中的IPv6 孤岛互连互通问题[5].
对于IPv4 网络中的IPv6 隧道来说,在隧道的源端将IPv6 报文封装IPv4 报头,在隧道的终端解封装IPv4 报头后将IPv6 报文交由IPv6 网络处理.隧道技术仅要求其两端的设备能够支持隧道及双协议栈技术,而网络中的其他设备则无特别要求.因此,隧道技术实现方便,是当前主流的IPv6 过渡技术之一[6].本文在GNS3 模拟器中完成了多种IPv6 隧道的配置,抓包分析了它们的封装,并结合IPv6 隧道中继实现了IPv6孤岛的互联互通.实验网络拓扑如图1 所示.各设备按图示配置网络参数及路由协议,IPv4 网络、IPv6 网络已各自全网互通,路由器R1的F0/0口通过GNS3 中的网云桥接到IP 地址为172.18.165.249/24的win7 主机上.
图1 实验网络拓扑
作为IPv6过渡技术之一的IPv6隧道可以两两建立在设备、主机之间,依据隧道解封装端的IPv4地址是从IPv6 地址中自动获取还是手工配置,可将IPv6隧道分为自动隧道和手工隧道两大类[7].下面先介绍配置、理解起来较为简单的手工隧道.
隧道终点的IPv4 地址需要手工配置的叫手工隧道,包括IPv6-over-IPv4 GRE 隧道(简称GRE 隧道)和手动隧道两种.如果配置隧道时的模式选择为GRE,则其为GRE隧道.其隧道模式的配置命令为tunnel mode gre ip.在GNS3 中的思科设备上,GRE 隧道是默认的隧道技术.如果配置时的模式选择为IPv6-IPv4,则为手动隧道.其隧道模式的配置命令为tunnel mode ipv6ip.手工隧道在配置时不仅要配置隧道的源,还要配置隧道的目的.手工隧道是点到点链路,通常是建立于路由器之间的稳定连接,可以实现IPv6孤岛跨IPv4网络互通.但由于隧道两端都需要配置源与目的,当需要互连的IPv6 孤岛较多时,则隧道配置及管理的工作量巨大.
IPv6 自动隧道是指隧道终点不需要专门配置,而是从IPv6 报头特定格式的目的地址中自动分离的一种隧道技术.配置自动隧道时,不需要像配置手工隧道时那样既指出隧道的源又指出隧道的目的,它只需要配置隧道的源即可实现跨IPv4网络的IPv6 网络的互通.此时隧道的目的可以根据一定的规则从IPv6 报文中自动获取.要实现从IPv6 报文的目的地址中自动获取IPv4 地址(即隧道的目的),一般通过将IPv4地址内嵌到IPv6地址中的特殊形式实现.常见的IPv6 自动隧道可以细分为IPv4 兼容IPv6 自动隧道、6to4 隧道、ISATAP隧道及6PE 隧道等几种.6PE 隧道建立在MPLS/VPN网络上,相对复杂,限于篇幅本文不做讨论.
1.2.1 IPv4兼容IPv6自动隧道
IPv4 兼容IPv6 自动隧道也简称为自动隧道.隧道源端采用IPv4 兼容IPv6 地址::x.y.z.t/96 这一特殊地址格式,其中x.y.z.t 是IPv4 地址,配置时以16 进制形式出现.通过特殊的IPv6 地址中内嵌IPv4 地址的方式实现了IPv6 隧道终端的自动确定,隧道建立方便.由于此种IPv6 隧道必须借助IPv4 兼容IPv6 地址形式,本质上仍依赖匮乏的IPv4 地址,使用时有很大的局限性.受限于IPv4 兼容IPv6 地址已被弃用[8],此种隧道目前已很少见.其隧道模式的配置命令为Tunnel mode ipv6ip auto-tunnel.
1.2.2 6to4隧道
6to4 隧道是指借助特定格式的6to4 地址形成的跨IPv4 网络的IPv6 隧道,实现了跨IPv4 网络的IPv6 孤岛的互通.该隧道从特定格式的IPv6 报文的目的地址中自动分离出隧道终点的IPv4 地址,实现了跨IPv4 网络的IPv6 隧道的自动建立.实现此功能特定格式的6to4 地址前缀规定为2002:x.y.z.t::/48.其中2002 是规定的IPv6 地址前缀,x.y.z.t表示该隧道对应的32 位IPv4 地址,配置时以16 进制形式出现,如2.2.2.2 则应该表现为202:202.这种在IPv6 地址中嵌入IPv4 地址的形式,实现了6to4 隧道的自动建立,相对于手工隧道来说,该方式易于隧道的扩展,简化了隧道的配置,方便了隧道的管理.除去特定的2002 先导及内嵌的IPv4 地址,6to4隧道还可以自定义16位值,形成64位网络前缀,而64 位的接口ID 可以手工配置,也可以自动生成.该隧道模式的配置命令为tunnel mode ipv6ip 6to4.
1.2.3 ISATAP隧道
ISATAP 是Intra-Site Automatic Tunnel Addressing Protocol的简称,中文意为站内自动隧道寻址协议.ISATAP协议不仅能实现自动隧道,还能在隧道两端设备之间运行ND 协议,从而实现IPv4网络中的设备自动配置IPv6 地址的功能.与6to4隧道类似,ISATAP 隧道的地址也有特定格式,它的64 位接口ID 必须为0:5EFE:a.b.c.d.其中0:5EFE 为IANA 规定的固定值,a.b.c.d 是以16 进制形式嵌入到IPv6 地址最后32 位的单播IPv4 地址.位于IPv4 网络中的ISATAP 主机的64 位前缀可以通过向ISATAP 路由器发送ND 协议自动获得.该隧道模式的配置命令为tunnel mode ipv6ip isatap.
IPv6 隧道的配置,一般需要经过四步:第一步,要创建并进入隧道接口.在全局配置模式下使用命令interface tunnel XX进行.其中XX为隧道编号,本地有效.第二步,配置隧道的模式,在tunnel接口下使用命令tunnel mode 进行.配置时可以根据实际需要选择合适的模式.一般隧道较少且相对固定时,其模式可以选择手工隧道;如果隧道较多,且不固定时,其模式可以选择自动隧道.不同类别的隧道需要选择合适的隧道模式,并且需要保证隧道两端使用的模式相同.否则,隧道可能因为封装、解封装失败而不能正常建立.第三步,根据选择的隧道模式,配置隧道的源,或者源与目的.由于隧道是跨IPv4 网络的,因此隧道的源为IPv4地址(或源接口),用命令tunnel source XXXX 实现.若需要配置隧道的目的,使用命令tunnel destination XXXX 实现.不管是手工隧道,还是自动隧道,隧道的源和目的必须IP 可达.第四步,由于配置的是IPv6 隧道,因此需要使用IPv6 address 命令为隧道配置IPv6 地址.该地址要根据配置的隧道类别不同,采用不同的特定格式.
不同的IPv6 隧道外在差异表现在配置命令不同,本质区别在于隧道的封装上.基于图1的网络拓扑,在GNS3中配置并抓包比较各种IPv6隧道的封装,以加深对隧道技术的理解.实验中路由器设备的IOS为12.4版本.
不管是手工隧道还是自动隧道,隧道的源必须配置.对于手工隧道还必须配置其目的.为方便起见,本文tunnel两端的IPv6地址均配置为同一网段地址,避免了tunnel两端地址不在同一网段需要配置转发路由的问题.
2.1.1 IPv6 GRE隧道配置及抓包
GRE 是Generic Routing Encapsulation的 简称,即通用路由封装协议.该协议可以封装多种网络层协议报文,实现在IPv4 网络中传输被封装数据的目的[9].GRE 隧道是最传统的隧道技术,通过多次封装GRE可以在两个远程网络之间模拟出直连链路,达到直连的效果.此时,图1 中R2 与R3 相当于通过tunnel 直接互联,图1的网络拓扑可简化为图2 所示.为了使图2的IPv6 网络全网互通,可以将tunnel口宣告进原IPv6网络的RIPng协议中.
图2 配置手工隧道后的简化图
图2 中配置IPv6 GRE 隧道时,R2 上的关键配置如下:
R2(config)#interface tunnel 2//创建并进入tunnel口,编号2本地有效;
R2(config-if)#tunnel mode gre ip//设置tunnel的模式为gre,默认,可省;
R2(config-if)#tunnel source 2.2.2.2//设置tunnel的源;
R2(config-if)#tunnel destination 3.3.3.3//设置tunnel的目的;
R2(config-if)#ipv6 address 2003::2/64//设置tunnel的ipv6地址;
R2(config-if)#ipv6 rip A enable//宣告tunnel口进RIPng路由协议.
R3 上的关键配置与此类似,注意将tunnel的源和目的互换.配置完成后,在R6 路由器上通过命令ping ipv6 5::7 测试两端IPv6 网络的连通性,结果可通,实现了IPv6 网络跨IPv4 网络互通的目的.在IPv4 网络中收发数据的任一接口抓包,结果如图3 所示.从图3 可知,ICMPv6的Echo request报文先封装了IPv6的报头,源为4::6,目的为5::7;再封装了GRE 头;最后封装了IPv4 报头,源为2.2.2.2,目的为3.3.3.3,分别为配置tunnel时的源和目的.正是由于封装了这个IPv4 报头,才使得IPv6的报文能够在IPv4 网络中传输,实现了跨IPv4 网络的IPv6孤岛的互通.
图3 IPv6 GRE封装
GRE 隧道的优势在于其可以封装很多种网络层协议,而不仅仅是IPv6.但GRE 在隧道两端的封装、解封装过程,以及由于多次封装增加了报文长度,会导致启用GRE的设备转发效率的下降.
2.1.2 IPv6手动隧道配置及抓包
针对IPv6 孤岛的连通需求来说,完全可以使用IPv6 手动隧道替代IPv6 GRE 隧道.IPv6 手动隧道的配置与IPv6 GRE 隧道非常相似,在保持网络环境及其他配置不变的情况下,只需要通过命令tunnel mode ipv6ip 修改隧道模式为ipv6ip 即可.同IPv6 GRE 隧道一样进行抓包,结果如图4 所示.可见,IPv6手动隧道对ICMPv6报文在封装了IPv6报头后,直接封装了IPv4报头.
图4 IPv6手动隧道封装
隧道模式的改变意味着报文封装的改变.在实现既定功能的情况下,IPv6 手动隧道的报头结构较IPv6 GRE报头封装简单,报头长度减小,设备转发效率较高.只是此模式仅能对IPv6 报文进行IPv4 报头的再次封装,而不能对其他协议的报文进行再封装.
IPv6 手工隧道易于理解,便于实现.但由于手工隧道既需要配置源,又需要配置目的,当隧道数量增加时,其配置、管理、维护的工作量大大增加.此时,自动隧道的优势就非常突出了.自动隧道利用内嵌IPv4 地址的特殊IPv6 地址,从IPv6 报文中自动确定隧道终点,实现了隧道的自动建立,大大简化了隧道的配置和管理工作.
2.2.1 IPv4兼容IPv6隧道配置及抓包
作为IPv6 自动隧道之一的IPv4 兼容IPv6 隧道,其配置与其他IPv6 隧道的配置大致相同.由于其IPv6地址为IPv4兼容地址,因此,该地址不需要用ipv6 address进行配置,只要确保隧道模式正确,即可以根据隧道IPv4源地址自动生成.针对图1所示的网络拓扑,在路由器R2上其关键配置如下:
R2(config)#interface tunnel 2//创建并进入tunnel口,编号2本地有效;
R2(config-if)#tunnel mode ipv6ip auto-tunnel//设置tunnel的模式为IPv4兼容IPv6自动隧道;
R2(config-if)#tunnel source 2.2.2.2//设置tunnel的源.自动隧道,不必设置隧道的目的;特殊IPv6地址格式,自动生成,不需专门配置.
R3上配置类似,不再赘述.
自动隧道只指定了源,其目的是根据实际访问的IPv6 网络不同而动态自动生成的.因此,自动隧道的Tunnel 口并没有像手工隧道那样宣告进IPv6 网络的路由协议中.由于对端不确定,即使将tunnel口宣告进IPv6网络的路由协议中,本端IPv6网络也学习不到对端IPv6 网络的路由.一般情况下,为了使IPv6 网络能够通过自动隧道跨IPv4 网络互通,需要在隧道的源端设备上配置IPv6 静态路由,其出接口指定为创建的tunnel 口.这样,当IPv6的报文匹配此路由时,数据包从tunnel 口发出,从而对其再封装IPv4头后在IPv4网络上传输.
为了使本端IPv6 网络中的所有设备都能通过IPv6 自动隧道访问对端IPv6 网络,可以在隧道源端设备上将配置的静态路由引入到IPv6 网络的路由协议中.或者,为了减少IPv6 网络的路由表条目,可以在隧道源端设备上下放默认路由,将非本网络的IPv6 数据流引向此设备,再匹配该设备上配置的静态路由后从Tunnel 口发出.针对本拓扑所用的RIPng协议,其下放默认路由通过在F0/0接口下执行ipv6 rip A default-information originate 命令实现.
路由器R2、R3上的IPv4兼容IPv6隧道配置完成 后,在R2 上 执 行 命 令ping ipv6 ::303:303 source::202:202,可通.在IPv4 网络中抓包,结果如图5 所示.可见,针对ICMPv6的Echo request 报文,先封装了IPv6 报头,其源、目的IPv6 地址是IPv4兼容IPv6地址,即ping ipv6命令的源、目的地址.
图5 IPv4兼容IPv6隧道抓包
该报文在R2上发出时,匹配到R2上的直连路由::/96,从tunnel 口发出,进行隧道的IPv4 再封装.其目的地址从IPv6 报文中的目的IPv4 兼容IPv6 地址中自动获取到3.3.3.3,源地址为tunnel 口的源地址2.2.2.2.由于源2.2.2.2 与目的3.3.3.3 在IPv4 网络中互通,因此,数据包能在IPv4 网络上顺利传送.路由器R3 收到此报文后,先进行IPv4 解封装,取出IPv6 报文,送给IPv6 协议栈处理;回复ICMPv6的Echo reply 报文,处理过程类似.隧道建立成功.
但是从该测试对报文的封装过程也可以看出一些问题.针对IPv4兼容IPv6隧道来说,由于其进行隧道IPv4 封装时,需要借助目的IPv6 地址获取到目的IPv4 地址后才能正常封装,因此,当目的IPv6 地址不是合法的IPv4 兼容IPv6 地址时,则获取目的IPv4 地址失败,导致IPv6 报文不能进行正常的隧道封装,报文被丢弃,网络不通.
作为早期的IPv6 自动隧道技术,IPv4 兼容IPv6 地址隧道受限于地址格式的规定,隧道的建立和应用依赖单播IPv4 地址,不适合大规模部署.目前该技术已逐渐被6to4隧道取代[10].
2.2.2 6to4隧道配置及抓包
6to4 隧道是第二种IPv6 自动隧道,也是当前主流的IPv6 隧道.其配置除按IPv6 隧道的一般操作进行外,需要注意隧道的IPv6 地址格式要按规定采取6to4 地址形式.这也是6to4 隧道名称的来由.针对图1的6to4 隧道在路由器R2 上的关键配置如下:
R2(config)#interface tunnel 2//同前;
R2(config-if)#tunnel mode ipv6ip 6to4//设 置tunnel的模式为6to4 自动隧道;
R2(config-if)#tunnel source 2.2.2.2//设 置tunnel的源.自动隧道不必设置隧道的目的;
R2(config-if)#ipv6 address 2002:202:202:2::2/64//6to4 规定地址格式.
R3 上配置类似,不再赘述.
为了让跨IPv4 网络的IPv6 报文能够从tunnel 口发出及方便起见,分别在R2、R3 上配置IPv6 默认路由,出接口为tunnel 口.R2 上的具体配置如下:
R2(config)#ipv6 route ::/0 tunnel 2.
配置完成后,在R2 上通过命令ping ipv6 2002:303:303:3::3 source 2002:202:202:2::2测试两端的连通性,可通.该过程抓包结果如图6 所示.
图6 6to4 隧道抓包细果
从图6 可见,6to4 隧道的封装与IPv4 兼容IPv6 隧道的封装形式及封装过程类似.不同的是它们的隧道IPv6 地址格式.其隧道的IPv4 地址来源也类似,目的IPv4 地址从特定格式的目的IPv6 地址中自动获取,源IPv4 地址为tunnel的源.将图6 中的IPv6 封装头展开后,可见由IPv6地址自动分离出的IPv4 地址,如图7 所示.
图7 6to4 隧道抓包分析图
如同IPv4 兼容IPv6 隧道一样,受制于隧道IPv6 地址格式的规定、隧道的IPv4 源、目的地址的获取方式及封装过程限制,若要实现隧道两端的IPv6 网络互通,要求IPv6 网络中设备的地址具有与tunnel 口IPv6 地址相同的48 位前缀,即6to4 隧道仅可以直接连通6to4 网络.图1 所示的网络环境下,路由器R6 上执行ping ipv6 5::7是ping 不通的,并不能实现通过6to4 隧道连通IPv6 孤岛的目的,其原因就在于测试的地址不是合法的6to4 地址.将IPv6 网络中所有设备的地址按格式要求更改后,确保IPv6 路由正常,即可实现6to4 隧道连通IPv6 孤岛的功能.
2.2.3 ISATAP 隧道配置及抓包
ISATAP 隧道可以实现IPv4 网络中的双栈主机与IPv6 网络互通,隧道源端建立在IPv6 网络中的设备上.借助运行在ISATAP 隧道两端设备之间的ND 协议,可以实现双栈主机的IPv6 地址自动配置.其64 位前缀通过向ISATAP 路由器发送RS 请求获得,64 位接口ID 自动生成,格式为0:5EFE:x.y.z.t.其中x.y.z.t 为双栈主机的IPv4 地址.针对图1 网络拓扑结构,ISATAP 隧道源端R2设备上的关键配置如下:
R2(config)#interface tunnel 22//同前;
R2(config-if)#tunnel mode ipv6ip isatap//配置隧道模式为isatap;
R2(config-if)#tunnel source 2.2.2.2//配置隧道的源;
R2(config-if)#ipv6 address 2001::5efe:202:202/64//配置isatap 隧道的ipv6 地址,格式需要严格按规定进行;
R2(config-if)#no ipv6 nd ra suppress//允 许tunnel 口发送RA 报文.
IPv4 网络中的双栈主机除需要与ISATAP 隧道的源IP 可达外,其配置还与操作系统有关.以win7 系统为例,在确保microsoft isatap adapter 虚拟网卡正常的情况下,在cmd 命令行中执行netsh interface isatap set state enable 命令使能ISATAP 隧 道;执 行netsh interface ipv6 isatap set router 2.2.2.2 命令,设置默认路由器.设置完后,双栈主机即会主动向路由器2.2.2.2 发起RS 请求,路由器R2 收到ISATAP的RS 请求后,会返回一个带有前缀信息2001::/64的RA.再根据ISATAP的IPv6 接口ID 生成方式,双栈主机会自动生成一个IPv6 地址和一个默认IPv6 网关.如图8所示.
图8 ISATAP双栈主机自动生成的IPv6地址及网关
在双栈主机上通过命令ping-6 2001::5efe:202:202测试连通性,可通,ISATAP隧道建立成功.此时在IPv4 网络中抓包,结果如图9 所示.其封装过程如下:
图9 ISATAP抓包结果一
首先,双栈主机根据Ping-6 命令将ICMPv6的报文封装IPv6 报头,源IPv6 地址为双栈主机上自动生成的ISATAP 虚拟网卡地址.该IPv6 报文源、目的在同一网段,直接从ISATAP 隧道发出.双栈主机依据ISATAP 隧道的地址格式规定,从IPv6 报文中获取到IPv4 报文的源和目的,进行IPv4 报头的再次封装后将其发到IPv4 网络上.在IPv4 网络上,数据包按IPv4 路由正常转发到路由器R2.在R2 上报文经过两次解封装后上送上层协议.上层协议回应该ping 包,并对其进行两次封装后返回给双栈主机,一次通信结束.
在IPv6 网络全网互通且将ISATAP 接口宣告进RIPng(或者通过ISATAP 路由器下放默认路由)的情况下,ISATAP主机可以ping通ISATAP路由器所在IPv6 网络中的所有设备.在双栈主机上执行命令ping-6 4::6,结果可通.该过程的抓包结果如图10所示,其过程如下:
图10 ISATAP抓包结果二
首先,双栈主机根据执行的ping-6 命令对icmpv6 报文进行IPv6 封装.由于IPv6 报文的源、目的不属于同一子网,则双栈主机从其IPv6 默认网关(即IPv6 路由的下一跳)的地址中取出IPv4 地址作为IPv4 封装的目的地址,即2.2.2.2,源IPv4 地址即ISATAP 主机的IPv4 地址仍然从源IPv6 地址中获取.封装后,报文在IPv4 网络上传送到ISATAP路由器R2.路由器R2 接收该报文后解封装IPv4 头露出IPv6 头,R2 按IPv6 路由将其发送到目的主机(路由器R6).目的主机解封装IPv6报头,数据上送上层协议并回应,回应报文封装IPv6 头(源、目的IPv6地址与接收时互换)并依据通过RIPng 学习得到的ISATAP 隧道明细路由或者RIPng下放的默认路由传送到路由器R2.ISATAP路由器R2依据IPv6报文的目的地址,将报文从ISATAP 隧道发出,封装的IPv4 源地址为隧道的源,IPv4 目的地址从IPv6 目的地址中获取.最后,报文在IPv4 网络中传送到双栈主机,经过解封装后,完成一次通信过程.
前述针对图1的IPv6 自动隧道仅测试了隧道两端tunnel 口的连通性及ISATAP 主机与ISATAP路由器所在IPv6 网络的连通性.事实上,由于图1中IPv6 网络的地址规划不满足特定格式的规定,在当前配置下,两个IPv6 网络不能互通.同时,ISATAP 主机也不能与ISATAP 路由器所在网络以外的IPv6网络互通.
仔细分析以上问题发现,IPv4 报文封装失败是导致不通的原因.如6to4 隧道中在路由器R6 上执行ping IPv6 5::7 操作,其报文处理过程如下:在R6 上,路由器根据执行的命令将ICMPv6的Echo request 报文进行IPv6 封装,其目的为5::7,源默认为发出该报文的接口的地址4::6;该报文依据隧道源端路由器R2下放的默认路由传到R2;在R2 上,报文依据其上配置的默认路由从tunnel口发出,对该报文进行IPv4再次封装;其IPv4源地址为隧道的源2.2.2.2,而IPv4的目的地址应该从IPv6 报文的目的地址5::7 中获取.由于该地址不满足6to4 地址的规定,获取不到IPv4 目的地址,导致IPv4封装失败,报文被丢弃.
要解决这类因隧道封装失败而导致IPv6 孤岛不能连通的问题,就要用到6to4 中继.所谓6to4 中继,即6to4 隧道中提供中继功能的路由器.当6to4隧道发出的IPv6 报文的目的地址非6to4 地址时,为实现隧道正常封装IPv4 源和目的,配置其转发路由的下一跳为6to4 地址,而隧道的IPv4 目的地址即从该6to4 下一跳地址中获取.该下一跳路由器即为6to4 中继路由器[10].针对图1 来说,R3 可配置为左边IPv6 网络的6to4 中继;R2 可配置为右边IPv6网络的6to4中继.
在R2 上配置R3 为左边IPv6 网络的6to4 中继的方法如下:
IPv6 route::/0 2002:303:303:3::3//默认路由的下一跳为R3的6to4地址;
IPv6 route 2002:303:303:3::/64 tunnel2//配置明细路由,出接口为tunnel口.
在R3 上配置R3 为左边IPv6 网络的6to4 中继的方法如下:
IPv6 route::/0 2002:202:202:2::2//同前;
IPv6 route 2002:202:202:2::/64 tunnel3//同前.
配置完成后,在路由器R7 上执行命令ping IPv6 4::6测试连通性,可通.该过程抓包结果如图11所示.
图11 6to4中继测试抓包
从抓包结果可见,针对非6to4 地址的两个IPv6 网络的ping 包,正确封装了6to4 隧道的源、目的IPv4 头,从而实现了互通.在这里从非6to4 地址如何获取到正确的源、目的IPv4 地址,需要从数据包的封装过程进行分析.在R7 上,根据执行的命令为ICMPv6的Echo request 报文添加了IPv6 头,其目的为4::6,源为5::7.该报文按RIPng 下放的默认路由被传送到R3 上.在R3 上,该报文匹配到静态默认路由,数据包发往2002:202:202:2::2.但2002:202:202:2::2 并非R3的直连网络,因此数据包并不能直接发送.路由器需要递归查找到2002:202:202:2::2的路由,结果匹配到配置的静态路由,数据包从tunnel3 口发出.注意,此时的数据IPv4封装,其源为tunnel3口的源3.3.3.3,目标为从2002:202:202:2::2 这个6to4 下一跳地址中获取的2.2.2.2.数据包发到R2 解封装Ipv4 头后,按IPv6 路由传送并回应,完成一次通信过程.正是由于路由的递归查找及从IPv6 下一跳中获取目标IPv4 地址的特性,实现了6to4 中继功能,完成了非6to4 网络的连通.回想ISATAP 隧道中,双栈主机可以ping 通IPv6 网络中设备的过程,其从默认IPv6 网关中获取目标IPv4 地址,其过程类似从路由的6to4 下一跳地址中获取目标IPv4 地址.实际上,默认网关就是路由的下一跳,只是此处的下一跳地址为6to4 地址,而ISATAP 隧道中网关为ISATAP 规定格式的地址.当有多个IPv6 孤岛互联时,可以考虑将IPv6 默认路由改为明细路由,并根据具体IPv6网络合理设置明细路由的IPv6下一跳即可.
从6to4 中继解决非6to4 网络连通性问题的过程中得到启发,可以配置类似6to4 中继的功能实现IPv4 兼容IPv6 隧道连通IPv6 孤岛的问题.保证IPv4 兼容IPv6 隧道配置正确的情况下,在R2 上添加如下命令:
IPv6 route::/0::3.3.3.3//默认路由的下一跳为R3的兼容IPv6隧道地址.
在R3上添加如下命令:
IPv6 route::/0::2.2.2.2//默认路由的下一跳为R2的兼容IPv6隧道地址.
配置完成后,在路由器R6 上执行命令ping ipv6 5::7可通.该过程数据封装类似6to4中继.在R6 上的ping 包到达R2 后,匹配默认路由.由于默认路由的下一跳为不可直达的IPv4 兼容IPv6 地址,因此,递归查找路由表.此时,路由器R2 上的IPv6 路由表如图12 所示.递归查找后匹配直连路由::/96,数据从tunnel 口发出.其数据封装抓包如图13所示.
图12 IPv4兼容IPv6隧道中继时的IPv6路由表
图13 IPv4兼容IPv6隧道中继测试抓包
从抓包结果来看,通过配置中继路由器,对普通的IPv6 包进行了IPv4 兼容IPv6 隧道的封装,实现了IPv6 孤岛通过IPv4 兼容IPv6 隧道互通的目的.
实验证明,合理配置IPv6 隧道中继路由器,还可以实现ISATAP 双栈主机与ISATAP 路由器所在网络以外的IPv6 网络的互通.其过程与前述原理类似,不再赘述.
IPv6 隧道6to4 中继的应用,解决了非6to4的IPv6 孤岛的连通问题.然而中继的启用是以耗费系统资源得到的.为避免系统额外的资源开销,6to4 隧道两端的网络最好按6to4 地址格式规划、配置[11].
IPv6隧道作为IPv4网络与IPv6网络共存期间的过渡技术,是跨IPv4 网络连通IPv6 孤岛的必备手段.从各种IPv6 隧道抓包结果分析隧道封装来看,IPv6隧道中除GRE隧道外,都直接采用协议号41,因此,在任何IPv4 网络或者防火墙中需要放过协议41;若使用隧道中继,则要求中继路由器不使用NAT 而直接连接到全球IPv4 网络.在教学过程中,通过分析隧道封装可以加深学生对隧道技术的理解与掌握;在实际使用时,可以根据网络拓扑、隧道的建立方式及转发效率等情况合理选择隧道模式.