Linux
用於阻止特定數據包的 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
我的問題是,如何修改規則以允許需要的數據包並阻止不需要的數據包。
您不能在防火牆層執行此操作(好吧,您可以 - 但它不會完成您認為它會完成的事情,也不會完成您想要的事情)。第二個數據包(您想要的)與第一個數據包(您不想要)是同一 TCP 流的一部分,並且 TCP 是一種可靠的傳遞機制。這意味著作業系統知道流中間的數據包是否失去(根據每個數據包標頭中的序列號,請參見http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure更多資訊)。
如果您在流的中間過濾掉一個數據包,核心將簡單地讓另一端知道一個封包遺失,而另一端將繼續重新傳輸它(您已經看到了這種行為,請注意
[TCP Retransmission]
上面的標記)。如果您繼續阻止這些重新傳輸,則流將變得不同步,連接將被丟棄,並且流中的任何內容都不會得到處理。您必須在應用程序層執行此操作。
編輯我們兩人之間的評論交流(其中大部分已被刪除)清楚地表明問題可能不包含它應該包含的所有細節。我建議你關閉這個問題——要麼接受我的回答,要麼刪除整個問題——然後寫一個新的問題,在其中相當詳細地列出現在到底發生了什麼,它是如何發生的,以及你想要實現什麼。
我現在可以肯定地說,您不能使用
iptables
從 TCP 流中間切出單個數據包並期望接收應用程序正確處理該流的其餘部分。