2009-05-06 74 views
0

我正在尝试在应用程序层上编写蠕虫过滤实用程序。使用iptables删除匹配字符串的数据包将丢失所有后续数据包,但不匹配

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

的iptables -A INPUT -p tcp的-m串--string “测试” -j DROP --algo KMP

但是,一旦有匹配的字符串的数据包被发现所有的后续数据包,即使删除不匹配的字符串,直到我从iptable中清除规则。

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

谢谢

+1

我thik那在serverfault.com上,这将被视为一个很好的问题。 – innaM 2009-05-06 12:00:33

回答

2

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

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

0

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

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