使用iptables删除具有匹配字符串的数据包会丢弃所有后续数据包,但不匹配

时间:2009-05-06 09:52:26

标签: linux-kernel iptables

我正在尝试在应用层上编写蠕虫过滤实用程序。

我已经设置了以下规则来删除具有特定子字符串的tcp数据包。

iptables -A INPUT -p tcp -m string --string“test”-j DROP --algo kmp

然而,一旦找到具有匹配字符串的数据包,所有后续数据包,即使是非匹配字符串也会被删除,直到我从iptable清除该规则。

我想知道为什么会发生这种情况以及解决方案是什么。

感谢

2 个答案:

答案 0 :(得分:2)

tcp是面向连接的可靠协议,它保持发送的数据序列。它一直试图改变特定的有效载荷,直到它到达那里,所以你不能发送其他后续的有效载荷,直到到达旧的有效载荷,这就是你觉得所有后续数据包都被丢弃的原因。

如果为udp设置类似的规则,则不会发生这种情况,您将能够接收与该字符串不匹配的所有后续数据包。这是因为udp是一种无连接,不可靠的协议。

答案 1 :(得分:0)

这里有点晚了,但看到有类似问题的人。避免这种情况的一种方法是在RAW链中执行此规则。在将任何类型的conntrack置于数据包之前,所有数据包都将在此处命中,因此最好在此处进行过滤。

iptables -A PREROUTING -t raw -p tcp -m string --string "test" -j DROP --algo kmp