一、6to4自动隧道概述
我们来回顾一下6to4手工隧道(也叫做配置隧道)的配置:
Ipv6 unicast-routing
Interface serial0/0
ip address 10.1.12.1 255.255.255.0
Interface fa1/0
Ipv6 enable
Ipv6 address 2001:0001::FFFF/64
Interface tunnel 0
Ipv6 enable
tunnel mode ipv6ip
tunnel source serial 0/0
tunnel destination 10.1.23.3
ip route 0.0.0.0 0.0.0.0 10.1.12.2
Ipv6 route ::/0 tunnel 0
我们注意到,对于tunnel的配置,需要制定tunnel的destination,这样一来,如果隧道比较多,这种配置就变的非常笨重了,而且可扩展性太差。
看上图:路由器A及B分别是两个站点(的出口路由器,并且都是IPv4及IPv6双栈路由器)。两边都申请到一个IPv4公网地址,使用这个公网IPv4地址进行映射得到全球唯一的6to4 IPv6地址,这个IPv6地址/48位,空间非常大,用于站点内的IPv6用户。如此一来,当站点A内的IPv6用户访问站点B的IPv6用户时,IPv6数据包发送到A,那么A根据IPv6数据报头中的目的IPv6地址,得到对应的IPv4全局IP,那么就将原始的IPv6数据包进行封装,套上6to4隧道的IPv4的头,然后将这个数据包放入IPv4网络进行路由,直到到达B。
接下去,我们来看一下数据包交互的详细过程:
A拿到的IPv4公网地址是132.214.1.10,而B是206.123.31.200。
A和B分别使用这个IPv4公网地址来映射得到6to4地址空间,6to4地址空间使用2002::/16,而6to4地址的形成如下:
2002:IPv4地址:子网ID::接口ID
上面的IPv4地址,就是A或B拿到的那个公网IPv4地址,注意,这个公网IP非常重要,此公网IP的变化,有可能导致IPv6站点内IPv6不得不重新编址。
而且,当然,这个IPv4地址不能使用私有IPv4地址。
得到6to4 IPv6地址空间后,这个地址空间是16+32=48bits,也就是/48的,因此空间非常大,你可以进一步的进行子网的划分,这个IPv6的地址空间就将用于站点内网。数据交互过程如下:
上面的例子,A拿到的IPv4公网地址:132.214.1.10,映射得到2002:84d6:010a::/48,这个地址空间的一部分最终被用在了PC1上。现在,PC1要给PC2发送一个IPv6的数据。这个数据的源IP是PC1的IPv6全局唯一地址:2002:84d6:010a:1::1,目的IP为PC2的IPv6全局唯一地址:2002:ce7b:1fc8:2::2,这个IPv6报文被送到了PC1的默认网关也就是路由器A,
A是一台6to4路由器,它会查看这个IPv6数据包的包头里的目的IPv6地址,它发现这个IPv6目的地地址是一个6to4地址,因此,它计算得出这个6to4 IPv6地址对应的IPv4公网IP,然后,为这个原始的IPv6数据进行封装,加上一个新的IPv4的头,而这个IPv4的头源地址是132.214.1.10,目的地址刚才通过计算得出的那个IPv4地址,正是206.123.31.200。然后,这个新的IPv4数据包进入因特网,最终被传送到B
B将报文的IPv4头除去,得到原始的IPv6数据,转发给PC2。
机制补充
上面提到的IPv4地址是为IPv6孤岛申请的公有地址,在IPv6/IPv4边界路由器(6to4路由器)上配置该v4地址,可以直接为连接公网接口的IP,也可以是Loopback接口的IP,这个IP同时是6to4 tunnel的source。内部节点(本地IPv6站点)如果使用6to4地址,目标网络可以是6to4网络,也可以是普通的IPv6网络(非6to4网络)。
隧道的源ipv4地址手工指定(就是前面提到的IPv4地址),隧道的目标ipv4地址不需要显式配置(路由器动态建立隧道),根据通过隧道转发的IPv6报文决定,如果IPv6报文的目的地是6to4地址,则从目的ip中提取ipv4地址,如果目的地不是6to4地址,那么就需要使用6to4中继。
所以6to4隧道是自动完成查找和建立的,无需手工配置tunnel的destination,相比配置隧道,可扩展性要更高。
6to4中继
之前我们所讲的,都是两个IPv6孤岛都使用的是6to4的IPv6地址空间。6to4边界路由器在收到发送往6to4网络的IPv6数据,能够从目的IPv6地址中得到对应的公网IPv4地址从而进行转发。但是,如果IPv6孤岛使用的不是6to4地址空间,而是像2001::/16这样的常规可聚合全球单播地址呢?这就需要使用6to4中继了。
我们看上面的图,其实利用6to4自动隧道技术,IPv6孤岛既可以使用6to4 IPv6地址空间,也可以使用普通的IPv6地址空间,上图中,R1上挂的IPv6孤岛使用6to4地址空间,R3上的IPv6孤岛也是6to4空间,而R2这台因特网上的6to4路由器同时也连接到了IPv6的因特网和IPv4因特网,因此他具有IPv6公网的路由。所以,R1、R3下的两个6to4孤岛的互相访问,解决方案我们前面已经讲过了,但是R1或R3如果需要访问非6to4的IPv6网络呢?就需要R2了,R2此时是一台6to4中继路由器。此刻,R2通过其自身的一个IPv4公网IP,得到一个6to4的IPv6全球可聚合单播地址,这个IPv6地址用于响应其他6to4路由器的隧道建立请求。
我们拿R1举例,在R1上,配置可能如下:
Interface loopback0
Ip address 132.214.1.10 255.255.255.0
Interface fast0/0
Ipv6 enable
Ipv6 address 2002:84d6:010a:0001:/64 eui-64 !!用于IPv6站点内网的网关
Interface tunnel1
Ipv6 enable
Ipv6 unnumbered fast 0/0
tunnel source loopback0
tunnel mode ipv6ip 6to4
!
Ipv6 route 2002::/16 tunnel1 !!当本地访问远端的6to4网络时,走tunnel
Ipv6 route ::/0 2002:ce7b:1fc8:1::1 !!当访问的远端IPv6网络使用的地址空间不是6to4时,走默认路由,这时候会找下一跳,也就是
经过上述配置,当R1所连接的IPv6岛屿中用户要访问其他6to4网络时,那么R1就从目的6to4 IPv6地址中得到IPv4公网IP,然后将隧道IPv4数据包转发到目的地的6to4路由器。而如果R1所连接的IPv6岛屿中用户要访问非6to4的IPv4网络时,就需要求助于6to4中继,也就是R2,那么怎么找到R2呢?
首先R2自己通过自己的IPv4公网地址映射得到一个6to4地址空间,R2给自己分配了这个6to4 IPv6地址空间中的一个地址(2002:ce7b:1fc8:1::1),以便其他6to4路由器能够找到自己。而对于R1这样的6to4路由器,只需添加一条默认路由:Ipv6 route ::/0 2002:ce7b:1fc8:1::1即可,这样一来R1所连接的IPv6岛屿中用户要访问非6to4的IPv4网络时,数据被这条默认路由所匹配,下一跳为2002:ce7b:1fc8:1::1,这是一个6to4地址,于是R1首先根据这个地址得到其对应的IPv4地址:206.123.31.200,然后将对2002:ce7b:1fc8:1::1再进行路由表的递归查找,发现要从tunnel1接口扔出去,于是给原始的IPv6数据压上新的IPv4隧道头,源地址为隧道的IPv4源地址132.214.1.10,目的地址为206.123.31.200。这个数据包就这么到了R2。
在因特网上,像R2这类6to4中继路由器还是有不少的。有一些公共的6to4中继。例如:6to4.ipv6.microsoft.com等。
二、6to4自动隧道技术实验
【实验1】两边内网都是用6to4地址(双方都是6to4网络)
R1路由器申请的ipv4公网地址为 202.101.12.1;R3申请的公网地址为202.101.23.3
有了公网地址,我们也就有了根据公网地址计算得来的6to4的地址空间:
2002:IPV4地址映射:子网ID::/48 前面48位是2002+ipv4的公网地址,后面64位是接口ID
例如R1公网地址为:202.101.12.1,那么对应的6to4地址空间就是:2002:CA65:0C01::/48
这个地址空间加上子网ID,就可以分配给内网用户了,这个实验我们内网用户采用无状态自动配置获取地址。
这时候,如果R1下有用户要访问R3下的v6网络,那么目的地址肯定是R3的6to4地址空间,数据到了R1后,R2一看,发现是2002的ipv6地址,于是它就直接去读2002后面的32位,将其转换成ipv4地址,并作为6to4的tunnel destination。(红茶三杯 原创博文,版权所有,转载请注明出处http://weibo.com/vinsoney)
R1的配置如下:
ipv6 unicast-routing
!
interface Tunnel0
ipv6 enable
tunnel source Serial0/0 !! 注意,不用指destination,因为是动态的
tunnel mode ipv6ip 6to4
interface fast1/0
ipv6 address 2002:CA65:0C01::FFFF/64
ipv6 enable
interface Serial0/1
ip address 202.101.12.1 255.255.255.0
!
ipv6 route 2002::/16 Tunnel0
R2的配置如下:
ipv6 unicast-routing
!
interface Tunnel0
ipv6 enable
tunnel source Serial0/0
tunnel mode ipv6ip 6to4
interface fast1/0
ipv6 address 2002:CA65:1703::FFFF/64
ipv6 enable
interface Serial0/1
ip address 202.101.23.3 255.255.255.0
!
ipv6 route 2002::/16 Tunnel0
PC(用路由器模拟)使用无状态自动获取地址: ipv6 address autoconfig default
【实验2】两边的IPv6孤岛都是使用普通的IPv6全局地址
两端均为普通Ipv6网络,使用常规的全局Ipv6地址。
R1及R3分别申请公网Ipv4地址,配置动态6to4隧道。
以R1为例,配置tunnel0,分配一个Ipv6地址(6to4地址),这个地址正是R1的V4外网地址对应的IPV6 6to4地址,也即202.101.12.1对应2002:CA65:0C01::1/48,R3同理。接下来其实就是静态路由的把戏了。这时,内网有数据去往2001:0002::/16网络时,数据被送到2002:CA65:1703::FFFF(下一跳,也就是R3的tunnel 6to4地址)
路由器通过递归查询到,下一跳2002:CA65:1703::FFFF应该扔到tunnel0,而tunnel0是6to4隧道,于是将2002:CA65:1703::FFFF翻译成对应的V4地址,也就是202.101.23.3
本文转自:http://weibo.com/vinsoney