GRE隧道

概述

GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。GRE采用了Tunnel(隧道)技术,是VPN(Virtual Private Network)的第三层隧道协议。

普通GRE

Tunnel是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel的两端分别对数据报进行封装及解封装。

一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程

封装过程:

  1. Router A连接Group 1的接口收到X协议报文后,首先交由X协议处理;

  2. X协议检查报文头中的目的地址域来确定如何路由此包;

  3. 若报文的目的地址要经过Tunnel才能到达,则设备将此报文发给相应的Tunnel接口;

  4. Tunnel口收到此报文后进行GRE封装,在封装IP报文头后,设备根据此IP包的目的地址及路由表对报文进行转发,从相应的网络接口发送出去。

GRE 封装后的报文包括如下几个部分:

  • 净荷数据(Payload packet):需要封装和传输的数据报文。净荷数据的协议类型,称为乘客协议(Passenger Protocol)。乘客协议可以是任意的网络层协议。
  • GRE 头(GRE header):采用 GRE 协议对净荷数据进行封装所添加的报文头,包括封装层 数、版本、乘客协议类型、校验和信息、Key 信息等内容。添加 GRE 头后的报文称为 GRE 报文。对净荷数据进行封装的 GRE 协议,称为封装协议(Encapsulation Protocol)。
  • 传输协议的报文头(Delivery header):在 GRE 报文上添加的报文头,以便传输协议对 GRE 报文进行转发处理。传输协议(Delivery Protocol 或者 Transport Protocol)是指负责转发 GRE 报文的网络层协议。设备支持 IPv4 和 IPv6 两种传输协议:当传输协议为 IPv4 时,GRE 隧道 称为 GRE over IPv4 隧道;当传输协议为 IPv6 时,GRE 隧道称为 GRE over IPv6 隧道。

以一个封装在IP Tunnel 中的IP协议为例: image.png

在配置GRE隧道时,会为GRE隧道接口配置一个地址,同时会为隧道指定源地址和目的地址,这两个地址一般是路由器的接口地址,如上图中的1.1.1.1和2.2.2.1,因此在实际中间报文传输中,是没有携带GRE隧道接口地址的。

解封装过程:

  1. Router B从Tunnel接口收到IP报文,检查目的地址;

  2. 如果发现目的地是本路由器,则Router B剥掉此报文的IP报头,交给GRE协议处理(进行检验密钥、检查校验和及报文的序列号等);

  3. GRE协议完成相应的处理后,剥掉GRE报头,再交由X协议对此数据报进行后续的转发处理。

GRE安全机制

  1. GRE Key 验证 通过 GRE Key 验证可以检查报文的合法性。 发送方在发送的报文中携带本地配置的 GRE Key。接收方收到报文后,将报文中的 GRE Key 与接收方本地配置的 GRE Key 进行比较,如果一致则对报文进行进一步处理,否则丢弃该报文。

  2. GRE 校验和验证 通过 GRE 校验和验证可以检查报文的完整性。 发送方根据 GRE 头及 Payload 信息计算校验和,并将包含校验和信息的报文发送给对端。接收方对接收到的报文计算校验和,并与报文中的校验和比较,如果一致则对报文进行进一步处理,否则丢弃该报文。

GRE Over IPSec GRE 可以和 IPsec(IP Security,IP 安全)配合使用,通过建立 GRE over IPsec 隧道,对路由协议、语音、视频等数据先进行 GRE 封装,再对封装后的报文进行 IPsec 处理。二 者配合使用的优势如下:

  • 提高数据在隧道中传输的安全性。
  • 解决 IPsec 只能处理单播报文的问题。GRE 可以支持组播、广播和非 IP 报文,先对这些报文 进行 GRE 封装,使其成为普通的单播报文。然后,IPsec 就可以对其进行进一步的处理。
  • 简化 IPsec 的配置。由于所有报文都先经过 GRE 封装后再进行 IPsec 处理,因此只要根据 GRE 隧道的源/目的端地址来定义需要 IPsec 保护的数据流即可,不需要关注原始报文的源/ 目的地址。
title: GRE隧道典配
collapse: close 

![image.png](https://picgo-1304285457.cos.ap-guangzhou.myqcloud.com/images/20240102163000.png)

RTA:

interface LoopBack0
 ip address 192.168.0.1 255.255.255.255
 
interface GigabitEthernet0/0
 port link-mode route
 combo enable copper
 ip address 1.1.1.1 255.255.255.252

interface Tunnel0 mode gre
 ip address 10.1.2.1 255.255.255.0
 source 1.1.1.1
 destination 2.2.2.1
 keepalive 10 3

 ip route-static 0.0.0.0 0 1.1.1.2
 ip route-static 192.168.1.0 24 Tunnel0

RTB类似

抓包结果如下:
![image.png](https://picgo-1304285457.cos.ap-guangzhou.myqcloud.com/images/20240102163432.png)

点到多点GRE

使用传统的 GRE 隧道应用于如下图所示的企业网时,需要在企业中心节点和各个分支机构之间 建立多条点到点 GRE 隧道。当企业分支机构众多时,配置工作量巨大;如果新增分支机构,则需要在中心节点上增加配置,增加了网络维护的负担;此外,分支机构采用 ADSL 等方式拨号上网时, 分支机构公网地址的不确定性也增加了中心节点配置的复杂度。 点到多点 GRE 隧道很好地解决了上述问题,非常适用于分支机构众多的企业网络。点到多点 GRE 隧道组网中,需要在中心节点上配置点到多点 GRE 模式的隧道接口(以下简称为点到多点 GRE 隧道接口)、分支机构上配置传统的点到点 GRE over IPv4/IPv6 模式的隧道接口(以下简称为点到点 GRE 隧道接口),这样就可以实现在中心节点和多个分支机构之间建立点到多点 GRE 隧道。

image.png

工作原理

报文的加解封装过程和点到点的GRE隧道相同

通过点到多点 GRE 隧道转发报文时,设备根据报文的目的 IP 地址,在点到多点 GRE 隧道表项中查找对应的隧道目的 IP 地址,使用此地址作为 GRE 封装传输协议报文头的目的 IP 地址。 点到多点 GRE 隧道表项分为点到多点 GRE 隧道动态表项和点到多点 GRE 隧道静态表项,两者不能同时存在。

动态表项 配置了点到多点 GRE 隧道接口的设备(Device A)接收到对端设备(Device B) 发送的 GRE 报文后,从该报文中获取传输协议报文头的源 IP 地址和乘客协议报文头的源 IP 地址, 分别作为隧道的目的 IP 地址和报文的目的 IP 地址(即分支网络的私网地址),建立一条点到多点 GRE 隧道动态表项。

image.png

静态表项 用户可以配置点到多点 GRE 隧道静态表项,静态表项包括隧道的目的 IP 地址、报文的目的 IP 地址(即分支网络的私网地址)和分支网络所属的 VPN 实例。

分支节点隧道备份

点到多点 GRE 隧道支持在中心节点和分支网络之间建立多条 GRE 隧道,形成备份关系,提高网络 的可靠性。根据备份节点的部署位置不同,可以分为分支机构的 GRE 隧道备份和中心节点的 GRE 隧道备份。

image.png

在分支机构的网关设备上创建 GRE 隧道时,可以设置 GRE Key。中心节点根据分支机构发送的 GRE 报文创建点到多点 GRE 隧道动态表项,并从该 GRE 报文中获取 GRE Key,记录在点到多点 GRE 隧道动态表项中。中心节点根据 GRE Key 来判断点到多点 GRE 隧道动态表项的优先级,并 根据优先级最高的点到多点 GRE 隧道动态表项转发报文,优先级低的点到多点 GRE 隧道动态表项作为备份。

点到多点 GRE 隧道动态表项优先级的判断原则为:

  • 未记录 GRE Key 的表项优先级最高;
  • 记录了 GRE Key 的表项,Key 值越小优先级越高;
  • 当表项 GRE Key 相同时,最新学到的表项优先级高。

中心节点隧道备份

image.png

如上图所示,中心节点部署了两台网关设备,网关设备均与分支机构的网关设备建立点到多点的 GRE 隧道,同时两台网关设备之间建立 GRE over IPv4/IPv6 模式的隧道。主设备上的 GRE over IPv4/IPv6 模式的隧道接口作为备份接口。

当主设备与分支机构之间的链路出现故障时,发送给分支机构的报文在主设备上查找不到匹配的点到多点 GRE 隧道动态表项,主设备通过备份接口把该报文发送给备份设备(Device B),由备份设备将报文发送到分支机构。 当主设备上存在点到多点 GRE 隧道动态表项时,备份接口也可以参与转发隧道的选择,根据优先级决定是否采用备份接口转发报文。如果没有为备份接口配置 GRE Key,则其优先级低于所有的点到多点隧道动态表项;如果为备份接口配置了 GRE Key,则与点到多点隧道动态表项中记录的 GRE Key 比较,Key 值小的优先级高。

title: 点到多点GRE中需要注意的地方
collapse: close

基于点到多点 GRE 隧道动态表项的 GRE 隧道不支持转发私网流量

对于中心节点来说:
1. 在同一设备上配置多个点到多点 GRE 隧道时,各 Tunnel 接口不能配置完全相同的源端地址。
2. **GRE 隧道**和**点到多点 GRE 隧道**不能配置相同的源端地址和目的端地址。 
3. 中心节点的点到多点 GRE 隧道接口上不能配置 GRE Key。 
4. 中心节点的网关设备可以根据各个分支设备的内网网段,只建立一个隧道动态表项,从而降低中心设备的资源消耗。

对于分支节点来说:
1. 多点 GRE 隧道组网中,分支网络之间无法建立隧道,不能通信。
2. 在分支节点上,需要将 GRE over IPv4/IPv6 隧道的目的端地址配置为点到多点 GRE 隧道接口的源端地址。 
3. Tunnel 接口上配置的隧道目的端地址不能与 Tunnel 接口的地址在同一网段。 
4. 在分支节点的网关设备上创建 GRE 隧道时,可以设置 GRE Key,中心节点根据 GRE Key 来 判断点到多点 GRE 隧道动态表项的优先级。 
5. 中心节点上配置基于**静态表项**的点到多点 GRE 隧道时,分支节点不能设置 GRE Key。
title: GRE-P2MP典配(动态表项)
collapse: close 

组网图:
![image.png](https://picgo-1304285457.cos.ap-guangzhou.myqcloud.com/images/20240102163606.png)

Route-A:
# 创建 Tunnel0 接口,并指定隧道模式为点到多点 GRE 隧道。 
[RouterA] interface tunnel 0 mode gre-p2mp 
# 配置 Tunnel0 接口的 IP 地址。 
[RouterA-Tunnel0] ip address 192.168.22.1 255.255.255.0 
# 配置 Tunnel0 接口的源 IP 地址(Router A 的 GigabitEthernet0/0/1 的 IP 地址)。 
[RouterA-Tunnel0] source 11.1.1.1 
# 配置 Tunnel0 接口的分支网络地址掩码为 255.255.255.0。(指的是分支网络中私网IP地址的掩码,因为在记录动态表项时,是根据报文头中的IP地址参数获取的,并无掩码) 
[RouterA-Tunnel0] gre p2mp branch-network-mask 255.255.255.0 
# 配置点到多点 GRE 隧道动态表项的老化时间为 20 秒。 
[RouterA-Tunnel0] gre p2mp aging-time 20 
# 配置处理接口流量的主用 slot。 
[RouterA-Tunnel0] service slot 1 
[RouterA-Tunnel0] quit 
# 配置经过 Tunnel0 接口到达分支网络的静态路由。 
[RouterA] ip route-static 192.168.12.0 255.255.255.0 tunnel 0

Router-B:
# 创建 Tunnel0 接口,并指定隧道模式为 GRE over IPv4 隧道。
[RouterB] interface tunnel 0 mode gre 
# 配置 Tunnel0 接口的 IP 地址。 
[RouterB-Tunnel0] ip address 192.168.22.2 255.255.255.0 
# 配置 Tunnel0 接口的源端地址(Router B 的 GigabitEthernet0/0/1 的 IP 地址)。 [RouterB-Tunnel0] source 11.1.2.1 
# 配置 Tunnel0 接口的目的端地址(Router A 的 GigabitEthernet0/0/1 的 IP 地址)。
[RouterB-Tunnel0] destination 11.1.1.1 
[RouterB-Tunnel0] quit 
# 配置经过 Tunnel0 接口到达中心节点的静态路由。 
[RouterB] ip route-static 192.168.11.0 255.255.255.0 tunnel 0 

参考文章

https://www.h3c.com/cn/Service/Document_Software/Document_Center/Home/Routers/00-Public/Configure/Operation_Manual/H3C_MSR1000_3600_CG_V9_R9135-11061/16/?CHID=959280