我希望将所有在一个接口(ens1)上收到的发往端口1511的UDP数据包转发到不同的机器(实际上是一个docker容器,但不应该有任何区别),IP地址为172.17.0.6。 我写了这套简单的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接收数据包(作为certificate,从本地应用程序的底部取消注释第三条规则数据)。 我的脚本有什么问题? 谢谢。
这是比解决scheme更黑客,但下面的工作对我来说:
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout=0 sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=0
基本上,它强制任何UDP数据包作为新连接的第一个出现,以解决由user2233709描述的NAT行为