如何在 iptables 中禁用通过 NAT 发送的传出 UDP 数据包的隐式源端口映射?

如何在 iptables 中禁用通过 NAT 发送的传出 UDP 数据包的隐式源端口映射?

iptables 正在重写从 tun 接口发出的 UDP 数据包的源端口。我设置了 NAT 规则并转发了端口 X(详细信息如下)。当 NAT 后面的应用程序在端口 X 上收到转发的 UDP 数据包,然后通过发送另一个 UDP 数据包(该数据包应具有源端口 X)来“回复”它时,该数据包会以某种方式获取源端口 1024。源端口已被重新分配。 -在它离开NATed盒子之前就写好了。远程应用程序拒绝此数据包,因为它需要源端口 X,而不是 1024。

我觉得 ”隐式源端口映射“正在发生。我不需要它,因为端口 X 专用于一个功能,并且不会发生冲突:NATing 机器和任何其他机器都不会使用该端口。我如何强制 iptables 只保留源端口是这样吗?

在 NAT 后面的主机(重写源端口的数据包源自该主机)上,我尝试了以下操作(一次一个),结果均相同:

iptables -t nat -A POSTROUTING -o tun0 -p udp --sport X -j SNAT --to 10.7.0.5:X
iptables -t nat -A POSTROUTING -o tun0 -p udp -j SNAT --to 10.7.0.5
iptables -t nat -A POSTROUTING -o tun0 -p udp -j MASQUERADE

在执行 NAT 的远程外部设备上:

iptables -t nat -A PREROUTING -i eth0 -p udp --dport X -j DNAT --to-destination 10.7.0.5:X
 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

答案1

通过将应用程序绑定到 tun0 接口而不是 0.0.0.0 解决了问题。

我尝试这样做是因为在 中conntrack -E,我看到连接具有来自不同接口(不是 tun0)的源地址。因此,即使数据包到达了正确的目的地,并且重写了正确的源地址,连接跟踪器中数据包的状态也不正确。

相关内容