我想将一个接口 (ens1) 上收到的所有发往端口 1511 的 UDP 数据包转发到 IP 为 172.17.0.6 的另一台机器(它实际上是一个 docker 容器,但应该没什么区别)。我写了这组简单的 iptables 规则(仅作为示例):
#!/bin/bash
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
modprobe ip_tables
iptables -t nat -A PREROUTING -i ens1 -p udp --dport 1511 -j DNAT --to-destination 172.17.0.6:1511
iptables -A FORWARD -p udp --dport 1511 -j ACCEPT
#iptables -A INPUT -i ens1 -p udp --dport 1511 -j DROP
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
我的问题是数据包不符合 PREROUTING 规则,因此被传送到本地主机。我确信 UDP 端口是正确的,因为我在两台机器上运行相同的应用程序,并且本地主机上的应用程序定期在端口 UDP 1511 上接收数据包(作为证明,取消注释倒数第三条规则,本地应用程序停止接收数据)。我的脚本有什么问题?谢谢。
答案1
这更像是一种黑客攻击而不是解决方案,但以下方法对我有用:
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout=0
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=0
基本上,它强制任何 UDP 数据包作为新连接的第一个数据包出现,以解决 NAT 行为,也由用户2233709