用於阻止特定資料包的 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_struct了解更多)。

如果您在流中間過濾掉資料包,內核將簡單地讓另一端知道資料包遺失,而另一端將繼續重新傳輸它(您已經看到了這種行為,請注意[TCP Retransmission]上面的標記)。如果您繼續阻止這些重新傳輸,流將變得不同步,連接將被斷開,並且流中的任何內容都不會被處理。

您必須在應用程式層執行此操作。

編輯我們兩人之間的評論交換(其中大部分已被刪除)明確表明,該問題可能未包含應有的所有詳細資訊。我建議您關閉這個問題 - 要么接受我的答案,要么刪除整個問題 - 並寫一個新問題,在其中詳細說明現在到底發生了什麼,它是如何發生的以及您想要實現的目標。

我現在能充滿信心地說的是您不能使用iptables從 TCP 流中間截取單一資料包並期望接收應用程式正確處理該流的其餘部分

相關內容