Iptables 预路由规则不匹配

Iptables 预路由规则不匹配

我想将一个接口 (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

相关内容