如何使用 iptables 创建 UDP 代理

如何使用 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

但它似乎不起作用——我甚至看不到服务器上的连接。我不确定这是由于配置错误还是由于其他问题。

一些问题:

  1. 添加 nat 配置后,我是否需要以某种方式重新启动 iptables?
  2. 我是否需要允许流量进入传入端口或者 NAT 设置就足够了?

更新:实际处理流量的服务器与我尝试设置 iptables 的服务器位于不同的机器上。

答案1

您的描述中没有提到以下几点:

  1. 如果您要将 iptables 机器收到的流量转发到另一台机器。您需要启用 IP 转发。详情见下文。
  2. 另外,您需要允许转发的流量通过。这可以通过将FORWARD链默认策略设置为 来实现ACCEPT,或者通过允许特定流量(ip/端口)来实现。

要启用 IP 转发,请取消注释以下行/etc/sysctl.conf

net.ipv4.ip_forward=1

然后,执行:sudo sysctl -p

使用命令添加规则iptables只会将它们添加到内存中(重启后它们会丢失)。您需要使用将它们保存到文本文件中,iptables-save并在需要时使用恢复它们iptables-restore

相关内容