Iptables
iptables:透明 tcp 流量代理
問題:
我有一個 TCP 伺服器和客戶端,每個都偵聽埠 9000。我將伺服器和客戶端部署在兩個不同的主機上,其中流量只能通過它們之間的埠 80。我希望在它們之間發送數據包時保持源埠(9000)(請參閱下面的 SNAT 規則),以便 PREROUTING 規則可以辨識帶有
--source-port
.方法:
我正在嘗試設置 iptables 規則,以便伺服器將其流量從埠 9000 路由到埠 80,並為客戶端設置一個免費規則,其中埠 80 上的傳入流量在本地路由到 9000。
我想出了這個腳本來應用規則。我已經嘗試了一些變體,數據包似乎被伺服器主機接受,但不被 PREROUTING(入站)規則接受。
#!/bin/bash apply_inbound_rules() { # Allow incoming server traffic from port 80 to the TCP client sudo iptables -t nat \ -I PREROUTING \ -p tcp --destination-port $PROXY_PORT \ -j REDIRECT --to-port $TCP_PORT } apply_outbound_rules() { # Setup outgoing packets created by the TCP server # to route through local port 80 # and received on port 80 on the client host sudo iptables -t nat \ -I OUTPUT \ -p tcp --destination-port $TCP_PORT \ -j DNAT --to-destination :$PROXY_PORT # To maintain the TCP_PORT sudo iptables -t nat \ -I POSTROUTING \ -p tcp --destination-port $PROXY_PORT \ -j SNAT --to-source :$TCP_PORT } apply_inbound_rules apply_outbound_rules
有沒有人有創建這樣的規則的經驗?似乎這將是一個常見問題,但我似乎無法弄清楚。
這是我的評論翻譯成回复。
應該調整規則以依賴源埠的出站 MASQUERADE 來處理返回數據包。因此,傳出數據包應該使用您擁有的規則進行 DNAT 編輯,並使用規則進行 MASQUERADE 編輯:
iptables -t nat -A POSTROUTING -p tcp --destination-port $PROXY_PORT -j MASQUERADE --to-ports $TCP_PORT
使用該規則而不是您的 SNAT 規則。
與那些被 MASQUERADE-ed 相關的傳入數據包將得到他們的目標埠適當的返回映射。
(根據評論更正)