A ファイアウォールは、トラフィックをフィルタリングし、プライベートデータへの不要な/不正なアクセスをブロックすることでネットワークを保護するセキュリティデバイス(ハードウェア/ソフトウェア)です。適切なファイアウォールを導入することは、サーバーとインフラストラクチャを保護するために重要です。不要なトラフィックをブロックするだけでなく、悪意のあるソフトウェアがシステムに感染するのを防ぐこともできます。
Linuxのエコシステムにおいて、iptablesは、Linuxカーネル上のnetfilterフレームワークと連携する一般的なファイアウォールです。最新のLinuxシステムのほとんどには、これらのツールが事前に組み込まれています。これらのシステムを最大限に活用するには、そのアーキテクチャを理解することが極めて重要です。そうしないと、信頼性の高いファイアウォールポリシーを構築することが困難になる可能性があります。複雑な構文を作成することになったり、フレームワーク内で相互に関連する部品が発生したりする原因になります。
このガイドでは、のアーキテクチャを深く掘り下げ、 iptables 独自のファイアウォールポリシーを作成する必要があるユーザーを支援します。また、 iptables が netfilterとどのように連携し、さまざまなコンポーネントがどのように組み合わされているかについても探ります。
IptablesとNetfilter
Linuxでは、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(ネットワークアドレス変換)を処理する場合、そのルールは natテーブルに配置されます。同様に、ルールが宛先へのパケットの許可/拒否を決定する場合、そのルールは filter テーブルに追加されます。
Inside each table of iptablesの各テーブル内では、ルールはさらに個別の“チェイン”内に整理されます。テーブルが保持しているルールのタイプを表すのに対し、チェインは netfilter フックを表します。簡単に言えば、チェインはルールがいつ評価されるかを決定します。
以下は、 iptablesの組み込みチェインです。. 興味深いことに、チェーン名は関連する netfilter フックの名前も反映しています:
| チェーン (iptables) | 用途 |
| PREROUTING | NF_IP_PRE_ROUTING |
| INPUT | NF_IP_LOCAL_IN |
| FORWARD | NF_IP_FORWARD |
| OUTPUT | NF_IP_LOCAL_OUT |
| POSTROUTING | NF_IP_POST_ROUTING |
チェーンを使用することで、管理者はパケット配信のどの段階でルールを評価するかを決定できます。各テーブルには複数のチェーンが含まれているため、処理の複数のポイントでその影響を及ぼすこともできます。特定の決定は、ネットワークスタックの特定のポイントでのみ意味を持ちます。したがって、すべてのテーブルが各カーネルフックに登録されたチェーンを持つわけではありません。
The netfilter フレームワークは5つのカーネルフックのみを提供します。そのため、複数のテーブルからのチェーンがフックの各ポイントに登録されます。たとえば、3つのチェーンが PREROUTING チェーンを持っている場合、それらは NF_IP_PRE_ROUTING フックに登録されます。それぞれが、各テーブルの PREROUTING チェーンが呼び出される順序を決定する優先度を提供する必要があります。最も優先度の高い PREROUTING チェーンが最初に評価され、次に優先度の高いチェーンが2番目に評価され、以下同様に続きます。
iptables テーブル
一歩下がって、 iptables が提供するテーブルを見てみましょう。前述のように、各テーブルはパケット評価のために、関心のある領域ごとに整理された異なるルールセットを表します。
-
filter テーブル
In iptables において、 filter テーブルは最も一般的なものの1つです。これは、パケットが宛先への送信を継続することを許可されるかどうかを決定するために使用されます。ファイアウォールの用語では、このプロセスはパケットの“フィルタリング”として知られています。
人々がファイアウォールについて議論するときに(大部分は)言及するのは、 filter テーブルの機能のことです。
-
nat テーブル
このテーブルは、NATを規制するルールを実装します。パケットがネットワークスタックに入ると、このテーブルに記述されたルールがパケットの送信元/送信先アドレスをどのように変更するかを決定し、パケットのルーティングと応答トラフィックに影響を与えます。
多くの場合、 nat テーブルは、直接アクセスできないネットワークにパケットをルーティングするために使用されます。
-
mangle テーブル
このテーブルには、パケットのIPヘッダーをさまざまな方法で変更するルールが保持されます。たとえば、パケットが維持できる有効なネットワークホップ数を増減させることで、パケットのTTL(Time to Live)値を変更できます。さらに、 mangle テーブルは、同様の方法で他のIPヘッダーを変更できます。
このテーブルは、他のテーブルやネットワークツールがさらに処理するために取得できる、カーネル内部の“マーク”をパケットに付与することも許可されています。このマークは実際のパケットには触れず、代わりにカーネルのパケット表現にマークを追加します。
-
raw テーブル
The iptables ファイアウォールはステートフルであり、これはパケットが以前のパケットとの関係の文脈で評価されることを意味します。 netfilter フレームワークの上に構築された接続追跡機能により、 iptables はパケットを、個別の無関係なパケットの流れとしてではなく、進行中の接続またはセッションの一部として表示できます。一般に、接続追跡ロジックは、パケットがネットワークインターフェースに到達した直後に適用されます。
The raw テーブルには、非常に狭く定義された機能が付属しています。このテーブルの唯一の目的は、接続追跡から除外するためにパケットにマークを付けるメカニズムを提供することです。
-
security テーブル
The security テーブルは、パケットに内部SELinuxセキュリティコンテキストマークを付与します。これにより、SELinux(またはSELinuxセキュリティコンテキストを解釈するその他のアプリ)がパケットを処理する方法に影響を与えます。
SELinuxマークは、パケットごと、または接続ごとに適用できます。
各テーブルに実装されているチェーン
これまでは、テーブルとチェーンについて個別に説明してきました。ここからは、各テーブルでどのチェーンが使用可能かを見ていきましょう。このトピックは、同じフックに登録されているチェーンの評価順序に関する議論を拡張するものです。たとえば、3つのテーブルに PREROUTING チェーンがある場合、それらの評価順序はどうなるでしょうか?
次に、以下の表をご覧ください。これは、各 iptables テーブル内で利用可能なチェーンを示しています。
| PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | |
|
(ルーティング決定) |
✓ | ||||
|
raw |
✓ | ✓ | |||
|
(接続追跡有効) |
✓ | ✓ | |||
|
mangle |
✓ | ✓ | ✓ | ✓ | ✓ |
|
nat (DNAT) |
✓ | ✓ | |||
|
(ルーティング決定) |
✓ | ✓ | |||
|
filter |
✓ | ✓ | ✓ | ||
|
security |
✓ | ✓ | ✓ | ||
|
nat (SNAT) |
✓ | ✓ |
左から右に読むと、どのテーブルにどのチェーンが含まれているかが説明されています。例えば、 raw テーブルには、 PREROUTING と OUTPUT の両方のチェーンがあります。上から下に読むと、関連する netfilter フックがトリガーされたときに、各チェーンが呼び出される順序が説明されています。
なお、 nat テーブルは、順序をより明確にするために、 DNAT 操作(パケットの送信先の変更)と SNAT 操作(パケットの送信元の変更)に分割されていることに注意してください。この表には、ルーティング決定が行われるポイントや、接続追跡が有効になるポイントも示されています。
パケットがトリガーするフック(列)は、パケットの性質(受信/送信)、行われるルーティング決定、およびパケットがフィルタリング基準を満たしているかどうかに基づいています。
特定のイベントでは、処理中にテーブルのチェーンをスキップできます。例えば、接続の最初のパケットのみが、 nat テーブルで記述されているNATルールに対して評価されます。同じ接続内の後続のパケットには、追加の評価なしで同じ nat 決定が適用されます。NAT接続への応答には、適切なルーティングのために逆NATルールが自動的に適用されます。
チェーンの走査順序
サーバーがパケットルーティングルールを認識しており、ファイアウォールルールが送信を許可していると仮定すると、以下のフローは異なるパスがどのように走査されるかを示しています。
-
ローカルシステム宛ての受信パケット: PREROUTING >> INPUT
-
別のホスト宛ての受信パケット: PREROUTING >> FORWARD >> POSTROUTING
-
ローカルで生成されたパケット: OUTPUT >> POSTROUTING
結論として、これまで説明したすべての情報を組み合わせると、ローカルシステム宛ての受信パケットは、 PREROUTING チェーン(対象テーブル: raw、, mangle、および nat)に対して評価されます。その後、 INPUT チェーン(対象テーブル: mangle、, filter、, security、および nat)を通過してから、最終的にローカルソケットに到達します。
Iptablesルール
The iptables ファイアウォールルールは、特定のテーブルの特定のチェーン内に配置されます。チェーンが呼び出されると、該当するパケットはチェーン内の各ルールに対して評価されます。各ルールには、マッチングコンポーネントとアクションコンポーネントの2つの要素があります。
-
マッチング
ルールのマッチング部分は、指定されたアクション(または“ターゲット”)が実行される前にパケットが満たす必要のある条件を指定します。
マッチングシステムは非常に高い柔軟性を提供します。その機能は、 iptables 拡張機能を使用して拡張することもできます。ルールは、プロトコルタイプ、送信元/送信先アドレス、送信元/送信先ポート、送信元/送信先ネットワーク、入力/出力インターフェース、ヘッダー、接続状態、およびその他の基準によってパケットをマッチングするように記述できます。ルールにこれらの条件を組み合わせることもでき、その結果、異なるトラフィックを区別するための複雑なルールセットを作成できます。
-
ターゲット
ターゲットとは、パケットがルールのマッチング基準を満たしたときに実行されるアクションです。一般的に、ターゲットは次の2つのグループに分類されます。
-
-
終端ターゲット:チェーン内の評価プロセスを終了し、制御を netfilter フックに戻します。戻り値に基づいて、フックはパケットの通過を許可するか、または破棄します。
-
非終端ターゲット:ターゲットがアクションを実行し、チェーン内の評価が継続されます。各チェーンは最終的な終端決定を経る必要がありますが、その前に任意の数の非終端ターゲットを実行できます。
-
ルール内での各ターゲットの利用可能性は、コンテキストに依存します。例えば、チェインやテーブルのタイプがターゲットの利用可能性に影響を与える場合があります。その他の考えられる要因としては、ルール内で有効化されている拡張機能や、マッチング句などがあります。
ユーザー定義チェイン
また、非終端ターゲットの特別なクラスとして、ジャンプターゲットがあります。ジャンプターゲットは、追加の処理を行うために評価が1つのチェインから別のチェインに移動するときに実行されるアクションです。これまでは、 netfilterフックと密接に関連している組み込みチェインについて説明してきました。しかし、 iptablesは管理者自身がカスタムチェインを作成することも可能にしています。
ユーザー定義チェイン内のルールも、組み込みチェイン内のルールと似ています。主な違いは、ユーザー定義チェインにはルールからそこへ“ジャンプ”することによってのみ到達できる点です。これは、ユーザー定義チェインがどの netfilterフックともリンクしていないためです。
ユーザー定義チェインは、元々それを呼び出したチェインの拡張として考えることができます。例えば、ユーザー定義チェインにおいて、ルールリストの末尾に達するか、あるいはマッチするルールが RETURNターゲットを実行した場合、評価は呼び出し元のチェインに戻されます。興味深いことに、ユーザー定義チェインは評価を別のユーザー定義チェインへ“ジャンプ”させることもできます。
この機能は、より優れた組織化の基礎を築き、堅牢な分岐に必要なフレームワークを提供します。
コネクショントラッキング
When discussing the rawテーブルと接続状態のマッチング基準について説明した際、 netfilterフレームワークの上に実装されているコネクショントラッキングシステムについて触れました。この機能により、 iptables は進行中の接続のコンテキストでパケットを表示できるようになります。また、コネクショントラッキングシステムは iptablesに“ステートフル”な操作を実行するために必要な機能を提供します。
パケットがネットワークスタックに入った直後に、コネクショントラッキングが適用されます。rawテーブルのチェインといくつかの基本的なサニティチェックが、パケットを接続に関連付けるためのすべてのロジックです。
システムは、既存の接続のセットに対して各パケットをチェックします。必要に応じて、システムは既存の接続の状態を更新するか、新しい接続を作成します。いずれかのrawテーブルチェインでNOTRACKターゲットがマークされたパケットは、それ以降のコネクショントラッキングルーチンをバイパスします。
-
利用可能な状態
コネクショントラッキングシステムによって追跡される接続には、以下のいずれかの状態が割り当てられます。
-
-
NEW : 既存の接続に関連付けられていないものの、最初のパケットとして無効ではないパケットが到着すると、このラベルを持つ新しい接続がシステムに追加されます。これは、接続を認識するプロトコル(TCPなど)とコネクションレスプロトコル(UDPなど)の両方で行われます。
-
ESTABLISHED: 接続の状態は、 NEW から ESTABLISHEDへ更新されます(逆方向から有効な応答を受信したとき)。TCP接続の場合、これは SYN/ACKを意味します。UDPおよびICMPトラフィックの場合、元のパケットの送信元と送信先が入れ替わった応答を意味します。
-
RELATED: 接続の一部ではないものの、確立された接続に関連しているパケットは、 RELATED とラベル付けされます。これは、ヘルパー接続(例えば、FTPデータ転送接続など)、または他のプロトコルによる接続試行に対するICMP応答を意味する場合があります。
-
INVALID: 確立された接続の一部ではなく、新しい接続を開始するのに不適切とみなされるパケット、識別できないパケット、ルーティング不可能なパケットなどは、 INVALID とラベル付けされます。.
-
UNTRACKED: パケットは、 UNTRACKED とラベル付けされることがあります( rawテーブルチェインで追跡をバイパスするようにターゲット指定されていた場合)。
-
SNAT: 送信元アドレスがNAT操作によって変更されたときに設定される仮想的な状態を意味します。これはコネクショントラッキングシステムによって処理され、応答パケットで送信元アドレスが変換されるようになります。
-
DNAT: SNATと同様です。, これはNAT操作によって宛先アドレスが変更されたときの仮想的な状態を意味します。接続追跡システムがこれを処理するため、応答パケットをルーティングするときに宛先アドレスを元に戻す方法を認識できます。
-
接続追跡システムによって追跡されるこれらの状態により、管理者は接続のライフサイクルにおける特定のポイントをターゲットにした特定のルールを作成できます。これにより、より徹底的で安全なルールに必要な機能が提供されます。
おわりに
Linuxでは、 netfilterフレームワークと iptablesファイアウォールが、ほとんどのファイアウォールの基盤として機能します。netfilterフックはネットワークスタックに十分に近いため、システムによって処理されるパケットを強力に制御できます。これらの機能を活用することで、 iptables ファイアウォールは、ポリシー要件をカーネルに伝える柔軟な方法を提供します。
このガイドでは、 netfilterフレームワークおよび iptablesファイアウォールの内部構造について深く掘り下げています。さらに、接続追跡システムについても説明します。これらの要素がどのように組み合わされているかを理解することで、これらをより効果的に活用して、より堅牢で安全なサーバー環境を構築できます。
最後に、このガイドでは内部の仕組みを取り上げましたが、実際に適用するにはこちらのiptablesの設定に関するガイドを参照してください。さらに、UFWファイアウォールがどのように iptablesをさらに簡素化するかを確認できます。さらに、次の方法を学ぶことも役立ちます:iptablesファイアウォールルールの表示と削除.
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。