GRE(General Routing Encapsulation)即通用路由封装协议。
但凡一种网络封装技术,其基本的构成要素都可以分为三个部分:乘客协议、封装
协议、运输协议,GRE也不例外。为了便于理解封装技术,我们用邮政系统打个比方。
GRE的封装过程可以细分成两步,第一步是在私网的原始报文前面添加GRE头,第二步是在GRE头前面再加上新的IP头,新IP头中的IP地址为公网地址。加上新的IP头以后,就意味着这个私有网络的报文经过层层封装以后就可以在Internet上传输了。
在防火墙上,封装操作是通过一个逻辑接口来实现的,这个逻辑接口就是鼎鼎有名的Tunnel接口。Tunnel即隧道,从名字就可以看出来这个逻辑接口就是为隧道而生。
Tunnel接口上带有新IP头的源地址和目的地址信息,报文进入Tunnel接口后,防火墙就会为报文封装GRE头和新的IP头。
那么防火墙是如何把报文送到Tunnel接口的呢?这就要通过路由来实现了,防火墙支持如下两种方式。
配置GRE基本参数
1.配置Tunnel接口
在FWA上配置Tunnel接口的封装参数。
[FW_A] interface Tunnel 1
[FW_A-Tunnel1] ip address 10.1.1.1 24
[FW_A-Tunnel1] tunnel-protocol gre
[FW_A-Tunnel1] source 1.1.1.1
[FW_A-Tunnel1] destination 2.2.2.2
在FW-A上将Tunnel接口加入安全区域。Tunnel接口可以加入到任意一个安全区域中,这里我们把Tunnel接口加入到了DMZ区域。
[FW_A] firewall zone dmz
[FW_A-zone-dmz] add interface Tunnel 1
在FWB上配置Tunnel接口的封装参数。
[FW B] interface Tunnel 1
[FW B-Tunnel1] ip address 10.1.1.2 24
[FW B-Tunnel1] tunnel-protocol gre
[FW B-Tunnel1] source 2.2.2.2
[FW B-Tunnel1] destination 1.1.1.1
[FW B] firewall zone dmz
[FW-B-zone-dmz] add interface Tunnel 1
Tunnel接口的IP地址必须配置,如果不配置IP地址,Tunnel接口就无法为UP状态。其次,从GRE的封装过程来看,Tunnel接口的IP地址并没有参与报文封装,所以隧道两端防火墙上Tunnel接口的IP地址没有任何关联,可以各配各的。最后,既然Tunnel接口不参与封装,所以也就没有必要用公网地址了,配置成私网IP地址就可以了。
2.配置路由,把需要进行GRE封装的报文引导至Tunnel接口
(1)静态路由
[FW A] ip route-static 192.168.2.0 24 Tunnel 1
[FW B] ip route-static 192.168.1.0 24 Tunnel 1
(2)动态路由
在OSPF中将接口地址的私网和Tunnel接口所在的网段发布出去。
[FWA] ospf 1
[FWA-ospf-1] area 0
[FWA-ospf-1-area-0.0.0.0] network 192.168.1.0 0.0.0.255
[FWA-ospf-1-area-0.0.0.0] network 10.1.1.0 0.0.0.255
[FWB] ospf 1
[FWB-ospf-1] area 0
[FWB-ospf-1-area-0.0.0.0] network 192.168.2.0 0.0.0.255
[FWB-ospf-1-area-0.0.0.0] network 10.1.1.0 0.0.0.255
有一点需要注意,使用OSPF动态路由方式时,如果GRE隧道对应的公网接口也使用OSPF发布路由,那我们就需要用一个新的OSPF进程来发布私网网段和Tunnel接口所在网段了,以免私网报文直接通过公网接口转发,而不是通过GRE隧道转发。
配置GRE安全机制
1.关键字验证
防火墙在为报文封装GRE头时,将GRE头中的Key位的值置1,并在GRE头中插入Key字段。两台防火墙在建立隧道时,通过Key字段的值来验证对端的身份,只有两端设置的Key字段的值完全一致时才能建立隧道。
下图展示了GRE头中的信息,其中Key位为1表示启用了关键字验证功能。
配置关键字验证的步骤很简单,唯一需要注意的是,隧道两端防火墙上设置的关键字必须相同。
在FWA上设置关键字为12345:
[FW A-Tunnel1]gre key 12345
同时,在FWB上设置关键字为12345:
[FW B-Tunnel1]gre key 12345
2.校验和验证
防火墙在为报文封装GRE头时,将GRE头中的Checksum位的值置1,然后根据报文的信息计算校验和,并将校验和填到Checksum字段中。当隧道对端收到该报文时,也会根据报文信息计算校验和,并与报文中携带的校验和进行比较,如果校验结果一致,则接受此报文;如果不一致,则丢弃此报文。
校验和验证功能是单向的,对端防火墙是否开启不影响本端的校验和验证功能。实际环境中,建议在隧道两端防火墙上同时开启。
[FW A-Tunnel1] gre checksum
[FW B-Tunnel1] gre checksum
3. Keepalive
GRE隧道是一种无状态类型的隧道,所谓的无状态类型是指隧道本端并不维护与对端的状态。换句话说假如隧道对端出现故障,那隧道本端是感受不到的。为了解决这个问题,GRE隧道提供了Keepalive保活机制。
在FWA上开启Keepalive功能后,FWA会周期性的向FWB发送探测报文,以检测隧道对端状态。如果FWB可达,则FWA会收到FWB的回应报文,此时FWA会保持隧道的正常状态;如果FWA收不到FWB的回应报文,说明FWB不可达,则FWA会将隧道关闭。这样就避免了因隧道对端不可达而造成的数据黑洞。
Keepalive功能是单向的,对端是否开启Keepalive功能不影响本端的Keepalive功能。
实际环境中,建议在隧道两端防火墙上同时开启。
[FWA-Tunnel1] keepalive
[FWB-Tunnel1] keepalive
安全策略配置思路
(1)我们先配置一个最宽泛的域间安全策略,以便调测GRE
在FWA上将域间缺省包过滤的动作设置为permit
[FWA]firewall packet-filter default permit all
在FWB上将域间缺省包过滤的动作设置为permit
[FWB]firewall packet-filter default permit all
(2)配置好GRE后,在PC-A上ping PC-B,然后查看会话表,以FW_A为例。
(3)分析会话表得到精细化的安全策略的匹配条件。
在GRE场景中,FW-A和FW-B上的Tunnel接口必须加入安全区域,而且Tunnel接口所属的安全区域决定了报文在防火墙内部的走向。如果Tunnel接口属于Trust区域,那就不需要配置DMZ-->Trust的安全策略,但这样会带来安全风险。因此建议将Tunnel接口加入到单独的安全区域,然后配置带有精确匹配条件的安全策略。
(4)最后,将缺省包过滤的动作改为deny。
在FW-A上将域间缺省包过滤的动作设置为deny。
[FWA]firewall acket-filter default deny all
在FW-B上将域间缺省包过滤的动作设置为deny。
[FWB]firewall packet-filter default deny all