服务无法连接到使用公共IP,NAT问题的自己

我有一个serverloft.eu专用服务器,但由于一些networking安全,我不能在我的服务器上使用网桥。 所以我把所有的IP都设置到了eth0的主要地址,并且使用NAT将主要的eth0转发到内部networking。 但是我遇到了一个问题,我的虚拟服务器上的服务无法使用公共IP连接到自己,即。 telnet 192.168.122.3 80工作正常,但telnet pub.lic.ip.xx 80次。 (当用ip 192.168.122.3在virual机器上input时)

我的iptables脚本如下所示:

#!bin/sh iptables -F iptables -t nat -F iptables -P FORWARD ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PORTS="22 25 110 143 587 993 995" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.189 --dport $port -j DNAT --to 192.168.122.2:$port done PORTS="22 80 443" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.173 --dport $port -j DNAT --to 192.168.122.3:$port done PORTS="22 3306 5432" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port iptables -t nat -A PREROUTING -p udp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port done 

我错过了什么?

使用伪装NAT(无论是iptables中的NAT还是消费者路由器/防火墙中的简单NAT),从内部networking到达外部IP是不可能的。 在这种情况下,地址转换会以一个具有相同源地址和目的地址的数据包结束,并且永远不会通过filter将其地址转换回原来的IP地址。

我知道,如果你在一台机器上使用虚拟networking,这并不是一个真正可行的解决scheme,但是我通常通过使用水平分割DNS和NAT(内部)IP来实现内部视图和外部IP外面的看法。

经过大量的阅读和testing,我最终find了一个解决scheme,我已经修改了我的iptables脚本到这个:

 #!/bin/sh iptables -t nat -F iptables -F iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -P INPUT ACCEPT iptables -t nat -A POSTROUTING -o eth0 -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE iptables -A FORWARD -s 192.168.122.0/24 -j ACCEPT iptables -A FORWARD -d 192.168.122.0/24 -j ACCEPT iptables -A FORWARD -s ! 192.168.122.0/24 -j DROP PORTS="22 25 110 143 587 993 995" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.189 --dport $port -j DNAT --to 192.168.122.2:$port done iptables -t nat -A POSTROUTING -s 192.168.122.2 -j SNAT --to xx.xx.xx.189 PORTS="22 80 443" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.173 --dport $port -j DNAT --to 192.168.122.3:$port done iptables -t nat -A POSTROUTING -s 192.168.122.3 -j SNAT --to xx.xx.xx.173 PORTS="22 3306 5432" for port in $PORTS; do iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port iptables -t nat -A PREROUTING -p udp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port done iptables -t nat -A POSTROUTING -s 192.168.122.4 -j SNAT --to xx.xx.xx.174 

我所做的是,我已经添加了一个-j SNAT从他们的内部IP到他们的外部IP。

一个更好的解决scheme是编写一个规则,将公有IP地址( xxxx )重写为localhost:

 iptables -t nat -A OUTPUT -d xxxx/32 -p tcp -m tcp --dport 80 \ -j DNAT --to-destination 127.0.0.1:80