GRE(Generic Routing Encapsulation,通用路由封装协议),是一种传统的隧道协议技术。GRE对某些网络层协议的数据报进行封装,使这些被封装的数据报能够在IPv4网络中传输。
GRE的封装可以细分为两步:
(1)在私网原始报文的前面添加GRE头;
(2)在GRE头前面添加新的IP头。
在防火墙上,封装操作通过一个Tunnel(隧道)接口实现。报文进入Tunnel接口后,防火墙就会为报文封装GRE头和新IP头。防火墙对私网报文进行封装、解封及转发的全过程如图1所示。
图1 GRE报文转发过程
PC_A通过GRE隧道访问PC_B时,FW_A和FW_B上的报文转发过程为:
(1)PC_A访问PC_B的原始报文进行FW_A后,首先匹配路由表,根据匹配结果FW_A送到Tunnel接口进行GRE封装,增加GRE头、外层新IP头;
(2)FW_A根据封装后报文的新IP头的目的地址再次查找路由表,假设FW_A查找到去往FW_B的下一跳地址为1.1.1.2。
(3)FW_B接收报文后,首先判断报文是不是GRE报文(报文新IP头中的Protocol字段的值为47,即是GRE报文,否则不是),若是GRE报文,则报文送到Tunnel接口解封装,去掉IP头、GRE头,恢复为原始报文。
(4)FW_B根据原始报文的目的地址再次查找路由表,根据匹配结果将报文发送至PC_B。
恶意用户伪装成FW_A向FW_B发送GRE报文,则伪装者可访问FW_B的资源,为了避免这种情况的发生,GRE配置了以下安全机制。
防火墙只处理与自身建立连接GRE隧道的对端设备发送的GRE报文,GRE头中的“Key”字段用来保证这一功能的实现。只有两端设置的Key字段完全一直才能建立隧道。
虽然GRE隧道两端防火墙实现了通信,但是报文在Internet传输途中可能被篡改,为保证报文传输的完整性,防火墙在封装GRE头时,将GRE头中的Checksum位的值置1,然后根据报文信息计算校验和,并将校验和填到Checksum字段中。当对端收到报文也会计算校验和并与报文中携带的校验和进行比较,一致则接受,否则丢弃。
当一端防火墙出现问题时,另一端发送的探测报文无法检测到对端状态,则会关闭隧道,这样避免了对端不可达而造成的数据黑洞。
没有加密功能,通常配合IPSec使用,即GRE over IPSec技术