イントロダクション
ファイアウォールは、サーバーやインフラを保護するために設定できる重要なツールです。Linuxエコシステムでは、iptables
が広く使用されており、これはカーネルのnetfilter
パケットフィルタリングフレームワークと連携して動作します。信頼性のあるファイアウォールポリシーの作成は、複雑な構文と関連部品の数により、難しい場合があります。
このガイドでは、iptables
のアーキテクチャに深く入り、自分自身のファイアウォールポリシーを構築する必要があるユーザーにとって理解しやすくすることを目指します。また、iptables
がnetfilter
とどのように連携し、さまざまなコンポーネントが一体となって包括的なフィルタリングシステムを提供するかについても説明します。
IPTablesとNetfilterとは何ですか?
多年にわたり、Linuxで最も一般的に使用されていたファイアウォールソフトウェアはiptables
と呼ばれていました。一部のディストリビューションでは、iptables
の代わりにnftables
という新しいツールが導入されていますが、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 Tables and Chains
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
で最も広く使用されるテーブルの一つです。フィルタテーブルはパケットをその意図された宛先に続行させるか、リクエストを拒否するかについての決定を行います。ファイアウォールの専門用語では、これをパケットの「フィルタリング」と呼びます。このテーブルは、ファイアウォールについて話す際に人々が思い浮かべるほとんどの機能を提供します。
ナットテーブル
nat
テーブルはネットワークアドレス変換ルールを実装するために使用されます。パケットがネットワークスタックに入ると、このテーブルのルールがパケットのソースまたは宛先アドレスをどのように変更するかを決定し、パケットとその応答トラフィックの経路に影響を与えます。これは、直接アクセスが不可能な場合にパケットをネットワークにルーティングするためによく使用されます。
マングルテーブル
mangle
テーブルはパケットのIPヘッダーをさまざまな方法で変更するために使用されます。たとえば、パケットのTTL(Time to Live)値を調整でき、パケットが持続できる有効なネットワークホップの数を延長または短縮できます。他のIPヘッダーも同様の方法で変更できます。
このテーブルはまた、パケットに対して内部カーネルの「マーク」を付けることができます。このマークは実際のパケットに触れず、カーネルがパケットの表現にマークを追加します。
ローテーブル
iptables
ファイアウォールは状態を持ち、パケットは以前のパケットとの関係に基づいて評価されます。 netfilter
フレームワーク上に構築された接続追跡機能により、iptables
はパケットを単独の関連のないパケットのストリームではなく、進行中の接続またはセッションの一部として表示できます。 接続追跡ロジックは通常、パケットがネットワークインターフェイスに到達した直後に適用されます。
raw
テーブルには非常に限定された機能があります。 その唯一の目的は、接続追跡からのオプトアウトのためにパケットにマーキングするメカニズムを提供することです。
セキュリティテーブル
security
テーブルは、SELinuxセキュリティコンテキストマークをパケットに設定するために使用されます。 これは、SELinuxセキュリティコンテキストを解釈できる他のシステムがパケットを処理する方法に影響を与えます。 これらのマークは、パケットごとまたは接続ごとに適用できます。
チェーンとテーブル間の関係
3つのテーブルがPREROUTING
チェーンを持つ場合、それらはどの順序で評価されますか?
次の表は、左から右に読むと、各iptables
テーブル内で利用可能なチェーンを示しています。例えば、raw
テーブルにはPREROUTING
とOUTPUT
の両方のチェーンがあることが分かります。上から下に読むと、関連するnetfilter
フックがトリガーされたときに、各チェーンが呼び出される順序も表示されます。
A few things should be noted. In the representation below, the nat
table has been split between DNAT
operations (those that alter the destination address of a packet) and SNAT
operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:
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
、nat
テーブルのPREROUTING
チェーンに対して評価されます。その後、mangle
、filter
、security
、nat
テーブルのINPUT
チェーンを通過し、最終的にローカルソケットに配信されます。
IPTablesのルール
ルールは特定のテーブルの特定のチェーン内に配置されます。各チェーンが呼び出されると、問題のパケットは順番にそのチェーン内の各ルールに対してチェックされます。各ルールには、マッチングコンポーネントとアクションコンポーネントがあります。
マッチング
ルールの一致部分は、関連するアクション(または「ターゲット」)が実行されるためにパケットが満たす必要のある条件を指定します。
一致システムは非常に柔軟で、追加のiptables
拡張機能で大幅に拡張することができます。ルールは、プロトコルタイプ、宛先またはソースアドレス、宛先またはソースポート、宛先またはソースネットワーク、入力または出力インターフェース、ヘッダー、接続状態などの基準によって一致するように構築することができます。これらを組み合わせて、異なるトラフィックを区別するための複雑なルールセットを作成することができます。
ターゲット
A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:
- 終了ターゲット:終了ターゲットは、チェイン内の評価を終了し、制御を
netfilter
フックに戻します。提供された戻り値によって、フックはパケットをドロップするか、パケットを処理の次の段階に進めるかを決定します。 - 非終了ターゲット:非終了ターゲットはアクションを実行し、チェイン内の評価を続行します。各チェインは最終的な終了判断を返さなければなりませんが、その前に任意の数の非終了ターゲットを実行することができます。
ルール内で使用できる各ターゲットの利用可能性は、文脈によって異なります。たとえば、テーブルやチェインのタイプによって利用可能なターゲットが決まる場合があります。ルールでアクティベートされた拡張機能や一致節も、ターゲットの使用可能性に影響を与えることがあります。
ユーザー定義チェーンへのジャンプ
ジャンプターゲットと呼ばれる特別な非終端ターゲットもあります。ジャンプターゲットは、評価を別のチェーンに移動させるアクションです。私たちは、それらを呼び出すnetfilter
フックに関連付けられた組み込みチェーンをカバーしました。しかし、iptables
は管理者が自分自身の組織目的のために独自のチェーンを作成することも許可します。
ルールは組み込みチェーンに配置される方法と同じ方法でユーザー定義チェーンに配置できます。違いは、ユーザー定義チェーンにはルールから「ジャンプ」して到達することができるという点です(自体がnetfilter
フックに登録されていない)。
ユーザー定義チェーンは、呼び出したチェーンの拡張として機能します。例えば、ユーザー定義チェーンでは、ルールリストの末尾に到達した場合や、RETURN
ターゲットが一致するルールによってアクティブ化された場合に、評価が呼び出し元のチェーンに戻ります。評価はまた、追加のユーザー定義チェーンにジャンプすることもできます。
この構造により、より大きな組織化が可能となり、より堅牢なブランチングのためのフレームワークが提供されます。
IPTablesと接続トラッキング
私たちは、netfilter
フレームワークの上に実装された接続追跡システムについて、raw
テーブルと接続状態の一致基準を説明する際に紹介しました。接続追跡により、iptables
は進行中の接続の文脈でパケットに関する判断を行うことができます。接続追跡システムは、「状態を持つ」操作を実行するためにiptables
が必要とする機能を提供します。
パケットがネットワーキングスタックに入った直後に接続追跡が適用されます。接続に関連付ける前に、raw
テーブルのチェーンといくつかの整合性チェックのみがパケットに対して実行されます。
システムは各パケットを既存の接続のセットと照合します。必要に応じて接続の状態を更新し、必要な場合は新しい接続をシステムに追加します。一部のraw
チェーンで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
ファイアウォールルールの実装を開始するのに役立ちます: