Ubuntu

如何使用 iptables 創建 UDP 代理

  • March 6, 2012

我有一個在埠 50000 上執行 UDP 伺服器的伺服器。該伺服器從客戶端接收更新,並每 5 秒將客戶端 ping 回它們所連接的套接字。

現在我想通過另一台伺服器重定向所有進出該 UDP 伺服器的流量。基本上我想在這台伺服器前面設置一個透明代理。原因是我希望能夠輕鬆控制哪個伺服器處理 UDP 流量,而無需更改 DNS 設置。

起初我嘗試使用 socat 創建這個代理:

socat UDP-LISTEN:50000,fork UDP:myserver:50000

但這似乎適用於傳入流量,但從我的伺服器到客戶端的返回流量沒有到達目的地。此外,socat 似乎為每個連接分叉了另一個程序,因此當客戶端斷開/切換 IP 時,我可能會遇到太多程序以及死程序。

我意識到我可以為此使用 iptables NAT 功能,但它似乎對我不起作用。我試過的配置是:

sudo iptables -t nat -A PREROUTING -p udp --dport 50000 -j DNAT --to-destination myserver:50000

但它似乎不起作用——我什至看不到我的伺服器上的連接。我不確定這是由於錯誤的配置還是由於其他一些問題。

一些問題:

  1. 添加 nat 配置後,是否需要以某種方式重新啟動 iptables?
  2. 我是否需要允許傳入埠的流量或具有 NAT 設置就足夠了?

更新:實際處理流量的伺服器與我嘗試設置 iptables 的伺服器位於另一台機器上。

您的描述中沒有提到一些要點:

  1. 如果您將 iptables 機器收到的流量轉發到另一台機器。您需要啟用 IP 轉發。詳情見下文。
  2. 此外,您需要允許轉發的流量通過。這可以通過將FORWARD鏈預設策略設置為ACCEPT或通過允許特定流量 (ip/port) 來完成。

要啟用 IP 轉發,請取消註釋以下行/etc/sysctl.conf

net.ipv4.ip_forward=1

然後,執行:sudo sysctl -p.

使用命令添加規則iptables只會將它們添加到記憶體中(重啟後它們會失去)。您需要將它們保存到文本文件中iptables-save,並在需要時使用iptables-restore.

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