用于阻止特定数据包的 iptables 规则

-3 linux firewall iptables blocking packet

我使用以下 iptables 规则:

iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH,ACK -m length --length 52 -m state --state ESTABLISHED -j DROP
Run Code Online (Sandbox Code Playgroud)

它可以阻止来自我的服务器的不需要的数据包,但它也会阻止不应该发生的事情。

以下是用wireshark捕获的数据包:

unwanted packet:source=192.168.0.100    destination=192.168.0.111   TCP lenght=66   [TCP Retransmission] 62401?38111 [PSH, ACK] Seq=15 Ack=19 Win=65536 Len=12

needed packet:source=192.168.0.100  destination=192.168.0.111   TCP lenght=66   [TCP Retransmission] 62433?38111 [PSH, ACK] Seq=344 Ack=37855 Win=62825 Len=12
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何修改规则以允许所需的数据包并阻止不需要的数据包。

Mad*_*ter 5

您不能在防火墙层执行此操作(好吧,您可以 - 但它不会实现您的想法,也不会实现您想要的)。第二个数据包(您想要的)是与第一个数据包(您不想要的)相同的 TCP 流的一部分,并且 TCP 是一种可靠的传输机制。这意味着,在OS知道,如果在流中间的分组中的每个分组的报头不见了(由于序列号的,参见例如http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure为更多信息)。

如果您过滤掉流中间的数据包,内核将简单地让另一端知道数据包丢失,而另一端将继续重新传输它(您已经看到了哪种行为,请注意[TCP Retransmission]上面的标记)。如果您继续阻止这些重传,流将变得不同步,连接将被丢弃,流中的任何内容都不会得到处理。

您必须在应用程序层执行此操作。

编辑我们两人之间的评论交流(其中大部分已被删除)已明确表示该问题可能不包含应有的所有详细信息。我建议您关闭这个问题 - 要么接受我的回答,要么删除整个问题 - 并写一个新问题,在其中详细说明现在究竟发生了什么,它是如何发生的,以及您想要实现的目标。

我现在可以自信地说,您不能使用iptables从 TCP 流的中间切出单个数据包,并期望接收应用程序正确处理该流的其余部分