过渡技术解释
虽然IPV6大力推行,但IPV4已经根深蒂固,改变绝非一朝一夕能完成的事情,中间将存在很长的过渡阶段,就像5G技术,现在5G这么火,可是当前2G还依然存在,这就要求ipv4和ipv6能有一定的兼容性,这种兼容性就是过渡技术,也就是我们这一章节要讲的内容。
有一点需要重要关注,ipv6 over ipv4,是以ipv4为主,以over后面的单词的为主,是以包最里面的IP包头为主,比如ipv6 over ipv4,是用ipv6的报文包裹ipv4的报文发送。
ipv6 over ipv4是用ipv6包裹ipv4报文,那gre over ipsec呢?用gre报文包裹ipsec报文前进。
双栈同时使用
其实我们想一下就能知道这种兼容技术大概有什么内容,我们在电脑的网卡当中会看到有ipv4和ipv6的设置,而且还能同时启用,同时启用v4和v6的技术就叫双栈,是否能同时启用双栈取决于系统或应用是否支持,现今主流的系统和软件都支持的,比如微软从xp时代就已经为过渡技术做好了准备,ipv4和ipv6可同时启用。
过渡前期:ipv6 over ipv4 即是边缘是v4,中间是v6
IPV6和IPV4可以同时启用,那是否可以单独使用,当然可以,可以单独使用IPV4,也可以单独使用IPV6,那你说有没有这种情况?就是电信积极响应国家的号召,将骨干路由器全都改造成IPV6,那边缘的中小企业单位可能反应就就没有那么快,那这种情况下怎么办?比如我们公司,济南总部和其它分公司都是ipv4,但是骨干路由器全变成了ipv6,怎么搞?纯IPV6设备肯定不会转发ipv4的报文的,这里的解决思路与VPN相似,即使不想转发私网地址,那我就使用公网地址将私网包裹起来进行转发,即使线IPV6设备不转发IPV4的报文,那就将IPV4地址用IPV6地址包裹起来转发,这就是过渡前期当中ipv4 over ipv6和GRE技术的核心原理。
其实无论是VPN还是隧道技术都有两种模式,手动or自动,手动就是手工指定对端的IP,自动就不用手工指定对方的地址。
过渡后期:ipv4 over ipv6,以v6为主
附着V6的推行,后期V6肯定会大行其道,肯定是以ipv6为主,于是就有了ipv4 over ipv6技术。
那nat 64是什么技术呢?
可能有一些边缘设备他不支持ipv6,只能使用ipv4,那nat64的意思就是将ipv4的源地址替换为ipv6的地址,类似ipv4的nat。
常见考题
- 手动隧道和自动隧道的区别?目标地址的获取方式不一样,一个是手工添加,另一个自动。
- 6to4隧道
v6 over v4 小案例
我们先来复习一下GRE VPN的原理,为什么复习GRE呢?因为我们发现v6 over v4的原理与GRE非常相似:
原始报文进入防火墙之后,要先路由,路由将其指引到一个tunnel接口,tunnel接口要给原始报文加一个GRE头,然后再加一个新的IP头,然后再路由。上面这段话至关重要,因为这段话不仅是GRE VPN的基本原理,还将你应该如何配置VPN也给体现出来了,最关键的是这是自己的理解。原始报文进入防火墙之后,要先路由,就意味着这一条路由得我们手动添加一下,将其指引到tunnel接口,tunnel接口默认不存在,我们也要配置,给这个接口配置IP地址,尽管这个地方没什么用,而且还要给这个接口配置源IP和目标IP,用于给报文加一个IP头,然后还要再添加一个路由,这一条路由应该是默认路由。
如上图所示,解释一下,两边是ipv6孤岛,中间是ipv4,我们要在AR2和AR3启用ipv6 over ipv4,我们会注意到AR2和AR3各有一个隧道接口并配置了IP地址,这个地址是什么用的?肯定用于将报文路由后指定这个接口封装用的,我们当然要保证两个隧道接口能通,也就是要用路由,不管是静态路由还是动态路由都可以在封装的时候我们要用于隧道的IP地址,如果仅是GRE的话只使用ipv4就可以,但是如果是ipv6 over ipv4的话,还要使用一个ipv6的地址,所以我们会看到上图当中AR2和AR3的隧道接口有两个IP地址,一个IPV4地址,一个IPV6地址。
# lookback接口的存在的意义是什么?就仅仅是存在而已,这个地址可以随便编的,它存在的主要意义是等待tunnel接口的source接口调用 R2: interface look 0 ipv6 enable #ipv6地址可以没有 ip address 2.2.2.2 255.255.255.255 ipv6 address 2::2/64 R3: interface Tunnel0/0/0 ipv6 enable ip address 3.3.3.3 255.255.255.255 ipv6 address 3::3/64 #这个IPV6地址是不是可以没有呢?
# 我们想通过R2有2.2.2.2到R3的3.3.3.3之间建立隧道,首先得先保证这两个接口是通畅的,这里面采用ospf的方式,也可以使用静态路由等 R2的配置: ospf 1 area 0.0.0.0 network 2.2.2.2 0.0.0.0 network 23.1.1.2 0.0.0.0 R3的配置: ospf 1 area 0.0.0.0 network 3.3.3.3 0.0.0.0 network 23.1.1.3 0.0.0.0 #在r2上做测试 dis ip route pro ospf ping -a 2.2.2.2 3.3.3.3
为什么不用宣告tunel接口下的IPV6地址呢?因为在建立隧道的时候只会用的ipv4的地址,那ipv6的是用来做什么的?在数据包封装的时候用不到这个ipv6地址,但这个IPV6地址必须得存在!我认为他是用来兼容ipv6报文的,但没有其它的实际用途。
# 建立隧道 R2: int tun 0/0/0 ipv6 en ipv6 add 2001:2::2/64 tunnel-pro ipv6-ipv4 source 2.2.2.2 destination 3.3.3.3 R3: int tun 0/0/0 ipv6 en ipv6 add 2001:2::3/64 tunnel-pro ipv6-ipv4 source 3.3.3.3 destination 2.2.2.2
如上,为什么隧道接口还要有IPV6的地址?只有IPV4不就行吗?在封装的时候根本都用不到IPV6的地址,只会用到IPV4的地址,我认为这里面的IPV6地址也没有实际用途,意义仅仅是启用IPV6的功能而已。
# 宣告路由,注意在ipv6v3当中宣告路由与ipv4当中宣告路由有一点差别 R1: ospfv3 1 router-id 1.1.1.1 int LoopBack 0 ospfv3 1 area 0.0.0.0 int g0/0/0 ospfv3 1 area 0.0.0.0 R2: ospfv3 1 router-id 2.2.2.2 int g0/0/0 ospfv3 1 area 0.0.0.0 [R2]int Tunnel 0/0/0 ospfv3 1 area 0.0.0.0 R3: ospfv3 1 router-id 3.3.3.3 int g0/0/1 ospfv3 1 area 0.0.0.0 [R2]int Tunnel 0/0/0 ospfv3 1 area 0.0.0.0 R4: ospfv3 1 router-id 4.4.4.4 int LoopBack 0 ospfv3 1 area 0.0.0.0 int g0/0/0 ospfv3 1 area 0.0.0.0 在R1上宣告ospfv3的两个接口 在R2上宣告0/0/0和tunnel,不宣告lookup 在R3也是 R4如R1 # 测试 R1:ping ipv6 1::1 4::4 [R1]dis ospfv3 peer OSPFv3 Process (1) OSPFv3 Area (0.0.0.0) Neighbor ID Pri State Dead Time Interface Instance ID 2.2.2.2 1 Full/Backup 00:00:38 GE0/0/0 0 [R1]dis ipv6 routing-table protocol ospf
疑问整理
疑问一
<R2>dis ipv6 routing-table protocol ospf Destination : 4::4 PrefixLength : 128 NextHop : FE80::303:303 Preference : 10 Cost : 1563 Protocol : OSPFv3 RelayNextHop : :: TunnelID : 0x0 Interface : Tunnel0/0/0 Flags : D
R2路由表当中去往4::4的下一跳FE80::303:303 ,是哪里的地址?
答:
<R3>dis ipv6 interface Tunnel 0/0/0 Tunnel0/0/0 current state : UP IPv6 protocol current state : UP IPv6 is enabled, link-local address is FE80::303:303 在这里 Global unicast address(es): 2001:2::3, subnet is 2001:2::/64 Joined group address(es): FF02::5 FF02::1:FF03:303 FF02::2 FF02::1 FF02::1:FF00:3
其实这一点很好理解的,R2学到了去往4::4的路由,下一跳指向了R3的tunnel0/0/0接口,其实这里面还有一点深层含义,想要R1学到R4上的网段,就要求ospfv3贯穿整个环境,R2和R3的公网口都仅是配置了IPV4地址,按理说是无法透传ospfv3的,所以必须起要一个带IPV6地址的虚接口,根据上述信息我们发现接口指向了tunnel0/0/0接口,我们可以猜一下tunnel接口的配置,必须要有一个ipv6地址、而且还必须启用ospfv3,而且,还要使用一种封装协议,可以是GRE,我们这里面使用的ipv6 over ipv4,并且还要指向源和目标IP,如下所示:
[R2-Tunnel0/0/0]dis th [V200R003C00] # interface Tunnel0/0/0 ipv6 enable ipv6 address 2001:2::2/64 ospfv3 1 area 0.0.0.0 tunnel-protocol ipv6-ipv4 source 2.2.2.2 destination 3.3.3.3
因果关系
其中的因果关系;
想让1::1 与 4::4通信,要求全局起ospfv3,但是中间是ipv4,无法起ospfv3,怎么办呢?主要就是解决ipv4中间不支持ospfv3的问题?那怎样才能让中间的ipv4支持ipv6呢?这个时候就要用于ipv6 over ipv4的封装技术?这个技术是怎么实现的呢?
无论是哪种技术都不可能直接在仅支持ipv4的接口上起ipv6,所以R2和R3就不要打公网口的主意了,怎么办?采取曲线救国的的策略,不在公网口起IPV6,而是生成一个虚拟接口,即tunnel隧道接口,两边各生成一个隧道接口,在隧道接口上配置ipv6地址,让两边隧道接口上的IPV6通信,同时在隧道配置OSPFV3,这样的话,OSPF就能贯穿全局了,真是一个好主意!但是,但是,隧道是有了,但隧道之间不通呀?人家IPV4的两个物理接口是可以通的,咱们搞出的这两个tunnel接口相互之间不通,不通怎么话,这两个tunnel接口怎么样建立隧道呢?而且中间间隔着纯IPV4的网络,真是个难题。
那接下来,我们就要解决两边tunnel不通的问题,不通的话?能不能建立路由呢?也不行呀,因为隧道接口是IPV6,而中间还隔着ipv4,路由信息过不去呀?这个时候只能再拐弯,让tunnel接口的ipv6借用ipv4的方式,在《武动乾坤》小说当中,异魔无法使用祖符,但是异魔却控制了能够使用祖符的人,这样可以间接的使用祖符的力量,这个套路同时适用于此处,我们再起一个虚接口,即lookback接口,在这个接口配置ipv4地址,R2和R3都要配置,然后在R2和R3上启用OSPFv1,即ipv4时代的ospf,将两个公网口和两个lookback接口宣传进去,这样两边的lookback接口就能通信了,还有最后一步要解决,怎么才能让tunnel接口借用lookback接口呢?要tunnel接口配置一个机制,这个机制可以实现,将原本送给tunnel接口的数据,偷偷交给lookback接口,让lookback接口,让lookback接口进行转发,虽然明面上看来路由后的数据包是给tunnel接口的,给了lookbacp接口后,封装上lookback接口的源地址,让lookback根据原本建立后的ipv4路由扔到另一边的lookback接口上,好了,到了这一步之后,R2上的ipv6数据已经能够扔到R3上了,但是怎么扔还不知道?也就是说还没有全局的路由,下面我们就开始起全局的路由?
R1和R4全部都宣告就行了,R2和R3的公网口和lookback的就没有必要宣告了,为什么了呢?因为R1和R4都是纯IPV6,宣告之后也没啥意义!它们都不认识,但有一点需要注意,R2和R3内网口宣告进去没什么说的,这是肯定的,但是R3和R2的tunnel接口有没有必要宣告呢?肯定要宣告,为什么?因为R3就知道R1上的网段,全指望R2上的tunnel接口,不然他的下一跳往哪里扔?R2也是如此。
再强调一点,backup接口能通信基础是两边有启用ipv4 ospf的路由,tunnel接口能通信基础就是借用了ipv4 的ospf。
抓包
GRE
在过渡前期,我们前面已经看过了ipv6 over ipv4,再来看一种,GRE,实际上这里的GRE的原理与ipv6 over ipv4差不多,在上面的配置当中只要在配置tunnel接口的时候将协议改成gre就完成了,在有一点注意,当我们改成gre封装之后,源和目的地址都会消失掉,我们要重新配置源和目的,与原来一样。
GRE与ipv6 over ipv4的区别
从报文来看比较类似,都是ipv4包裹ipv6的报文,只不过在两个报文中间加一个GRE的头部,如下图所示:
还有一点是GRE是可以使用密码的,我们在tunnel接口下可以配置密码,比如
# 注意两边都要配置 int tunnel 0/0/0 gre key 1234