版权归原作者所有,如有侵权,请联系我们

关于常用隧道协议之GRE,你知道多少?

中移科协
原创
有用的科技知识又增加了
收藏

网络转发领域,二层转发的核心是根据二层头查找MAC地址表转发,三层转发的核心是根据IP头查找路由表进行转发,查找路由表是根据报文的目的IP进行最长掩码匹配,设想一个场景,假设我从自己的本机去ping 8.8.8.8,同时想让这个包经过网络中的某台设备或者某个节点(假设节点A,IP为x.x.x.x),由于路由的原理是找下一跳,也就是说查找路由表后只有下一个节点的路径信息,根本无法指定路径走到节点A,那么GRE在此时就登场了。

1、隧道和GRE简介

GRE(Generic Routing Encapsulation),通用路由封装协议。顾名思义,这种隧道协议对链路两端实际所使用的网络协议没有要求,是一种很常用的隧道协议。

回到前面导读提到的问题,如果我在原始IP报文(本机IP----->8.8.8.8)前面再封装一层IP头+隧道头,目的地址就是节点A的地址x.x.x.x,这样,在网络中的各个设备就会根据这个x.x.x.x去路由查找,最终找到节点A,节点A对原始报文处理之后再扔出去,最终路由到8.8.8.8上面。这个就是隧道技术,也可以说是overlay技术,顾名思义就是把原始报文隐藏在里面,外面再封装一层,在网络中的路由器和交换机识别的都是外层封装的信息,就相当于戴了个面具,中间设备认识的是你这个面具,等到了隧道端点,解除隧道封装后,还原原始报文,面具摘掉了,露出庐山真面目。这个原始报文也就是私有报文,在GRE协议中叫做乘客协议,顾名思义,就像乘客一样。

隧道有很多种,有二层隧道,比如VxLAN,也有三层隧道,比如GRE、IPSec等等,具体是二层隧道还是三层隧道,最简单明了的就是看overlay的原始报文是IP报文还是以太报文(是否有MAC地址),如果只有IP头,则是三层隧道,如果有MAC头,就是二层隧道。

GRE就是一种比较简单的三层隧道。

2、GRE基本原理

GRE的报文格式如下图所示:

报文在GRE隧道中传输包括封装和解封装两个过程。如图所示,如果私有网络中报文从RouterA向RouterB传输,则封装在RouterA上完成,而解封装在RouterB上进行。封装后的数据报文在网络中传输的路径,就是GRE隧道,如下图所示:

下面介绍一下GRE加封装和解封装的流程,以IP协议为例。

加封装

①RouterA从连接私有网络A的接口接收到IP协议报文后,首先交由IP协议处理。

②根据报文头中的目的地址在路由表或转发表中查找出接口,确定如何转发此报文。如果发现出接口是GRE Tunnel接口,则对报文进行GRE封装,即添加GRE头。

③根据骨干网传输协议为IP,给报文加上IP头。IP头的源地址就是隧道源地址,目的地址就是隧道目的地址。

④根据该IP头的目的地址(即隧道目的地址),在骨干网路由表中查找相应的出接口并发送报文。之后,封装后的报文将在该骨干网中传输。

解封装

解封装过程和封装过程相反。

①RouterB从GRE Tunnel接口收到该报文,分析IP头发现报文的目的地址为本设备,则RouterB去掉IP头后交给GRE协议处理。

②GRE协议剥掉GRE报头,获取内层IP协议报文,再交由IP协议栈对此数据报文进行后续的转发处理。

3、GRE安全机制

GRE本身提供两种基本的安全机制。

3.1 校验和验证

校验和验证是指对封装的报文进行端到端校验。

若GRE报文头中的C位标识位置1,则校验和有效。发送方将根据GRE头及Payload信息计算校验和,并将包含校验和的报文发送给对端。接收方对接收到的报文计算校验和,并与报文中的校验和比较,如果一致则对报文进一步处理,否则丢弃。

隧道两端可以根据实际应用的需要决定配置校验和或禁止校验和。如果本端配置了校验和而对端没有配置,则本端将不会对接收到的报文进行校验和检查,但对发送的报文计算校验和;相反,如果本端没有配置校验和而对端已配置,则本端将对从对端发来的报文进行校验和检查,但对发送的报文不计算校验和。

3.2 识别关键字

识别关键字(Key)验证是指对Tunnel接口进行校验。通过这种弱安全机制,可以防止错误识别、接收其它地方来的报文。

RFC1701中规定:若GRE报文头中的K位为1,则在GRE头中插入一个四字节长关键字字段,收发双方将进行识别关键字的验证。

关键字的作用是标志隧道中的流量,属于同一流量的报文使用相同的关键字。在报文解封装时,GRE将基于关键字来识别属于相同流量的数据报文。只有Tunnel两端设置的识别关键字完全一致时才能通过验证,否则将报文丢弃。这里的“完全一致”是指两端都不设置识别关键字,或者两端都设置相同的关键字。

4、GRE的keeplive检测

由于GRE协议并不具备检测链路状态的功能,如果对端接口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因隧道不通接收不到报文,由此就会形成数据空洞。

GRE的Keepalive检测功能可以检测隧道状态,即检测隧道对端是否可达。如果对端不可达,隧道连接就会及时关闭,避免因对端不可达而造成的数据丢失,有效防止数据空洞,保证数据传输的可靠性。

Keepalive检测功能的实现过程如下:

①当GRE隧道的源端使能Keepalive检测功能后,就创建一个定时器,周期地发送Keepalive探测报文,同时通过计数器进行不可达计数。每发送一个探测报文,不可达计数加1。

②对端每收到一个探测报文,就给源端发送一个回应报文。

③如果源端的计数器值未达到预先设置的值就收到回应报文,就表明对端可达。如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。但是源端口仍会继续发送Keepalive报文,若对端Up,则源端口也会Up,建立隧道链接。

5、后记

在使用GRE协议时,需要注意以下几点。首先,GRE协议需要在网络设备上进行配置,以确保GRE包能够正确地传输。其次,GRE协议封装的数据包会增加额外的头部信息,因此在传输过程中会增加一定的开销。最后,GRE协议并不提供数据加密和身份验证等安全机制,因此在使用时需要考虑安全性问题。

除了GRE协议,还有其他的路由封装协议,例如IPsec和L2TP等。它们各自具有不同的特点和应用场景,需要根据具体情况进行选择。此外,随着网络技术的不断发展,新的路由封装协议也在不断涌现,如VXLAN和NVGRE等。

总的来说,GRE协议是一种重要的网络协议,可以实现不同网络之间的互联和虚拟专用网络的建立。在使用时需要注意安全性和开销等问题,并结合实际情况选择合适的路由封装协议。

参考文献:
[1] 一文带你弄清GRE隧道协议,知乎,2022年11月6日。https://zhuanlan.zhihu.com/p/580919066?utm_id=0 (访问日期:2023年8月17日).

作者:尹彬 潘海春

单位:中国移动智慧家庭运营中心

评论
科普张林海
太师级
学习
2023-12-30