我删除了原来的答案,因为我不确定它是正确的。从那以后,我花了一些时间建立一个虚拟机虚拟网络来模拟所讨论的网络。这是一组适用于我的防火墙规则(iptables-save
格式nat
仅适用于表):
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
第一条POSTROUTING
规则是与LAN共享Internet连接的直接方法。为了完整起见,我把它留在那里。
该PREROUTING
规则和第二个POSTROUTING
规则一起建立了适当的NAT,因此,无论连接是来自外部还是内部,都可以通过外部IP地址与服务器建立连接。当LAN上的客户端通过外部IP地址连接到服务器时,服务器会将连接视为来自路由器的内部IP地址(192.168.2.1)。
有趣的是,事实证明,第二个POSTROUTING规则也有几个变体也可以使用。如果将目标更改为-j SNAT --to-source 192.168.2.1
,效果(并不奇怪)与:相同MASQUERADE
:服务器将来自本地LAN客户端的连接视为源自路由器的内部 IP地址。另一方面,如果将目标更改为-j SNAT --to-source 89.179.245.232
,则NAT仍然有效,但是这次服务器将来自本地LAN客户端的连接视为源自路由器的外部 IP地址(89.179.245.232)。
最后,请注意原来的PREROUTING
/ DNAT
规则-i ppp0
不起作用,因为该规则永远不会匹配来自LAN客户端的数据包(因为这些数据包不会通过ppp0
接口进入路由器)。可以通过PREROUTING
仅为内部LAN客户端添加第二条规则来使其工作,但这是不雅的(IMO),并且仍然需要显式引用外部IP地址。
现在,即使在详细介绍了“发夹式NAT”(或“ NAT环回”或“ NAT反射”,或任何喜欢称呼它的解决方案)解决方案之后,我仍然相信水平分割DNS解决方案- -将外部客户端解析为外部IP,将内部客户端解析为内部IP-将是更明智的选择。为什么?因为了解DNS的人比了解NAT的人更多,因此构建良好系统的很大一部分是选择使用可维护的部分。与奥秘的NAT设置(当然是IMO)相比,DNS设置更易于理解,并因此得到正确维护。