思科、华为防⽕墙做端⼝回流解决内⽹主机⽆法通过公⽹访问内
⽹服务的问题
问题产⽣原因分析:
⽹络环境介绍:
公司内⽹有⼀台web服务器,地址是192.168.100.100,web服务端⼝为80,并且为这台web服务器申请了DNS A记录的域名解析服务,解析记录是公司出⼝ip地址100.100.100.100。在办公区⽹络环境⾥,还有内⽹192.168.10.0⽹段,需要通过申请的域名来访问公司内⽹的192.168.100.100的web服务。
做法是在防⽕墙的出⼝,做⼀条端⼝映射,100.100.100.100:80到192.168.100.100:80的端⼝映射。
问题来了,做好端⼝映射以后,其他外部⽹络通过域名访问公司的web服务是正常的,但是公司内⽹⽤户通过域名访问公司⾃⼰的web服务,却⽆法访问;⽽公司内⽹⽤户通过192.168.100.100:80私有地址访问,是正常的。这种情况,就是因为做好端⼝映射以后,访问web服务的流量在响应的时候流量没有回流到防⽕墙导致的。
原因分析:
如上图,假如是192.168.10.10通过申请的域名访问192.168.100.100的web服务。这⾥假设访问的源端⼝是10000,⽬标端⼝是80,数据包分析如下:
C2主机发起web请求.因为通过域名访问的,DNS解析服务正常,那么访问⽬标就是100.100.100.100:80
192.168.10.10:10000--->100.100.100.100:80
数据包最终会被路由到防⽕墙上,防⽕墙检查访问的⽬的地址,匹配到它的端⼝映射策略,将⽬标地址改为对192.168.100.100的访问,建⽴起⼀个针对⽬标ip地址转换的NAT会话表
192.168.10.10:10000--->192.168.100.100:80
然后数据包到会被转发到192.168.100.100服务器上并会响应192.168.10.10主机的请求,将上述访问的源⽬ip地址及端⼝进⾏倒转,并将数据包交给它的⽹关处理,图中就是R1路由器
192.168.100.100:80--->192.168.10.10:10000
R1路由器检查访问者的源ip和⽬标ip地址,发现⽬标ip地址是192.168.10.10,是R1路由器⼀个可路由的内⽹ip地址,就会将数据包直接路由到C2主机上
C2主机接收到数据包,检查数据包的源ip和端⼝是192.168.100.100:80,发现其本⾝并没有这样⼀个http会话与之相匹配,就是说C2主机并没有主动发起对192.168.100.100:80的访问,发起的是对100.100.100.100:80的访问,那么C2主机就会丢弃这个数据包,导致内⽹⽤户通过域名或者公⽹ip地址访问⾃⼰的内⽹服务器不通的现象。
192.168.100.100:80--->192.168.10.10:10000
上述就是造成我们开头所说问题的原因。发⽣上述问题的原因,就是因为其R1路由器发现响应数据包的⽬的ip地址是内⽹⼀个可直接路由的地址,就会直接在内⽹进⾏路由转发,⽽不是将数据包交给防⽕墙进⾏路由转发。
不要认为这是bug,这是正常现象,任何设备只要做了端⼝映射,都绕不开这个问题,因为TCP/IP协议栈就是这样⼯作的。你要推倒重来,除⾮⾃⼰去设计⼀套⽹络协议标准,况且在现有的TCP/IP的协议框架下,这个问题⼜不是说不能解决。那为何有的设备不⽤做端⼝回流呢?那是因为有的设备在你做端⼝映射的时候,偷偷地把端⼝回流的问题也给你解决了。然⽽你也不要以为它们帮你做了端⼝回流,你就认为那些设备是好设备,感觉好⾼端,那你错了,我很少见企业级设备偷偷地帮你解决这个问题的(不是说没有,⼀般是应⽤层⽹络设备有这个),都是需要你主动去处理解决,这也体现了它们设备⾼度可定制性及扩展性。
你要⾼度可定制性和扩展性,那就要牺牲⼈性化的设计,需要专业⼈员去帮你做业务上的定制;你要⼈性化,⾃⼰点点⿏标就能把问题解决,那它就不可能在可定制性和扩展性上给你太多,这个世界上的事情也是如此,没有⼗全⼗美。
解决⽅法:
这⾥介绍下思科防⽕墙和华为防⽕墙上如何解决这个问题。⾄于其他⼚家的设备或者路由器等⽹络设备,如何解决,可以⾃⾏查阅相关资料,解决的原理都⼀样
这⾥只介绍其中⼀个解决⽅法,还有其他⽅法,可以⾃⾏查阅相关资料
解决⽅法的思路:内⽹主机在访问的时候,将web服务的响应流量回流到防⽕墙上来,接受防⽕墙的处理。就是说,在流量经过防⽕墙的时候,将源地址做⼀个修改,使得R1路由器在路由数据包的时候,还把这个数据包路由到防⽕墙上来,⽽不是在内⽹直接路由;防⽕墙上有记录它所做的相应修改(做源地址转换,并维护这个NAT会话表即可),再把之前的修改给改回来,再转发给内⽹主机即可。
内⽹主机对通过公⽹对内⽹服务器访问的时候,流量在经过防⽕墙时,将内⽹主机的ip地址修改为⼀个外⽹ip地址(源NAT转换),并做好及维护相应的NAT会话的记录,这样服务器在接收到数据包之后,发现源ip地址是⼀个外⽹ip地址,这样数据流量会回流到防⽕墙,防⽕墙检查相应的源NAT转换策略,发现可以匹配,则进⾏源NAT的还原,并经数据包路由到内⽹的主机中
思科防⽕墙在做端⼝映射的时候,分为static(inside,outside)和static(inside,inside),⽅向不同。但是华为防⽕墙没有这个问题,因此思科在解决这个问题时,有下⾯两个关键步骤,⽽华为防⽕墙只需要下⾯第⼀步(准确来说,华为防⽕墙只是⽤的第⼀步的思路,实现⽅式和思科防⽕墙略微有些区别)即可。
第⼀步:内⽹192.168.10.0⽹段对100.100.100.100的访问的时候,将源地址做⼀个转换,转换为防⽕墙内⽹⼝inside对100.100.100.100的访问。
这⼀步你可以理解为⽤防⽕墙的内⽹inside接⼝的地址去访问100.100.100.100。
之前做的全局NAT的转换,内⽹192.168.10.10对所有外⽹的访问,是转换为防⽕墙outside⼝对外⽹的访问,即防⽕墙outside代理防⽕墙内⽹中的所有主机去访问外⽹,例如百度
第⼆步:内⽹192.168.10.0⽹段对100.100.100.100:80的访问,将⽬标地址做⼀个转换,转换为对内⽹192.168.100.100:80的访问。
这⼀步是做LAN到LAN的端⼝映射
思科防⽕墙:这⾥是基于思科防⽕墙8.2系统版本的配置,新版本配置有所改变,但是解决⽅法的原理类似
先做最基础的配置,这⾥是我们平时上⽹说必须要的配置
1、全局的NAT源地址转换,注意下⾯数字要对应。这⼀步主要是为了让内⽹⽤户可以正常访问外⽹⽤的
# nat (inside) 1 0.0.0.0 0.0.0.0            //这条命令匹配了所有ip地址
# global (outside) 1 interface            //对上⾯匹配的IP地址访问外⽹的流量,做源地址转换,源地址是interface outside接⼝的ip地址,即100.100.100.100
2、做端⼝映射(⽬的ip地址转换):我们做的web服务是为我们的⽤户提供服务的,因此我们需要做⼀个端⼝映射,能够让⽤户访问我们的web服务
# static (inside,outside) tcp 100.100.100.100 80 192.168.100.100 80 netmask 255.255.255.255 //外⽹outside区域⽹络访问
100.100.100.100:80的时候,将转换对192.168.100.100:80的访问
3、内⽹192.168.10.0⽹段访问100.100.100.100的时候,也做源地址转换,但是区别上⾯的第1步,这⾥将源地址改为防⽕墙的内⽹⼝inside ⼝
# access-list 100 extended permit ip 192.168.10.0 255.255.255.0 host 100.100.100.100 //匹配公司内⽹192.168.10.0/24访问公⽹
ip100.100.100.100的流量
# nat (inside) 10 access-list 100
# global (inside) 10 interface //对捕获的流量做源地址转换,转换成interface inside接⼝的ip地址。就是说内⽹访问100.100.100.100的流量的源地址,转换为防⽕墙内⽹⼝的地址,变为防⽕墙inside⼝对web服务的访问。
注意:如果这⾥是路由器或者其他⽹关设备的话,需要将interface换成这台路由器或者⽹关设备真实的ip地址,这⾥思科防⽕墙可以使⽤接⼝名称代替
4、内⽹192.168.10.0⽹段对100.100.100.100:80的访问,做⽬的ip地址及端⼝的转换,但是这⾥区别上⾯的第⼆步,这⾥将⽬的地址改为内⽹服务器的ip地址,即192.168.100.100:80
# static (inside,inside) tcp 100.100.100.100 80 192.168.100.100 80 netmask 255.255.255.255 // //内⽹(inside区域)的⽹络对
100.100.100.100:80的访问转换为对192.168.100.100:80的访问
5、允许相同安全级别之间的接⼝可以互相转发数据
# same-security-traffic permit intra-interface
防⽕墙多⼀个这个步骤,路由器等其他⽹关设备没有
华为防⽕墙
1、全局NAT地址转换。这⼀步主要是为了让内⽹⽤户可以正常访问外⽹⽤的
# nat-policy interzone trust untrust outbound // 注意NAT策略⽅向
# policy 0
# action source-nat // 是做源地址转换
# policy source 192.168.0.0 mask 255.255.0.0 // 匹配内⽹所有主机ip
# easy-ip GigabitEthernet0/0/1 // 将源地址转换为防⽕墙GigabitEthernet0/0/1接⼝的ip地址(在企业,⼀般这个接⼝都是企业出⼝ip地址)2、端⼝映射:
# nat server 6 protocol tcp global 100.100.100.100 www inside 192.168.100.100 www
3、创建地址池
# nat address-group 1 1.1.1.1 1.1.1.2 // ip地址为1.1.1.1-1.1.1.2。咨询过华为⼯程师,这⾥的地址池可以任意写,但是必须保证在全⽹内唯⼀,数据可被路由到防⽕墙即可。不可以和上⾯的easy-ip重复
4、做域内NAT,注意和上⾯第⼆步NAT的区别,策略⽅向不⼀样
# nat-policy zone trust
# policy 1
# action source-nat
# policy source 192.168.0.0 mask 16 // 这⾥匹配需要通过公⽹访问的所有内⽹主机ip
# policy destination 192.168.100.100 mask 32 // 这⾥匹配,内⽹主机访问哪个ip的时候,执⾏这个NAT(可以和上⾯⼀样,写地址段)
# address-group 1 // 匹配以后,将源地址转换成这个地址池⾥的地址,注意1和上⾯的地址池索引相对应
说明:华为防⽕墙做好域间的策略,保证⽹络访问正常,这属于其他防⽕墙的知识范围,不做过多讨论。
上述华为防⽕墙端⼝回流最好以后,内⽹主机⽤户通过公⽹访问,还是不⾏。具体也咨询了华为⼯程师,把配置信息也发给他们看了下,他们检查配置也说配置没问题,不出问题所在。通过测试并查看防⽕墙的会话表,发现内⽹主机发起访问的时候,主机的源地址没有执⾏转换,就是上⾯的第4步没有⽣效,估计是防⽕墙版本的⼀个bug吧。有华为防⽕墙⼤神的,可以帮忙指出问题所在。
说下华为防⽕墙和思科防⽕墙解决这个问题的思路上的⼀点不同:
思科防⽕墙:
思科防⽕墙在内⽹通过公⽹访问内⽹web服务的时候,当流量到达防⽕墙以后,防⽕墙偷偷地数据包的源地址改成防⽕墙inside接⼝的地址了,这样web服务器收到数据包的时候,就会响应这个数据包,把这个数据包响应给防⽕墙,⽽不是内⽹的主机。防⽕墙收到响应数据包以后,再偷偷地将数据包的源ip地址(此时已经变成⽬的ip地址了)改成内⽹主机的ip地址,然后转发给内⽹主机。
华为防⽕墙:
华为防⽕墙在内⽹通过公⽹访问内⽹web服务的时候,当流量到达防⽕墙后,防⽕墙像思科防⽕墙⼀样,也会偷偷将数据包的源地址改成配置好的地址池中的⼀个ip地址(⼀般是⼀个公⽹地址,只要全局唯⼀即可);web服务器收到数据包的时候,就会响应这个数据包,因为是地址池内的地址,在内⽹不
可路由,数据就会被路由到防⽕墙上,防⽕墙再次偷偷地将数据包的源ip地址(此时也应变成⽬的ip地址了)修改成内⽹主机的ip地址,然后再发给内⽹主机。
不能用于局域网思科防⽕墙和华为防⽕墙在处理这个问题的时候,思路上有点不同。但是都是内⽹主机通过公⽹访问内⽹web服务的时候,偷偷将主机ip地址修改成⼀个在内⽹必须路由到防⽕墙的⼀个ip地址(就是说接受防⽕墙的控制),然后web服务响应数据会回流到防⽕墙,最后经防⽕墙处理,转发给内⽹主机。
台上⼗分钟,台下⼗年功。在控制台上敲的⼏下键盘,写的⼏⾏命令,台下的你可能要花上⼤半年甚⾄⼀两年的时间,去了解它背后实现的原理和遇到问题的解决⽅法。你可能要去了解整个TCP/IP协议栈的⼯作⽅式、防⽕墙的⼯作⽅式及⼯作原理、⼴域⽹以及局域⽹技术原理等等。总之,学⽆⽌境,越学越感觉⾃⼰之前⽆知。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。