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)
这是由于 iptables 在PREROUTING
链上应用连接跟踪造成的。每当建立新连接时,iptables 都会查阅 conntrack 缓存。如果找到匹配项,则不会应用 nat 表中的任何规则。
如果您想禁用更改此行为,请查看NOTRACK
原始表中的目标。
请注意,这甚至适用于 UDP(这是一种无连接协议)。第一个数据包被视为打开连接NEW
,另一个数据包被视为回复ESTABLISHED
。
我在serverfault上找到了相关帖子。
nat 表规则始终仅适用于连接中的第一个数据包。同一连接的后续数据包永远不会遍历 nat 规则列表,仅由 conntrack 代码支持
由于 UDP 本质上是无连接的,因此这里的“连接”仅由地址、端口和超时定义。因此,如果具有相同源端口和地址以及相同目标端口和地址的第二个 UDP 数据包在超时时间内到达,Linux 会认为它属于已建立的“连接”,并且根本不会为其评估 nat 规则表,而是重复使用先前发布的判决包。
请参阅此处:http ://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html
归档时间: |
|
查看次数: |
5551 次 |
最近记录: |