内网主机无法通过公网访问内网服务

10 分钟读完

问题产生原因分析

intranet service

网络环境介绍

公司内网有一台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的还原,并经数据包路由到内网的主机中。


[原文链接]