Ubuntu

Ubuntu (Docker) 上的 iptables 埠轉發

  • May 2, 2019

我有一個在 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

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