Virtualization

NAT ing 到埠 80 不工作,當請求本身

  • June 13, 2012

我們有一台帶有本地 IP NAT 到公共 IP 的虛擬機的機器。

當請求到達埠 80 上的公共 IP 時,它將被重定向到具有本地 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 遠端登錄到公共 IP 埠 80,但即使有網路連接,連接也沒有發生。

有沒有辦法可以解決這個問題?

netstat在 vm 節目上

$ netstat -ntp |grep 80
tcp        0      1 localip:53067    public-ip:80        SYN_SENT    22226/telnet**

輸出iptables-save -c

將 192.168.61.31 視為 eth0 上的 pub ip 192.168.61.40 視為 eth0:1 上的 pub ip

# 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

引用自:https://serverfault.com/questions/398153