Iptables

iptables:透明 tcp 流量代理

  • September 11, 2020

問題:

我有一個 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 相關的傳入數據包將得到他們的目標埠適當的返回映射。

(根據評論更正)

引用自:https://unix.stackexchange.com/questions/413767