我们有一台虚拟机,带有本地IP地址转换为公网IP。
当端口80上的公共IP发出请求时,它将被redirect到具有本地IP的VM。
这是我们正在使用的iptable规则:
iptables -t nat -A PREROUTING -p tcp -d public-ip --dport 80 -j DNAT --to ip-of-vm:80
有些情况下,请求必须通过公共IP从vm发送给自己。
但是这不会发生,即VM不能通过公共IP进行通信。 我试图从vm telnet到公共IP端口80,但即使networking连接也没有连接。
有没有办法解决这个问题?
netstat上vm显示
$ netstat -ntp |grep 80 tcp 0 1 localip:53067 public-ip:80 SYN_SENT 22226/telnet**
输出iptables-save -c :
将eth0 192.168.61.40上的pub IP作为eth1:pub1 ip考虑为192.168.61.31
# Generated by iptables-save v1.4.12 on Wed Jun 13 13:29:06 2012 *nat :PREROUTING ACCEPT [9:1584] :INPUT ACCEPT [9:1584] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [12:720] [222:13320] -A PREROUTING -d 192.168.61.40/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.43:80 [164:9840] -A PREROUTING -d 192.168.61.31/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.42:80 [15:16631] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 [76:5092] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 [0:0] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE [0:0] -A POSTROUTING -s 192.168.122.0/32 -o virbr0 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.61.31 COMMIT # Completed on Wed Jun 13 13:29:06 2012 # Generated by iptables-save v1.4.12 on Wed Jun 13 13:29:06 2012 *mangle :PREROUTING ACCEPT [491283:64985216] :INPUT ACCEPT [467366:60033592] :FORWARD ACCEPT [23752:4941940] :OUTPUT ACCEPT [472767:103297872] :POSTROUTING ACCEPT [496519:108239812] [0:0] -A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill COMMIT # Completed on Wed Jun 13 13:29:06 2012 # Generated by iptables-save v1.4.12 on Wed Jun 13 13:29:06 2012 *filter :INPUT ACCEPT [467244:60021819] :FORWARD ACCEPT [23744:4941444] :OUTPUT ACCEPT [472681:103288146] [0:0] -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT [0:0] -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT [0:0] -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT [0:0] -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT COMMIT # Completed on Wed Jun 13 13:29:06 2012
我想你错过了另一个规则:
iptables -A POSTROUTING -s $PRIVATE_NET -o $PRIVATE_INTERFACE -p tcp -m tcp --dport 80 -j SNAT --to-source $PUBLIC_IP