IptablesとNetfilterアーキテクチャの詳細
序章
ファイアウォールは、サーバーとインフラストラクチャを保護するために構成できる重要なツールです。 Linuxエコシステムでは、iptables
は、カーネルのnetfilter
パケットフィルタリングフレームワークとインターフェイスする広く使用されているファイアウォールツールです。 これらのシステムのアーキテクチャを理解していないユーザーや管理者にとって、信頼性の高いファイアウォールポリシーを作成することは、構文が難しいだけでなく、フレームワークに相互に関連する部分が多数あるために困難な場合があります。
このガイドでは、独自のファイアウォールポリシーを構築する必要があるユーザーが理解しやすいようにすることを目的として、iptables
アーキテクチャについて詳しく説明します。 iptables
がnetfilter
とどのように相互作用するか、およびさまざまなコンポーネントがどのように組み合わされて包括的なフィルタリングおよびマングリングシステムを提供するかについて説明します。
IPTablesとNetfilterとは何ですか?
Linuxで最も一般的に使用される基本的なファイアウォールソフトウェアはiptables
と呼ばれます。 iptables
ファイアウォールは、Linuxカーネルのネットワークスタック内のパケットフィルタリングフックと相互作用することによって機能します。 これらのカーネルフックは、netfilter
フレームワークとして知られています。
ネットワーキングシステム(着信または発信)に入るすべてのパケットは、スタックを進むときにこれらのフックをトリガーし、これらのフックに登録するプログラムがキーポイントでトラフィックと対話できるようにします。 iptables
に関連付けられたカーネルモジュールは、トラフィックがファイアウォールルールによって定められた条件に準拠していることを確認するために、これらのフックに登録されます。
Netfilterフック
プログラムが登録できるnetfilter
フックは5つあります。 パケットがスタックを通過すると、これらのフックに登録されているカーネルモジュールがトリガーされます。 パケットがトリガーするフックは、パケットが着信か発信か、パケットの宛先、およびパケットが前のポイントでドロップされたか拒否されたかによって異なります。
次のフックは、ネットワークスタック内の明確に定義されたさまざまなポイントを表します。
NF_IP_PRE_ROUTING
:このフックは、ネットワークスタックに入った直後に着信トラフィックによってトリガーされます。 このフックは、パケットの送信先に関するルーティングの決定が行われる前に処理されます。NF_IP_LOCAL_IN
:このフックは、パケットがローカルシステム宛てである場合、着信パケットがルーティングされた後にトリガーされます。NF_IP_FORWARD
:このフックは、パケットが別のホストに転送される場合、着信パケットがルーティングされた後にトリガーされます。NF_IP_LOCAL_OUT
:このフックは、ネットワークスタックに到達するとすぐに、ローカルで作成されたアウトバウンドトラフィックによってトリガーされます。NF_IP_POST_ROUTING
:このフックは、ルーティングが行われた後、ネットワークに接続される直前に、発信または転送されたトラフィックによってトリガーされます。
これらのフックに登録するカーネルモジュールは、フックがトリガーされたときに呼び出される順序を決定するのに役立つ優先順位番号を提供する必要があります。 これにより、複数のモジュール(または同じモジュールの複数のインスタンス)を決定論的な順序で各フックに接続する手段が提供されます。 各モジュールは順番に呼び出され、処理後にnetfilter
フレームワークに、パケットで何をすべきかを示す決定を返します。
IPTablesテーブルとチェーン
iptables
ファイアウォールは、テーブルを使用してルールを整理します。 これらのテーブルは、ルールを使用する決定のタイプに従ってルールを分類します。 たとえば、ルールがネットワークアドレス変換を処理する場合、そのルールはnat
テーブルに配置されます。 ルールを使用してパケットの宛先への続行を許可するかどうかを決定する場合、おそらくfilter
テーブルに追加されます。
各iptables
テーブル内で、ルールはさらに個別の「チェーン」内に編成されます。 テーブルは、保持するルールの一般的な目的によって定義されますが、組み込みのチェーンは、テーブルをトリガーするnetfilter
フックを表します。 チェーンは基本的に、いつルールが評価されるかを決定します。
ご覧のとおり、組み込みチェーンの名前は、関連付けられているnetfilter
フックの名前を反映しています。
PREROUTING
:NF_IP_PRE_ROUTING
フックによってトリガーされます。INPUT
:NF_IP_LOCAL_IN
フックによってトリガーされます。FORWARD
:NF_IP_FORWARD
フックによってトリガーされます。OUTPUT
:NF_IP_LOCAL_OUT
フックによってトリガーされます。POSTROUTING
:NF_IP_POST_ROUTING
フックによってトリガーされます。
チェーンを使用すると、管理者はパケットの配信パスのどこでルールを評価するかを制御できます。 各テーブルには複数のチェーンがあるため、テーブルの影響は処理の複数のポイントで発揮される可能性があります。 特定の種類の決定はネットワークスタックの特定のポイントでのみ意味があるため、すべてのテーブルに各カーネルフックにチェーンが登録されているわけではありません。
netfilter
カーネルフックは5つしかないため、複数のテーブルのチェーンが各フックに登録されます。 たとえば、3つのテーブルにはPREROUTING
チェーンがあります。 これらのチェーンが関連するNF_IP_PRE_ROUTING
フックに登録されると、各テーブルのPREROUTING
チェーンが呼び出される順序を指定する優先度が指定されます。 最も優先度の高いPREROUTING
チェーン内の各ルールは、次のPREROUTING
チェーンに移動する前に順番に評価されます。 各チェーンの具体的な順序については、後ほど説明します。
どのテーブルが利用できますか?
少し戻って、iptables
が提供するさまざまなテーブルを見てみましょう。 これらは、パケットを評価するための、関心のある領域ごとに編成された一連の別個のルールを表します。
フィルタテーブル
フィルタテーブルは、iptables
で最も広く使用されているテーブルの1つです。 filter
テーブルは、パケットを目的の宛先に続行させるか、要求を拒否するかを決定するために使用されます。 ファイアウォールの用語では、これは「フィルタリング」パケットとして知られています。 この表は、ファイアウォールについて議論するときに人々が考える機能の大部分を提供します。
NATテーブル
nat
テーブルは、ネットワークアドレス変換ルールを実装するために使用されます。 パケットがネットワークスタックに入ると、このテーブルのルールによって、パケットと応答トラフィックのルーティング方法に影響を与えるために、パケットの送信元アドレスまたは宛先アドレスを変更するかどうか、および変更する方法が決定されます。 これは、直接アクセスが不可能な場合にパケットをネットワークにルーティングするためによく使用されます。
マングルテーブル
mangle
テーブルは、さまざまな方法でパケットのIPヘッダーを変更するために使用されます。 たとえば、パケットのTTL(Time to Live)値を調整して、パケットが維持できる有効なネットワークホップの数を長くしたり短くしたりできます。 他のIPヘッダーも同様の方法で変更できます。
このテーブルは、他のテーブルや他のネットワーキングツールでさらに処理するために、パケットに内部カーネル「マーク」を配置することもできます。 このマークは実際のパケットには触れませんが、カーネルのパケット表現にマークを追加します。
生のテーブル
iptables
ファイアウォールはステートフルです。つまり、パケットは前のパケットとの関係に関して評価されます。 netfilter
フレームワーク上に構築された接続追跡機能により、iptables
は、個別の無関係なパケットのストリームとしてではなく、進行中の接続またはセッションの一部としてパケットを表示できます。 接続追跡ロジックは通常、パケットがネットワークインターフェイスに到達した直後に適用されます。
raw
テーブルには、非常に狭く定義された関数があります。 その唯一の目的は、接続追跡をオプトアウトするためにパケットをマーキングするためのメカニズムを提供することです。
セキュリティテーブル
security
テーブルは、パケットに内部SELinuxセキュリティコンテキストマークを設定するために使用されます。これは、SELinuxまたはSELinuxセキュリティコンテキストを解釈できる他のシステムがパケットを処理する方法に影響します。 これらのマークは、パケットごとまたは接続ごとに適用できます。
各テーブルに実装されているチェーンはどれですか?
テーブルとチェーンについては別々に話しました。 各テーブルで使用可能なチェーンを確認してみましょう。 この議論には、同じフックに登録されたチェーンの評価順序に関するさらなる議論が含まれています。 3つのテーブルにPREROUTING
チェーンがある場合、それらはどの順序で評価されますか?
次の表は、左から右に読み取ったときに各iptables
テーブル内で使用できるチェーンを示しています。 たとえば、raw
テーブルにはPREROUTING
チェーンとOUTPUT
チェーンの両方があることがわかります。 上から下に読み取ると、関連するnetfilter
フックがトリガーされたときに各チェーンが呼び出される順序も表示されます。
いくつか注意する必要があります。 以下の表現では、nat
テーブルは、DNAT
操作(パケットの宛先アドレスを変更する操作)とSNAT
操作(送信元アドレスを変更する操作)に分割されています。 )順序をより明確に表示するため。 また、ルーティングの決定が行われ、接続の追跡が有効になっているポイントを表す行も含まれています。これにより、発生しているプロセスの全体像を把握できます。
テーブル↓/チェーン→ | 事前ルーティング | 入力 | 前方 | 出力 | ポストルーティング |
---|---|---|---|---|---|
(ルーティング決定) | ✓ | ||||
生 | ✓ | ✓ | |||
(接続追跡が有効) | ✓ | ✓ | |||
マングル | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(ルーティング決定) | ✓ | ✓ | |||
フィルター | ✓ | ✓ | ✓ | ||
安全 | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
パケットがnetfilter
フックをトリガーすると、関連するチェーンは、上の表に上から下にリストされているとおりに処理されます。 パケットがトリガーするフック(列)は、パケットが着信パケットか発信パケットか、行われるルーティング決定、およびパケットがフィルタリング基準に合格するかどうかによって異なります。
特定のイベントにより、処理中にテーブルのチェーンがスキップされます。 たとえば、接続の最初のパケットのみがNATルールに対して評価されます。 最初のパケットに対して行われたnat
の決定は、追加の評価なしで、接続内の後続のすべてのパケットに適用されます。 NAT接続への応答には、正しくルーティングするために逆NATルールが自動的に適用されます。
チェーントラバーサルオーダー
サーバーがパケットのルーティング方法を知っていて、ファイアウォールルールがその送信を許可していると仮定すると、次のフローは、さまざまな状況で通過するパスを表します。
- ローカルシステム宛ての着信パケット:
PREROUTING
->INPUT
- 別のホスト宛ての着信パケット:
PREROUTING
->FORWARD
->POSTROUTING
- ローカルで生成されたパケット:
OUTPUT
->POSTROUTING
上記の情報を前の表に示した順序と組み合わせると、ローカルシステム宛ての着信パケットが最初にraw
のPREROUTING
チェーンに対して評価されることがわかります。 mangle
、およびnat
テーブル。 次に、mangle
、filter
、security
、およびnat
テーブルのINPUT
チェーンをトラバースしてから最終的にローカルに配信されます。ソケット。
IPTablesルール
ルールは、特定のテーブルの特定のチェーン内に配置されます。 各チェーンが呼び出されると、問題のパケットがチェーン内の各ルールに対して順番にチェックされます。 各ルールには、一致するコンポーネントとアクションコンポーネントがあります。
マッチング
ルールの一致部分は、関連するアクション(または「ターゲット」)を実行するためにパケットが満たさなければならない基準を指定します。
マッチングシステムは非常に柔軟性があり、システムで利用可能なiptables
拡張機能を使用して大幅に拡張できます。 ルールは、プロトコルタイプ、宛先または送信元アドレス、宛先または送信元ポート、宛先または送信元ネットワーク、入力または出力インターフェイス、ヘッダー、または接続状態などの基準に一致するように構築できます。 これらを組み合わせて、さまざまなトラフィックを区別するためのかなり複雑なルールセットを作成できます。
ターゲット
ターゲットは、パケットがルールの一致基準を満たしたときにトリガーされるアクションです。 ターゲットは一般的に2つのカテゴリに分けられます。
- ターゲットの終了:ターゲットの終了は、チェーン内の評価を終了し、制御を
netfilter
フックに戻すアクションを実行します。 提供された戻り値に応じて、フックはパケットをドロップするか、パケットが処理の次の段階に進むことを許可する場合があります。 - 非終了ターゲット:非終了ターゲットはアクションを実行し、チェーン内で評価を続行します。 各チェーンは最終的に最終的な終了決定を返す必要がありますが、終了しないターゲットはいくつでも事前に実行できます。
ルール内の各ターゲットの可用性は、コンテキストによって異なります。 たとえば、テーブルとチェーンのタイプによって、使用可能なターゲットが決まる場合があります。 ルールでアクティブ化された拡張機能と一致する句も、ターゲットの可用性に影響を与える可能性があります。
ユーザー定義のチェーンにジャンプする
非終了ターゲットの特別なクラスであるジャンプターゲットについて言及する必要があります。 ジャンプターゲットは、追加の処理のために評価を別のチェーンに移動する結果となるアクションです。 それらを呼び出すnetfilter
フックに密接に結びついている組み込みチェーンについてはかなり話しました。 ただし、iptables
を使用すると、管理者は組織的な目的で独自のチェーンを作成することもできます。
ルールは、組み込みのチェーンに配置するのと同じ方法で、ユーザー定義のチェーンに配置できます。 違いは、ユーザー定義のチェーンには、ルールから「ジャンプ」することによってのみ到達できることです(netfilter
フック自体には登録されていません)。
ユーザー定義のチェーンは、それらを呼び出したチェーンの単純な拡張として機能します。 たとえば、ユーザー定義のチェーンでは、ルールリストの最後に到達した場合、またはRETURN
ターゲットが一致するルールによってアクティブ化された場合、評価は呼び出し元のチェーンに戻ります。 評価は、追加のユーザー定義チェーンにジャンプすることもできます。
この構成により、より強力な編成が可能になり、より堅牢な分岐に必要なフレームワークが提供されます。
IPTablesと接続の追跡
raw
テーブルと接続状態の一致基準について説明したときに、netfilter
フレームワークの上に実装された接続追跡システムを紹介しました。 接続追跡により、iptables
は、進行中の接続のコンテキストで表示されるパケットについて決定を下すことができます。 接続追跡システムは、iptables
に「ステートフル」操作を実行するために必要な機能を提供します。
接続追跡は、パケットがネットワークスタックに入った直後に適用されます。 raw
テーブルチェーンといくつかの基本的な健全性チェックは、パケットを接続に関連付ける前にパケットに対して実行される唯一のロジックです。
システムは、既存の接続のセットに対して各パケットをチェックします。 必要に応じてストア内の接続の状態を更新し、必要に応じてシステムに新しい接続を追加します。 raw
チェーンの1つでNOTRACK
ターゲットでマークされたパケットは、接続追跡ルーチンをバイパスします。
利用可能な状態
接続追跡システムによって追跡される接続は、次のいずれかの状態になります。
NEW
:既存の接続に関連付けられていないが、最初のパケットとして無効ではないパケットが到着すると、このラベルで新しい接続がシステムに追加されます。 これは、TCPなどのコネクションレス型プロトコルとUDPなどのコネクションレス型プロトコルの両方で発生します。ESTABLISHED
:反対方向に有効な応答を受信すると、接続がNEW
からESTABLISHED
に変更されます。 TCP接続の場合、これはSYN/ACK
を意味し、UDPおよびICMPトラフィックの場合、これは元のパケットの送信元と宛先が切り替えられる応答を意味します。RELATED
:既存の接続の一部ではないが、システムにすでに存在する接続に関連付けられているパケットには、RELATED
というラベルが付けられます。 これは、FTPデータ送信接続の場合のように、ヘルパー接続を意味する場合もあれば、他のプロトコルによる接続試行に対するICMP応答である場合もあります。INVALID
:パケットが既存の接続に関連付けられておらず、新しい接続を開くのに適していない場合、識別できない場合、またはルーティングできない場合は、パケットにINVALID
のマークを付けることができます。他の理由の中で。UNTRACKED
:追跡をバイパスするためにraw
テーブルチェーンでターゲットにされている場合、パケットはUNTRACKED
としてマークできます。SNAT
:送信元アドレスがNAT操作によって変更されたときに設定される仮想状態。 これは接続追跡システムによって使用され、応答パケットで送信元アドレスを元に戻すことを認識します。DNAT
:宛先アドレスがNAT操作によって変更されたときに設定される仮想状態。 これは接続追跡システムによって使用され、応答パケットをルーティングするときに宛先アドレスを元に戻すことを認識します。
接続追跡システムで追跡される状態により、管理者は接続の存続期間中の特定のポイントを対象とするルールを作成できます。 これにより、より徹底的で安全なルールに必要な機能が提供されます。
結論
netfilter
パケットフィルタリングフレームワークとiptables
ファイアウォールは、Linuxサーバー上のほとんどのファイアウォールソリューションの基盤です。 netfilter
カーネルフックは、ネットワークスタックに十分に近いため、システムで処理されるパケットを強力に制御できます。 iptables
ファイアウォールは、これらの機能を活用して、ポリシー要件をカーネルに伝達するための柔軟で拡張可能な方法を提供します。 これらの要素がどのように組み合わされるかを学習することで、サーバー環境を制御および保護するためにそれらをより有効に活用できます。
効果的なiptables
ポリシーの選択方法について詳しく知りたい場合は、このガイドをご覧ください。
これらのガイドは、iptables
ファイアウォールルールの実装を開始するのに役立ちます。