问题描述
在一些内网部署服务的场景中,比如家庭nass,希望通过外部对内部服务进行访问。由于nat的隔离,则需要在网关防火墙上做端口转发(关于端口转发的原理,本文不表,默认读者是知道的)。经典拓扑如下:
如上图,网关设备外网ip 为12.x.x.178,内部网段外192.168.1.1。其中服务部署在内部主机 192.168.1.100上。为了让外部主机(pc1)能够通过网关设备的公网地址,访问到服务,在网关防火墙上,配置如下规则(核心规则):
-
iptables -t nat -i prerouting -d 12.x.x.178 -p tcp -m tcp --dport 8080 -j dnat --to-destination 192.168.1.100
-
-
iptables -i foreard -d 192.168.1.100 -j accept
经过上面配置后,pc1 可以通过12.x.x.178:8080 访问到内部服务!
但是,内网pc2,试图通过12.x.x.178:8080 访问内部服务时,却无法访问!过程如下:
pc2在请求服务过程中,由于发送的目标地址和接收数据的源地址不匹配,所以pc2会丢弃相关数据包,而导致服务无法访问!通过tcpdump/wireshark抓包,也证实这一点。
凯发app官方网站的解决方案
经过上面的分析,我们已经很清楚问题的原因了:内部地址通过端口映射访问内部服务,在dnat后,源地址没有正确映射,导致出现发送接收不同源的问题。做如下调整即可:
总结
只要在外部映射的基础上,加两条内部dnat & snat映射规则,既可以处理:内部主机通过映射后的外部ip访问内部服务,造成的端口转发中的回流问题。新增配置如下()
-
iptables -t mangle -i prerouting -i br-lan -d 112.x.x.178 -j connmark --set-xmark 0x100000/0xf00000
-
-
iptables -t nat -i prerouting -i br-lan -m connmark --mark 0x100000/0xf00000 -j dnat --to-destination 192.168.1.100
-
-
iptables -t nat -i postrouting -o br-lan -m connmark --mark 0x100000/0xf00000 -j snat --to-source 12.x.x.178
阅读(7760) | 评论(0) | 转发(0) |