Virtualization

服務無法使用公共 IP 連接到自己,NAT 問題

  • October 7, 2016

我有一個來自 serverloft.eu 的專用伺服器,但由於某些網路安全性,我無法在我的伺服器上使用橋接網路。所以我已經將我所有的 IP 設置到主 eth0,並使用 NAT 將流量從主 eth0 轉發到內部網路。但是我遇到了一個問題,我的虛擬伺服器上的服務無法使用公共 ip 連接到自身,即。telnet 192.168.122.3 80 工作正常,但 telnet pub.lic.ip.xx 80 超時。(在ip為192.168.122.3的虛擬機上輸入時)

我的 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

我錯過了什麼?

經過大量閱讀和測試,我終於找到了解決方案,我將我的 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。

使用偽裝 NAT(無論是 iptables 中的 NAT 還是消費者路由器/防火牆中的簡單 NAT),都無法從內部網路訪問外部 IP。在這種情況下,地址轉換最終會得到一個具有相同源地址和目標地址的數據包,並且永遠不會通過過濾器將其地址轉換回原始內部 IP。

我知道如果您在一台機器內部使用虛擬網路,這不是一個真正可行的解決方案,但我通常通過使用水平分割 DNS 和 NATed(內部)IP 用於內部視圖和外部 IP 來解決這個問題外面的景色。

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