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

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

我使用以下 iptables 规则:

iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH,ACK -m length --length 52 -m state --state ESTABLISHED -j DROP

它确实阻止了来自我的服务器的不需要的数据包,但它也阻止了不应该阻止的东西。

以下是使用 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

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

答案1

您无法在防火墙层执行此操作(好吧,您可以 - 但它不会实现您的想法,也不会实现您想要的目标)。第二个数据包(您想要的)与第一个数据包(您不想要的)属于同一个 TCP 流,并且 TCP 是一种可靠的传送机制。这意味着操作系统知道流中间的数据包是否丢失(根据每个数据包标头中的序列号,参见例如http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure了解更多信息)。

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

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

编辑我们两人之间的评论交流(其中大部分已被删除)清楚地表明,这个问题可能没有包含它应该包含的所有细节。我建议你关闭这个问题 - 要么接受我的答案,要么删除整个问题 - 然后写一个新的问题,在其中详细阐述现在到底发生了什么、它是如何发生的以及你想要实现什么。

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

相关内容