iptables REDIRECT 仅适用于第一个数据包

Mir*_*chi 4 linux firewall iptables

如果数据包包含例如字符串,我需要将目标端口 15000 的所有 UDP 数据包重定向到端口 15001 test。我有这两个简单的规则:

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 15000 -m string --string 'test' --algo bm -j LOG --log-prefix='[netfilter] '
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 15000 -m string --string 'test' --algo bm -j REDIRECT --to-ports 15001
Run Code Online (Sandbox Code Playgroud)

奇怪的行为:

  • 如果第一个数据包包含字符串,则对连接的所有test数据包进行重定向 ;
  • 如果连接的第一个数据包不包含test,则即使后续数据包包含 ,也永远不会进行重定向test

但是,所有匹配规则的数据包都会被正确记录。

我尝试将曲目信息添加到规则中:

-m state --state NEW,ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

但行为是一样的。一些想法?

这是完整的iptables规则集:

过滤表:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
Run Code Online (Sandbox Code Playgroud)

NAT表:

Chain PREROUTING (policy ACCEPT)
 target     prot opt source               destination         
 LOG        udp  --  anywhere             anywhere             udp dpt:15000 STRING match  "test" ALGO name bm TO 65535 LOG level warning prefix "[netfilter] "
 REDIRECT   udp  --  anywhere             anywhere             udp dpt:15000 STRING match  "test" ALGO name bm TO 65535 redir ports 15001

 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination         

 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination         

 Chain POSTROUTING (policy ACCEPT)
Run Code Online (Sandbox Code Playgroud)

粉碎表:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination  
Run Code Online (Sandbox Code Playgroud)

原始表:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Run Code Online (Sandbox Code Playgroud)

Kha*_*led 5

这是由于 iptables 在PREROUTING链上应用连接跟踪造成的。每当建立新连接时,iptables 都会查阅 conntrack 缓存。如果找到匹配项,则不会应用 nat 表中的任何规则。

如果您想禁用更改此行为,请查看NOTRACK原始表中的目标。

请注意,这甚至适用于 UDP(这是一种无连接协议)。第一个数据包被视为打开连接NEW,另一个数据包被视为回复ESTABLISHED

我在serverfault上找到了相关帖子。


Nik*_*nov 5

nat 表规则始终仅适用于连接中的第一个数据包。同一连接的后续数据包永远不会遍历 nat 规则列表,仅由 conntrack 代码支持

由于 UDP 本质上是无连接的,因此这里的“连接”仅由地址、端口和超时定义。因此,如果具有相同源端口和地址以及相同目标端口和地址的第二个 UDP 数据包在超时时间内到达,Linux 会认为它属于已建立的“连接”,并且根本不会为其评估 nat 规则表,而是重复使用先前发布的判决包。

请参阅此处:http ://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html