iptables/nat/prerouting 忽略 UDP 数据包?

iptables/nat/prerouting 忽略 UDP 数据包?

对具有各种内核版本的许多服务器来说,效果相同。

有多个 Iptables DNAT 规则:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 12345 -j DNAT --to-destination 10.20.30.40:5678
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23456 -j DNAT --to-destination 10.11.12.13:5789
....
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 34567 -j LOG --log-prefix 'natudp: '
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 34567 -j DNAT --to-destination 10.55.66.77:34567

问题:UDP 规则不适用于来自 eth0 的传入请求。
它们的数据包和字节计数器值为零。
简化(删除 dport)无效。
因此,请求被传递到过滤器/INPUT 链而不是 FORWARD。

来自虚拟接口(tap、veth)的数据包不存在这样的问题 - 它们被预路由规则捕获。TCP
不存在这样的问题。UDP
不存在这样的问题答案
但是来自 eth0 的传入 UDP 请求完全被预路由规则忽略:

# iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 3 packets, 174 bytes)
 pkts bytes target   prot opt in     out   source        destination         

(testing rules)
    2   126 LOG      udp  --  *      *     0.0.0.0/0     0.0.0.0/0      LOG flags 0 level 4 prefix "prerouting-udp: "
    0     0          udp  --  *      *     1.2.3.4       0.0.0.0/0               
    0     0          udp  --  *      *     1.2.3.4       0.0.0.0/0      udp dpt:25826
    0     0          udp  --  eth0   *     0.0.0.0/0     0.0.0.0/0      udp dpt:25826
    0     0          udp  --  eth0   *     1.2.3.4       0.0.0.0/0           
    0     0          udp  --  eth0   *     1.2.3.4       0.0.0.0/0      udp dpt:25826

(production rules)
    7   412 DNAT     tcp  --  eth0   *     0.0.0.0/0     0.0.0.0/0      tcp dpt:12345 to:10.20.30.40:8080
   63  3804 DNAT     tcp  --  eth0   *     0.0.0.0/0     0.0.0.0/0      tcp dpt:56789 to:10.30.40.50:8000
    0     0 DNAT     udp  --  eth0   *     1.2.3.4       0.0.0.0/0      udp dpt:25826 to:10.40.50.60:25826

有任何想法吗?

答案1

这里也是一样。最后要检查的是 conntrack 表。就我而言,重置跟踪的连接可使规则立即生效。

apt install conntrack -y
# see current UDP connection
conntrack -L -p udp --dport 34567
# in OP's case purge tracking entries per rule U:dport=34567
conntrack -D -p udp --dport 34567
# if not care
# conntrack -D -p udp

或者,如果正常运行时间对于设备来说并不重要,只需重新启动,这是另一种方法conntrack -D

相关内容