简介
通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。如下图所示,通过在IPv4网络上建立GRE隧道,解决了两个IPv6网络的通信问题。
GRE除了可以封装网络层协议报文以外,它还具备封装组播报文的能力。由于动态路由协议中会使用组播报文,因此更多时候GRE会在需要传递组播路由数据的场景中被用到,这也是GRE被称为通用路由封装协议的原因。以下几个场景就是GRE在路由封装方面的应用。
GRE over IPSec
如下图所示,IPSec隧道两端的IP网络需要通信,彼此就要获取到对端网络的私网路由信息。假设隧道两端的IP网络部署的是动态路由协议,那么IPSec隧道中就需要传递路由协议的组播报文。由于IPSec本身并不具备封装组播报文的能力,因此该场景下就需要寻求GRE的协助。GRE首先将组播报文封装成单播报文,封装后的单播报文就可以经过IPSec隧道发送到对端网络。此时,建立在两个IP网络中的隧道被称为GRE over IPSec隧道。
扩大跳数受限的网络工作范围
如下图所示,网络中运行RIP协议,如果两台电脑之间的跳数超过15,它们将无法通信。通过在网络中使用GRE隧道可以隐藏一部分跳数,从而扩大网络的工作范围。
例如,在FW_A和FW_B之间建立GRE隧道后,FW_A和FW_B就相当于相邻的路由器,距离为一跳。这就隐藏了FW_A和FW_B之间的跳数,使网络得到了扩展。
GRE基本原理
报文格式
GRE封装后的报文格式如下图所示。
- 乘客协议(Passenger Protocol):封装前的报文称为净荷,封装前的报文协议称为乘客协议。
- 封装协议(Encapsulation Protocol):GRE Header是由封装协议完成并填充的,封装协议也称为运载协议(Carrier Protocol)。
- 传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
GRE报文转发流程(实现过程)
下面结合FW的流量处理过程,介绍GRE报文转发流程,如下图所示。
PC_A通过GRE隧道访问PC_B时,FW_A和FW_B上的报文转发过程如下:
- PC_A访问PC_B的原始报文进入FW_A后,首先匹配路由表。
- 根据路由查找结果,FW_A将报文送到Tunnel接口进行GRE封装,增加GRE头,外层加新IP头。
- FW_A根据GRE报文的新IP头的目的地址(2.2.2.2),再次查找路由表。
- FW_A根据路由查找结果转发报文。
- FW_B收到GRE报文后,首先判断这个报文是不是GRE报文。
在上图中可以看到封装后的GRE报文会有个新的IP头,这个新的IP头中有个Protocol字段,字段中标识了内层协议类型,如果这个Protocol字段值是47,就表示这个报文是GRE报文。如果是GRE报文,FW_B则将该报文送到Tunnel接口解封装,去掉新的IP头、GRE头,恢复为原始报文;如果不是,则报文按照普通报文进行处理。
- FW_B根据原始报文的目的地址再次查找路由表,然后根据路由匹配结果转发报文。