前面用两篇文章介绍了GRE(Generic Routing Encapsulation,通用路由封装)协议,分别是(GRE:RFC1701-通用路由封装 (GRE))和(RFC1702:基于IPv4 网络的通用路由封装(GRE))。首先回顾一下:
GRE协议用来对某种协议(如IP、MPLS、以太网)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络(如IP)中传输。封装前后数据报文的网络层协议可以相同,也可以不同。封装后的数据报文在网络中传输的路径,称为GRE隧道。GRE隧道是一个虚拟的点到点的连接,其两端的设备分别对数据报文进行封装及解封装。
先配置一个简单的“GRE over IPv4隧道”实验。
RT2和RT4分别连接IPv4私有网络SUBNET 1和SUBNET 5。这两个私有网络都使用私网地址。通过在RT2和RT4之间建立GRE隧道,实现两个私有网络的互联。
GRE的配置比较简单,一般只有两步:
1、配置GRE隧道。配置隧道接口地址,并指定隧道接口的源目端地址即可。
2、配置路由将流量引到隧道接口。
各设备配置命令如下:
#sysname RT2#interface GigabitEthernet0/0ip address 192.168.1.2 255.255.255.0#interface GigabitEthernet0/1ip address 23.1.1.2 255.255.255.0#interface Tunnel0 mode greip address 1.1.1.2 255.255.255.0source 23.1.1.2destination 34.1.1.4#ip route-static 34.1.1.0 24 23.1.1.3ip route-static 192.168.5.0 24 Tunnel0
#interface GigabitEthernet0/0ip address 34.1.1.3 255.255.255.0#interface GigabitEthernet0/1ip address 23.1.1.3 255.255.255.0
#
sysname RT4#interface GigabitEthernet0/0ip address 192.168.5.4 255.255.255.0#interface GigabitEthernet0/1ip address 34.1.1.4 255.255.255.0#interface Tunnel0 mode greip address 1.1.1.4 255.255.255.0source 34.1.1.4destination 23.1.1.2#ip route-static 23.1.1.0 24 34.1.1.3ip route-static 192.168.1.0 24 Tunnel0
查看RT2设备Tunnel口状态。
可以看到有几个相对关键的指标项:
1、MTU为1476字节;
2、隧道keepalive功能未开启,开启命令如下:
3、隧道TTL值为255;
4、GRE over IPv4隧道中安全功能key未设置,开启命令如下。如果开启,需要保证两端配置相同;
5、GRE over IPv4隧道中安全功能checksum未设置,开启命令如下;
6、除上述机箱之外,还可以设置封装后隧道报文的DF(Don’t Fragment,不分片)标志。命令为:
tunnel dfbit enable
可以发现,实际能通过的最大报文大小为1444字节。抓个包分析一下。
可以看到报文的封装结构为[以太网包头][外层IPv4包头][GRE封装][内层IPv4包头][ICMP报文],其中[外层IPv4包头]长度为20字节,[GRE封装]长度为8字节,[内层IPv4包头]长度为20字节。得益于没有加密,我们可以清楚看到每层报文的数据结构,[内层IPv4包头]和[外层IPv4包头]封装结构完全一致。ICMP数据段长度为1444字节,封装8字节ICMP报文头,再封装20字节[内层IPv4包头],总长度正好1472字节。
这里我额外增加了校验和的配置,可以看到[GRE封装]中校验和相关字段的差异。
因为没有加密,所以能看到完整的数据报文,那设置GRE KEY能不能对数据进行加密呢?
配置一下,发现这个KEY只能是数字。
查看接口状态,能直接看到key的值,不知道这算不算不安全。
如果两端设置的key不一致,不会有错误提示,接口状态也不会协议DOWN,但是业务确实中断了。
好,接下来我们把两边设置成相同的key,验证一下。
连通性正常。抓个包看一下数据是否加密。
啊,亮瞎了我的狗眼。密码是明文显示的,数据依旧是明文显示的。这个GRE确实方便,但是安全性有待提高啊。
跟测试IPsec一样(为什么IPsec两端内网的网段能不能重复?分明可以实现!),我们试一下两端相同子网能不能互通。
很棒,跟上次配置相同,能实现两端配置相同子网的互通,而且可以看到traceroute路径。
在RT2设备上开启DF位标志,验证发现能通过的数据包长度少了4个。
这是什么原因?抓个包看一眼。
好像也没什么,只是开了DF之后,MTU就小了4字节。
1、GRE的配置确实很简单,简单到几条命令就能实现;
2、GRE的安全性确实比较差,差到验证隧道的密钥都是明文传输的,而且对封装的数据报文没有任何加密措施;
3、GRE隧道中如果开启不允许分片,会导致MTU变为1468字节;
4、GRE封装和VXLAN封装的MTU都是1472字节,要是你,你怎么选择?