前書き
https://www.digitalocean.com/community/tutorials/what-is-a-firewall-and-how-does-it-work [ファイアウォール]は、サーバーとインフラストラクチャを保護するために構成できる重要なツールです。 Linuxエコシステムでは、「+ iptables 」は、カーネルの「 netfilter +」パケットフィルタリングフレームワークと連動する、広く使用されているファイアウォールツールです。 これらのシステムのアーキテクチャを理解していないユーザーや管理者にとって、信頼性の高いファイアウォールポリシーの作成は、構文が難しいだけでなく、フレームワークに存在する相互に関連する部分が多いため、困難な場合があります。
このガイドでは、独自のファイアウォールポリシーを構築する必要があるユーザーにとってよりわかりやすいものにすることを目的として、 `+ iptables `アーキテクチャに飛び込みます。 ` iptables `が ` netfilter +`とどのように相互作用し、さまざまなコンポーネントがどのように適合して包括的なフィルタリングおよびマングリングシステムを提供するかについて説明します。
IPTablesとNetfilterとは何ですか?
Linuxで最も一般的に使用される基本的なファイアウォールソフトウェアは、「+ iptables 」と呼ばれます。 ` 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テーブルとチェーン
`+ 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 +`が提供するさまざまなテーブルを見てみましょう。 これらは、パケットを評価するための、関心領域ごとに整理された個別のルールセットを表します。
フィルターテーブル
フィルターテーブルは、 `+ 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 +`操作(ソースアドレスを変更するもの)に分割されて表示されます。より明確に注文する。 また、ルーティングの決定が行われ、接続追跡が有効になっているポイントを表す行を含めて、発生しているプロセスのより全体的なビューを提供します。
Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) |
✓ |
||||
raw |
✓ |
✓ |
|||
(connection tracking enabled) |
✓ |
✓ |
|||
mangle |
✓ |
✓ |
✓ |
✓ |
✓ |
nat (DNAT) |
✓ |
✓ |
|||
(routing decision) |
✓ |
✓ |
|||
filter |
✓ |
✓ |
✓ |
||
security |
✓ |
✓ |
✓ |
||
nat (SNAT) |
✓ |
✓ |
パケットが `+ netfilter +`フックをトリガーすると、関連するチェーンが上から下の表にリストされているように処理されます。 パケットがトリガーするフック(列)は、着信パケットであるか発信パケットであるか、行われるルーティングの決定、およびパケットがフィルター基準を通過するかどうかによって異なります。
特定のイベントにより、処理中にテーブルのチェーンがスキップされます。 たとえば、接続の最初のパケットのみがNATルールに対して評価されます。 最初のパケットに対して行われた「+ nat +」の決定は、追加の評価なしで接続内の後続のすべてのパケットに適用されます。 NATされた接続に対する応答には、正しくルーティングするために逆NATルールが自動的に適用されます。
チェーン走査順序
サーバーがパケットのルーティング方法を知っていて、ファイアウォールルールがその送信を許可していると仮定すると、次のフローはさまざまな状況で通過するパスを表します。
-
ローカルシステム宛ての着信パケット:
+ PREROUTING
→` + INPUT` -
別のホスト宛の着信パケット:
+ PREROUTING +
→+ FORWARD +
→+ POSTROUTING +
-
ローカルで生成されたパケット:
+ OUTPUT +
→+ POSTROUTING +
上記の情報を前の表に記載されている順序と組み合わせると、ローカルシステム宛ての着信パケットが、最初に + raw +
、 `+ mangle `の ` PREROUTING `チェーンに対して評価されることがわかります。 、および ` 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 +」ポリシーを選択する方法について詳しく知りたい場合は、https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to-をチェックしてくださいサーバーを保護する[このガイド]。
これらのガイドは、 `+ iptables +`ファイアウォールルールの実装を開始するのに役立ちます。