web-dev-qa-db-ja.com

iptablesはパケットの状態をどのように認識しますか?

次の2つのルールセットを検討してください。

セット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

以前は、2つは機能的に同じであるという印象を受けていましたが、最近誰かが私に次のように述べました。

ESTABLISHED、RELATED接続を確立するには、このルールが参照するデータベースに接続を追加するルールが必要です。これは[〜#〜] new [〜#〜]ルールで行われます。接続が受け入れられると、それはデータベースに配置されるため、ESTABLISHED、RELATEDルールがそれに一致します。 [〜#〜] new [〜#〜]ルールがないと、dbには何も組み込まれないため、ESTABLISHED、RELATEDは何にも一致しません。

だから私はiptablesの内部がどのように動作するかについて少し混乱していることを認めます、正確にはiptablesはパケットの状態に基づいてパケットにタグを付ける方法についてどうですか?

4
AlexH

新しいルールがないと、データベースに何も組み込まれず、したがってESTABLISHED、RELATEDは何にも一致しません。

これは誤りです。

5つのユーザーランド状態 (カーネルスペースにもっとあります)があり、ESTABLISHEDまたはRELATED接続は論理的にNEWパケットで開始する必要がありますが、そのようなを生成するために明示的なNEWルールは必要ありません。接続(ただし、暗黙的に新しいパケットを含む明示的なACCEPTが必要です)。ロジックに従い、最初に他の4つの状態を検討します。例:

-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

以前のiptablesルールのためにのみ存在できるため、NOTRACKを省略しました。これらのルールが適用された後に何が残っていると思いますか? NEWパケットのみ。これで、それらを好きなように並べ替えることができます。それは機能するでしょう、私は約束します、そして注意してください:新しいルールはまったくありません。無し。

正確には、iptablesはパケットの状態に基づいてパケットにタグを付ける方法を教えてください。

前の参照 によると、応答が送信されると接続が確立されます。プロトコルの性質は明らかにここで少し関係しています(カーネルもそれらのルールを適用します)。例えば新しいSYN TCPパケットが受け入れられると、SYN/ACKが応答で送信され、接続が確立されます。最後のFIN/ACKに続いて無効になります。

接続が関連していると見なされる方法は、明らかに関連するプロトコルにさらに依存します。基本的には、すでにESTABLISHED接続されているホストとの間の接続に関連しています。これを機能させるには、特別なモジュール(ftpなど)をロードする必要がある場合があることに注意してください。

6
goldilocks