Ubuntu
Ubuntu (Docker) 上的 iptables 埠轉發
我有一個在 Kubernetes 中執行的 Ubuntu Docker 映像,我正在嘗試設置埠轉發,以將來自埠 5000 的請求路由到不同的目的地和埠(10.30.8.191:443)。我安裝了iptables(預設不安裝)並添加了以下規則:
iptables -A PREROUTING -t nat -p tcp --dport 5000 -j DNAT --to 10.30.8.191:443 iptables -A FORWARD -p tcp -d 10.30.8.191 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
我也驗證
/proc/sys/net/ipv4/ip_forward
設置為1
. 但是,對結果進行 curl 呼叫會https://127.0.0.1:5000
導致connection refused
. 我已經驗證10.30.8.191
可以從該主機直接訪問目標 ip。有什麼想法我可能會錯過嗎?我沒有在我的 iptables 規則中指定介面,據我了解,這意味著規則應該適用於所有現有介面。不是這樣嗎?
- 本地發起的數據包不通過
nat/PREROUTING
鏈。要成功請求 127.0.0.1:5000,您應該將相同的DNAT
規則添加到nat/OUTPUT
鏈中:iptables -t nat -A OUTPUT \ -d 127.0.0.1 -p tcp --dport 5000 \ -j DNAT --to 10.30.8.191:443
- 它還需要改變
net.ipv4.conf.lo.route_localnet
變數:sysclt -w net.ipv4.conf.lo.route_localnet=1
- 回複數據包應該通過您的 ubuntu 主機,否則您會遇到路由三角形問題。為此,您應該添加
SNAT
規則:iptables -t nat -A POSTROUTING \ -d 10.30.8.191 -p tcp --dport 443 \ -m conntrack --ctstate DNAT --ctorigdstport 5000 \ -j MASQUERADE