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