Virtualization
服務無法使用公共 IP 連接到自己,NAT 問題
我有一個來自 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 來解決這個問題外面的景色。