Security

iptables 如何辨識數據包狀態?

  • May 27, 2020

考慮這兩組規則:

A組

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT
-A OUTPUT -j ACCEPT

B組

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT
-A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT

以前我的印像是兩者在功能上是相同的,但是最近有人對我說:

要擁有ESTABLISHED,RELATED連接,您必須有一個規則將連接添加到該規則查看的數據庫中。這是通過NEW規則完成的。一旦連接被接受,它就會被放入數據庫中,因此ESTABLISHED,RELATED規則可以與之匹配。如果沒有NEW規則,數據庫中不會包含任何內容,因此ESTABLISHED,RELATED將永遠​​不會匹配任何內容。

所以我承認我對內部如何iptables操作有點困惑,究竟如何iptables根據數據包狀態標記數據包?

[不幸的是,由於 的消失,我不得不從下面刪除引用,iptables.info因此您可能不得不在幾點上相信我。]

如果沒有 NEW 規則,數據庫中不會包含任何內容,因此 ESTABLISHED,RELATED 將永遠​​不會匹配任何內容。

這是錯誤的。

有五種使用者態狀態(核心空間中更多),雖然 ESTABLISHED 或 RELATED 連接在邏輯上確實需要以 NEW 數據包開始,但您不需要任何顯式的 NEW 規則來生成這樣的連接(您確實需要顯式ACCEPT隱含地包含 NEW 數據包)。按照邏輯,先考慮其他四種狀態,例如:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state INVALID -j REJECT --reject-with icmp-net-prohibited
-A INPUT -m state --state INVALID -j REJECT --reject-with icmp-net-prohibited

我省略了 NOTRACK,因為它只能因為以前的iptables規則而存在。猜猜這些規則應用後還剩下什麼?只有新數據包。您現在可以根據需要對它們進行排序。我保證,它會起作用,並註意:根本沒有新規則。沒有任何。

iptables 究竟是如何根據數據包狀態標記數據包的?

發送回復後建立連接。協議的性質顯然在這裡發揮了作用(核心也應用了這些規則);例如,當一個新的 SYN TCP 數據包被接受時,會發送一個 SYN/ACK 作為回复,並且連接已建立;在最終的 FIN/ACK 之後,它就失效了。

一個連接如何被認為是相關的顯然進一步取決於所涉及的協議;基本上它涉及到/來自已經建立連接的主機的連接。請注意,有時您必須載入特殊模組(例如,用於 ftp)才能使其工作。

引用自:https://unix.stackexchange.com/questions/116080