GRE隧道是如何让异地局域网互通的?

异地局域网如何互通?(GRE篇)_安全策略

有这样一个环境,在北京的客户端内网是192.168.10.1想要去访问在长沙内网的服务器192.168.20.2的80服务,而客户又不想把服务器映射到公网对外发布,只想给企业内的进行访问,如果是你会怎么实现?

 作者:网络之路一天  首发公众号:网络之路博客(ID:NetworkBlog)

假设

假设按照局域网互通的方法,两个防火墙之间通过静态路由相互指定走公网出去,会发生什么事?

(1)192.168.10.1去访问192.168.20.2,这个时候源地址是192.168.10.1 目的地址是192.168.20.2,交给网关防火墙

(2)数据包抵达防火墙后(北京FW),防火墙查询路由交给出口202.100.1.254。

(3)边界互联网设备收到一个数据包,去往私网地址的192.168.20.2的就直接给丢弃了,最终访问是失败的。

结论

通过假设性的分析,可以得到这样一个结论,私网地址肯定是不能出现在公网的,所以公网设备不会转发这些流量,并且正常情况下会直接被过滤,如果要解决这个问题,就必须欺骗互联网设备,让它看到的不是私网地址而是去往对方的公网地址,这种技术就是这篇要讲解的GRE隧道。

GRE是如何“伪装的”?

GRE(Genernal routing encapsulation)全称路由封装协议,要想知道它如何“欺骗”的,那得了解了解这个协议,GRE的构成分为三个部分,GRE的原理其实非常类似于我们生活中的快递。

异地局域网如何互通?(GRE篇)_IP_02

异地局域网如何互通?(GRE篇)_IP_03

如果上面的对比还是有点不懂,那么在以上面的案例,把GRE的封装展现出来就会理解了 。

这里会引出来一个问题,就是新的IP头部有什么样的要求呢?带着这个问题直接进入实际配置,通过配置跟抓包就会得到对应答案了。

一个案例来体验GRE如何完成“伪装”

异地局域网如何互通?(GRE篇)_封装_04

拓扑还是这个,最终用GRE实现客户的需求,让192.168.10.1能够访问到192.168.20.2。

1、常见基础配置

基础配置在两台防火墙上面配置内网跟外网,加入安全区域,策略放行trust到untrust的流量,NAT策略运行10网段去上网即可。 

北京FW
interfaceGigabitEthernet1/0/0
 undo shutdown
 ip address 192.168.10.254 255.255.255.0
#
interfaceGigabitEthernet1/0/1
 undo shutdown
 ip address 202.100.1.1 255.255.255.0
#
firewall zone trust
 set priority 85
 add interface GigabitEthernet0/0/0
 add interface GigabitEthernet1/0/0
#
firewall zone untrust
 set priority 5
 add interface GigabitEthernet1/0/1
#
security-policy
 rule name trust_untrust
  source-zone trust
  destination-zone untrust
  source-address 192.168.10.0 mask255.255.255.0
  action permit
#
nat-policy
 rule name trust_untrust
  source-zone trust
  destination-zone untrust
  source-address 192.168.10.0 mask255.255.255.0
  action source-nat easy-ip
#
ip route-static 0.0.0.00.0.0.0 202.100.1.254
 
长沙FW
interfaceGigabitEthernet1/0/0
 undo shutdown
 ip address 192.168.20.254 255.255.255.0
#
interfaceGigabitEthernet1/0/1
 undo shutdown
 ip address 202.100.2.1 255.255.255.0
#
firewall zone trust
 set priority 85
 add interface GigabitEthernet0/0/0
 add interface GigabitEthernet1/0/0
#
firewall zone untrust
 set priority 5
 add interface GigabitEthernet1/0/1
#
security-policy
 rule name trust_untrust
  source-zone trust
  destination-zone untrust
  source-address 192.168.20.0 mask255.255.255.0
  action permit
#
nat-policy
 rule name trust_untrust
  source-zone trust
  destination-zone untrust
  source-address 192.168.20.0 mask255.255.255.0
  action source-nat easy-ip
#
ip route-static 0.0.0.00.0.0.0 202.100.2.254
 
互联网路由器


#
interfaceGigabitEthernet0/0/0
 ip address 202.100.1.254 255.255.255.0
#
interfaceGigabitEthernet0/0/1
 ip address 202.100.2.254 255.255.255.0
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.

异地局域网如何互通?(GRE篇)_IP_05

网络之路博客

网络数通技术分享,总有您想要的,希望你的网络之路不再孤单(B站视频发布处:网络之路Blog)

807篇原创内容

公众号

2、GRE相关配置

在防火墙上,封装是依靠一个叫做tunnel的逻辑口来完成的,也就是隧道口,tunnel口会配置新的IP头的源目地址信息,只要报文进入这个tunnel口,防火墙就会为这个报文打上GRE跟新的头部。

[BJ_FW]interface  Tunnel 0


[BJ_FW-Tunnel0]ipaddress 10.1.1.1 30
[BJ_FW-Tunnel0]tunnel-protocolgre


[BJ_FW-Tunnel0]source 202.100.1.1
[BJ_FW-Tunnel0]destination 202.100.2.1
 
 
[CS_FW]interface  Tunnel 1


[CS_FW-Tunnel1]tunnel-protocolgre


[CS_FW-Tunnel1]ipaddress  10.1.1.2 30
[CS_FW-Tunnel1]source GigabitEthernet 1/0/1
[CS_FW-Tunnel1]destination 202.100.1.1
 
[BJ_FW]firewall zone name gre


[BJ_FW-zone-gre]setpriority 55
[BJ_FW-zone-gre]add  interface Tunnel 0
 
[CS_FW]firewall zone name gre


[CS_FW-zone-gre]setpriority 55
[CS_FW-zone-gre]add  interface Tunnel 1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

GRE的配置并不复杂,但是这些参数都是非常关键的,对tunnel口完成GRE报文封装起到重要作用。

1、tunnel-protocol gre:明确tunnel口使用GRE进行封装

2、source与destionation:明确新IP头部的源跟目的地址,这里其实就是防火墙的出口公网IP。

3、加入安全区域:这个是最容易被忽略的,上面博主是单独起来一个新的区域,叫做GRE,在后面会单独讲下这样做的好处。

这两点非常关键,也是跟前面介绍的原理一致,很好理解,下面这几个容易产生一些疑问。

4、interfacetunnel 后面的ID,这个是本地有效,两边不需要一致,但是实际项目中通常会配置成一致,维护的时候方便匹配,也建议通过 description来进行描述。

5、ip address:tunnel口是必须要配置地址的,否则跟物理口一样不配置地址,接口无法up状态,而且这地址是可以自由规划,使用一个双方内网都没用过的私网地址即可,对于GRE来说这两个地址是不需要参与到封装的过程的,但是博主这里建议是在实际中,规划成一个双方内网没使用过的对接网段地址,比如上面配置的一端是10.1.1.1/30,另外一端是10.1.1.2/30,好处是方便ping之类的测试,另外就是如果运行动态路由协议,比如OSPF,它是要求在一个网段内才能建立邻居关系的,基于这些因素,实际中会配置成一个对接网段的地址。

6、从上面得知,数据包只有在走tunnel口的时候才会进行GRE封装打上新的IP头部,那么怎样才能让数据包走tunnel隧道呢?在防火墙上面有两种办法(1)静态路由  (2)动态路由,所以下面还缺一个配置,就是静态路由。

[BJ_FW]ip route-static192.168.20.0 24 Tunnel 0
[CS_FW]ip route-static192.168.10.0 24 Tunnel 1
  • 1.
  • 2.

3、测试

都配置完毕了,来测试测试会遇到哪些问题,按照以往的经历,在防火墙上面肯定不会这么简单。(记得客户端与服务器不要忘记手动设置IP地址跟开启80服务)

异地局域网如何互通?(GRE篇)_IP_06

异地局域网如何互通?(GRE篇)_封装_07

异地局域网如何互通?(GRE篇)_IP_08

三连失败 ping不通!WEB不通!无会话产生,这就是遇到的第一个问题,为什么会这样?

(1)为什么192.168.10.1访问20.2 不会产生会话表?

这个就要回顾下第五篇内容,会话表的产生最关键是流量能够顺利穿越防火墙,也就防火墙有策略进行放行,这里没有会话表出现,说明策略放行不到位,这里应该如何放行呢?

异地局域网如何互通?(GRE篇)_封装_09

之前只做了一个安全策略就是Trust到untrust的,从上面配置以及图来分析,192.168.10.1(trust)去往192.168.20.2走的是tunnel口,而tunnel口属于是Gre隧道,这里应该放行Trust到GRE的流量。

北京FW
 rule name trust_GRE
  source-zone trust
  destination-zone gre
  source-address 192.168.10.0 mask255.255.255.0
  destination-address 192.168.20.0 mask255.255.255.0
  action permit
 
长沙FW
 rule name Gre_trust
  source-zone gre
  destination-zone trust
  source-address 192.168.10.0 mask 255.255.255.0
  destination-address 192.168.20.0 mask 255.255.255.0
  action permit
 
注意北京放行的是Trust 192.168.10.0去往GRE192.168.20.0的流量,
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

而长沙放行的是从Gre 来自于192.168.10.0 去往trust 192.168.20.0的流量。

异地局域网如何互通?(GRE篇)_IP_10

异地局域网如何互通?(GRE篇)_封装_11

第一个问题解决了,有会话表出现了,出现了第二个问题,还是不通!并且会话表出现了有去无回的情况。

(2)为什么出现有去无回的情况?

最常见的情况包发出去了,但是对方没收到或者没回应,比如这里数据包到了BJ防火墙,并且防火墙也把数据包从tunnel发出去了,但是对方没有收到或者是没回应。

验证对方是否收到,可以在CS_FW上面查看会话表就知道有没有收到了。

异地局域网如何互通?(GRE篇)_封装_12

异地局域网如何互通?(GRE篇)_封装_13

从现象来看是CS_FW压根就没收到发过来的包。

异地局域网如何互通?(GRE篇)_安全策略_14

异地局域网如何互通?(GRE篇)_安全策略_15

开了FW的ping功能,两边一ping,问题发现了,隧道之间根本就没通!

(3)为什么GRE隧道之间无法通信?

  通过上面的结果是得到了两个信息,一个是BJ防火墙发送过去的数据包CS那边没收到,通过两个隧道的地址互通结果是隧道根本无法正常通信。这里就涉及到防火墙流量放行的问题了,这里要注意GRE是两台防火墙之间建立的,也就是防火墙始发流量互相通信,一听到始发流量就可以联想到没有放行防火墙的Local的策略,而且要注意,这里是涉及到双向问题,BJ防火墙GRE过去,CS防火墙需要允许进来,同样CS防火墙GRE过去,BJ防火墙要允许进来。

BJ_FW策略
 rule name local_gre
  source-zone local
  destination-zone gre
  source-address 202.100.1.1 mask255.255.255.255
  destination-address 202.100.2.1 mask255.255.255.255
  action permit
 rule name gre_local
  source-zone gre
  destination-zone local
  source-address 202.100.2.1 mask255.255.255.255
  destination-address 202.100.1.1 mask255.255.255.255
  action permit  
 
CS_FW策略
 rule name local_gre
  source-zone local
  destination-zone gre
  source-address 202.100.2.1 mask255.255.255.255
  destination-address 202.100.1.1 mask255.255.255.255
  action permit
 rule name gre_local
  source-zone gre
  destination-zone local
  source-address 202.100.1.1 mask255.255.255.255
  destination-address 202.100.2.1 mask255.255.255.255
  action permit
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

策略放行了tunnel所在的接口gre跟local之间的双向流量。

异地局域网如何互通?(GRE篇)_封装_16

异地局域网如何互通?(GRE篇)_封装_17

还是不通!!!!到这是不是有点心态崩了,其实博主可以不这么麻烦直接就简单的方式把步骤写出来就行,对于我来说其实更省事,但是这样对于学习的人来说印象会不深刻,抓不到问题的重点,所以用这样一层一层排查的方式来讲解,这样也是工作中会经常遇到的问题,所以这里想重点讲解下,这也是博主一直说课件编写才是最费心思的一件事,也是对购买课程朋友的一种负责,能学习到技术的同时,还能学到排错的思路。

(4)真遇到这样的问题该如何解决?

 问题的方向已经锁定了,就出在Local流量放行的问题上面,在实际中如果确实找不出来问题了,那么博主建议是把策略放宽,这个放宽可以分情况来。

1、如果问题方向并不明确,那么可以把默认安全策略改为permit

2、如果方向锁定了,跟上面一样,那么我们可以把策略改成Local到any,以及any到Local。

3、这样修改后,在通过会话表来查看是需要放行哪些流量,在明细放行,这也是博主在工作中遇到这样的情况处理的办法。

两台防火墙策略都改改成这样(去掉之前配置的安全策略)

rule name local_gre
  source-zone local
  action permit
 
 rule name gre_local
  destination-zone local
  action permit
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

等于现在Local到any以及any到Local都放行了。

异地局域网如何互通?(GRE篇)_IP_18

总算通了!!!!,我们把关注点放在为什么通了,需要放行什么样的流量。

(5)防火墙应该如何放行安全策略?

异地局域网如何互通?(GRE篇)_封装_19

异地局域网如何互通?(GRE篇)_封装_20

通过看两边的会话信息已经得出来应该需要放行什么样的流量了。

BJ防火墙需要放行

(1)Local与untrust的双向策略,策略里面没显示Local_untrust的流量,实际是需要放行的,源目地址是双方的公网地址,协议是GRE(在下一代防火墙中没有显示Local-untrust的了,如果用的UTM的5500就会显示)。

(2)Gre与local的双向流量,这里由于是10.1.1.1(BJ防火墙)ping的10.1.1.2(CS防火墙),所以只显示了gre到Local的,如果不双向放行,那么10.1.1.2则ping不通10.1.1.1,在实际中建议放行,不管是测试隧道的连通性,还是跑OSPF这些动态路由协议的时候,都建议放行该策略。

(3)加上上面BJ防火墙trust到gre的流量以及CS防火墙gre到trust的流量。

(4)CS防火墙跟BJ防火墙是一样的放行,这里就不在分析了。

BJ防火墙策略修改


 rule name local_untrust
  source-zone local
  destination-zone untrust
  source-address 202.100.1.1 mask255.255.255.255
  destination-address 202.100.2.1 mask255.255.255.255
  service gre
  action permit
 rule name untrust_local
  source-zone untrust
  destination-zone local
  source-address 202.100.2.1 mask255.255.255.255
  destination-address 202.100.1.1 mask255.255.255.255
  service gre
  action permit
rule namelocal_gre
  source-zone local
  destination-zone gre
  source-address 10.1.1.1 mask255.255.255.255
  destination-address 10.1.1.2 mask 255.255.255.255
  action permit
 rule namegre_local


  source-zone gre
  destination-zone local
  source-address 10.1.1.2 mask 255.255.255.255
  destination-address 10.1.1.1 mask 255.255.255.255
  action permit
 
rule nametrust_GRE
  source-zone trust
  destination-zone gre
  source-address 192.168.10.0 mask255.255.255.0
  destination-address 192.168.20.0 mask255.255.255.0
  action permit
 
CS防火墙策略修改


 rule namelocal_untrust


  source-zone local
  destination-zone untrust
  source-address 202.100.2.1 mask255.255.255.255
  destination-address 202.100.1.1 mask255.255.255.255
  service gre
  action permit
 rule nameuntrust_local


  source-zone untrust
  destination-zone local
  source-address 202.100.1.1 mask255.255.255.255
  destination-address 202.100.2.1 mask255.255.255.255
  service gre
  action permit
rule namelocal_gre
  source-zone local
  destination-zone gre
  source-address 10.1.1.2 mask 255.255.255.255
  destination-address 10.1.1.1 mask 255.255.255.255
  action permit
 rule name gre_local
  source-zone gre
  destination-zone local
  source-address 10.1.1.1 mask 255.255.255.255
  destination-address 10.1.1.2 mask255.255.255.255
  action permit
 rule name Gre_trust
  source-zone gre
  destination-zone trust
  source-address 192.168.10.0 mask255.255.255.0
  destination-address 192.168.20.0 mask255.255.255.0
  action permit
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.

异地局域网如何互通?(GRE篇)_IP_21

异地局域网如何互通?(GRE篇)_封装_22

这次就访问成功了。

总结GRE的要点

(1)192.168.10.1访问192.168.20.2通的整个过程。

当192.168.10.1访问192.168.20.2的80的时候,北京防火墙会查询路由表

异地局域网如何互通?(GRE篇)_安全策略_23

发现走的tunnel,在安全策略放行的情况下(允许Trust到gre)数据引向tunnel接口进行封装,打上tunnel口新的源目IP,协议是GRE

异地局域网如何互通?(GRE篇)_IP_24

这个时候防火墙会再次查询路由器去往202.100.2.1,发现走公网出去,这个时候防火墙会再次查询安全策略是否允许Local 202.100.1.1 到untrust 202.100.2.1的GRE协议出去,有安全策略则直接交给公网设备。 

数据包抵达CS防火墙后,防火墙发现是给自己的包,首先还是查看是否有安全策略允许untrust_local处理GRE协议的放行,有就开始进行解封装,把GRE的头部去掉,得到原始数据。(这里防火墙之所以会知道是GRE报文是因为在新IP头部里面会写明,有一个协议类型,字段为47则表示GRE,所以防火墙通过这个判断有GRE报文,最终送到tunnel口处理。)

异地局域网如何互通?(GRE篇)_IP_25

防火墙再次查找路由表发现192.168.20.2是直连接口G1/0/0出去,再查询安全策略看是否允许从gre 192.168.10.1到trust 192.168.20.2通过,通过则转发给服务器,最终完成访问。(这里注意防火墙解封装是由tunnel口处理的, 所以原始数据的源区域就是tunnel口所在的安全区域)。 

(2)安全策略放行要点

  • local与untrust的双向放行,源目地址为tunnel所调用公网地址。比如北京防火墙放行local 202.100.1.1到untrust的202.100.2.1的GRE,以及untrust的202.100.2.1到local 202.100.1.1的GRE,双向放行,因为该策略作用就是保证GRE能够正常建立隧道,同理,CS防火墙也是一样。
  • trust与gre隧道的放行,这个根据实际情况内网网段所在的安全区域以及tunnel口所在的区域。比如这里的北京防火墙内网192.168.10.1访问192.168.20.2就是从trust到gre,但是到了长沙防火墙则相反,解封装后数据是从gre到trust。
  • 上面两点建议配合上面的安全策略结合看最佳,策略实施的时候一定要考虑进与出双方流量。

(3)GRE配置要点

  • 封装协议指定为GRE
  • 两边对接地址建议为一个30位的对接即可,保持在一个网段,既能让接口up,又可以在跑OSPF或者测试的时候更加方便。
  • 源跟目为双方的公网地址,配置的时候互为镜像,比如北京这边的源就是CS的目的,源地址有两种配置方式,可以是写公网地址也可以基于接口调用。
  • 接口一定要加入安全区域,否则跟物理口一样,防火墙无法判断数据包的方向导致访问失败。这里博主建议是划入一个单独的区域,这样在安全策略的规划上更加方便。
  • tunnel还有一个重要的地方,如果tunnel的destination地址在路由表没有路由条目的话,会导致tunnel口down。

(4)强烈建议抓包看看GRE的数据包封装,对于理解GRE更加深入。

异地局域网如何互通?(GRE篇)_安全策略_26

思考练习

两边防火墙是否有必要放行GRE与local的策略,如果不放行 192.168.10.1能够访问到192.168.20.2吗?以及会造成什么样的问题?并且在简单的环境下,就想让两个局域网通起来,最简单化的安全策略应该怎么配置?

“承上启下”

GRE能够很好的解决客户提出来的两地局域网互通的功能,但是它也存在一些缺点跟局限性,下一篇来看看GRE有哪些部署的局限性跟缺点。

异地局域网如何互通?(GRE篇)_安全策略_27

作者:网络之路一天  首发公众号:网络之路博客(ID:NetworkBlog)