Ubuntu
如何使用 iptables 創建 UDP 代理
我有一個在埠 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
但它似乎不起作用——我什至看不到我的伺服器上的連接。我不確定這是由於錯誤的配置還是由於其他一些問題。
一些問題:
- 添加 nat 配置後,是否需要以某種方式重新啟動 iptables?
- 我是否需要允許傳入埠的流量或具有 NAT 設置就足夠了?
更新:實際處理流量的伺服器與我嘗試設置 iptables 的伺服器位於另一台機器上。
您的描述中沒有提到一些要點:
- 如果您將 iptables 機器收到的流量轉發到另一台機器。您需要啟用 IP 轉發。詳情見下文。
- 此外,您需要允許轉發的流量通過。這可以通過將
FORWARD
鏈預設策略設置為ACCEPT
或通過允許特定流量 (ip/port) 來完成。要啟用 IP 轉發,請取消註釋以下行
/etc/sysctl.conf
:net.ipv4.ip_forward=1
然後,執行:
sudo sysctl -p
.使用命令添加規則
iptables
只會將它們添加到記憶體中(重啟後它們會失去)。您需要將它們保存到文本文件中iptables-save
,並在需要時使用iptables-restore
.