我正在尝试在应用层编写蠕虫过滤实用程序。
我已经设置了以下规则来丢弃带有特定子字符串的 tcp 数据包。
iptables -A INPUT -p tcp -m string --string "test" -j DROP --algo kmp
但是,一旦找到具有匹配字符串的数据包,所有后续数据包,即使字符串不匹配也会被丢弃,直到我从 iptable 刷新规则。
我想知道为什么会发生这种情况以及解决方案是什么。
谢谢
我正在尝试在应用层编写蠕虫过滤实用程序。
我已经设置了以下规则来丢弃带有特定子字符串的 tcp 数据包。
iptables -A INPUT -p tcp -m string --string "test" -j DROP --algo kmp
但是,一旦找到具有匹配字符串的数据包,所有后续数据包,即使字符串不匹配也会被丢弃,直到我从 iptable 刷新规则。
我想知道为什么会发生这种情况以及解决方案是什么。
谢谢
tcp 是面向连接的可靠协议,它维护正在发送的数据序列。它会一直尝试更改特定的有效负载,直到它到达那里,因此在到达旧的有效负载之前您无法发送其他后续有效负载,这就是为什么您觉得所有后续数据包都被丢弃的原因。
如果您为 udp 设置了类似的规则,这将不会发生,您将能够接收所有与字符串不匹配的后续数据包。这是因为 udp 是一种无连接、不可靠的协议。
这里有点晚了,但看到有类似问题的人。避免这种情况的一种方法是在 RAW 链中执行此规则。在任何类型的 conntrack 放置在数据包上之前,所有数据包都会到达这里,因此最好在此处进行过滤。
iptables -A PREROUTING -t raw -p tcp -m string --string "test" -j DROP --algo kmp