作者:李毓
NAT端口回流其实是一个老生常谈的问题,但是我发现其实这个问题有很多人并没有理解为什么会发生以及并没有给出一个合理的解决方法。今天我们就一起探讨一下这个问题的产生以及如何去解决它。
在一般的企业,我们一般都会有这样的网络拓扑结构:
最外层是一个接口路由器,后面接一个三层交换机,里面划分了许多vlan。后面再接PC和server。 在一些小公司,我们可能没有三层交换机,当我们做端口映射的时候。我们会发现不管从外网telnet 54.67.87.34:13389,从内网telnet这个端口,都是可以通的。 然后在一些中型公司,比如这种划分了vlan的公司,后面接了一台三层核心交换机,我们发现,外网telnet54.67.87.34:13389也没有问题,但是内网telnet这个端口,居然不通了。
针对这个问题,我们根据这个拓扑图来抓包分析。 我们这个54.67.87.34:13389端口假设在路由器里面做了端口映射,映射到了192.168.4.41:3389端口
iptables -t nat -A PREROUTING -d 54.67.87.34 -p tcp --dport 13389 -j DNAT --to-destination 192.168.4.41:3389 这个时候,如果你telnet 54.67.87.34:13389这个端口,会发现其实是不通的。我们从内网抓包看看,截图如下:
然后我们从外网telnet一下这个端口,是通的,截图如下:
我们可以看到,在内网回包的时候,4.186把包给丢弃了。那么为什么会丢弃呢?因为内网建立的连接,把包发到路由器的外网 ip 地址,但回来的包源地址是运行服务的设备的内网ip地址,机器发现IP地址不对,就会将其丢弃。
现在已经定位到问题了,那么可以给出解决方案了。
只需要将源地址改为路由器接口地址即可。
那么怎样改呢,有以下两种方法。 1.在路由器上写nat,转换源IP地址为路由接口地址。 2.在三层交换机上写acl做双NAT地址转换。
第二种方法较为复杂,第一种方法比较简单,写一条nat规则即可。
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.4.41/22 --dport 3389 -j SNAT --to-source 192.168.88.1
将源地址转换为路由器接口地址。 这样问题就可以完美解决了。
标签:--,解决方案,端口,telnet,87.34,NAT,13389,路由器 From: https://blog.51cto.com/u_14783669/6521825