用于活动UDP连接的iptables端口转发

我正在尝试使用以下命令设置port 12345port 54321 UDP端口转发

 iptables -t nat -A PREROUTING -p udp -i eth0 -d 192.168.0.1 --dport 12345 -j DNAT --to 192.168.0.1:54321 iptables -A FORWARD -p udp -i eth0 -d 192.168.0.1 --dport 54321 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 

这适用于新的连接,但是,它不适用于当前活动的连接。

为了说明我的意思,假设在添加规则之前,存在来自192.168.0.2:55555 <—> 192.168.0.1:12345的活动连接,并且我试图redirect192.168.0.1:12345上的所有传入连接192.168.0.1:12345192.168.0.1:54321

添加上述两条规则之后, 192.168.0.1:12345所有其他报文都将从192.168.0.2:55555接收,但192.168.0.1:12345报文除外。

我猜这个连接的状态起了一个作用。 我怎样才能解决这个问题,并从192.168.0.1:55555到目的地port 12345得到传递到port 54321 port 12345的数据包?

我想出了如何做到这一点!

你需要在NAT上使用REDIRECT! 但在此之前,您必须从conntrack中删除与此连接相对应的条目! 像下面这样

 conntrack -D -p udp -d 192.168.0.1 --dport=55555