「IptablesとNetfilterアーキテクチャの詳細な解説」

はじめに

ファイアウォールは、サーバーやインフラストラクチャーを保護するために設定できる重要なツールです。Linuxエコシステムでは、iptablesがカーネルのネットフィルターパケットフィルタリングフレームワークと連携して広く使われています。信頼性のあるファイアウォールポリシーの作成は、複雑な構文と関連部分の数のために困難を伴うことがあります。

このガイドでは、iptablesのアーキテクチャについて掘り下げ、独自のファイアウォールポリシーを構築する必要があるユーザーにとってより理解しやすくすることを目指します。iptablesがnetfilterとどのように相互作用し、各コンポーネントが組み合わさって包括的なフィルタリングシステムを提供するかを検討します。

IPテーブルとネットフィルターは何ですか? (IP te-buru to nettofirutaa wa nan desu ka?)

長い間、Linuxで最も一般的に使用されていたファイアウォールソフトウェアはiptablesと呼ばれていました。一部のディストリビューションでは、新しいツールであるnftablesに置き換えられていますが、iptablesの構文はまだ基準としてよく使われています。iptablesファイアウォールは、Linuxカーネルのネットワーキングスタック内のパケットフィルタリングフックとの連携によって動作します。これらのカーネルフックはネットフィルターフレームワークとして知られています。

ネットワーキングレイヤーを通過するすべてのパケット(入力または出力)は、これらのフックをトリガーとし、プログラムがトラフィックと相互作用するためのキーポイントとなります。iptablesに関連するカーネルモジュールは、ファイアウォールルールによって定められた条件にトラフィックが適合することを確保するために、これらのフックに登録します。

ネットフィルターフックス

プログラムは登録できるネットフィルターフックが5つあります。パケットがスタックを進むにつれて、これらのフックに登録されたカーネルモジュールがトリガーされます。パケットがトリガーするフックは、パケットが送信元か受信元か、パケットの宛先、または以前の段階でのパケットのドロップまたは拒否に依存します。

以下のフックは、ネットワーキングスタック内のこれらの明確に定義されたポイントを表しています。

  • NF_IP_PRE_ROUTING: This hook will be triggered by any incoming traffic very soon after entering the network stack. This hook is processed before any routing decisions have been made regarding where to send the packet.
  • NF_IP_LOCAL_IN: This hook is triggered after an incoming packet has been routed if the packet is destined for the local system.
  • NF_IP_FORWARD: This hook is triggered after an incoming packet has been routed if the packet is to be forwarded to another host.
  • NF_IP_LOCAL_OUT: This hook is triggered by any locally created outbound traffic as soon as it hits the network stack.
  • NF_IP_POST_ROUTING: This hook is triggered by any outgoing or forwarded traffic after routing has taken place and just before being sent out on the wire.

これらのフックに登録する必要があるカーネルモジュールは、フックがトリガーされた時に呼び出される順番を決定するために、優先順位の番号も指定する必要があります。これにより、複数のモジュール(または同じモジュールの複数のインスタンス)が各フックに確定的な順序で接続される手段が提供されます。各モジュールは順番に呼び出され、パケットの処理後にnetfilterフレームワークに対して行うべき動作を示す判断を返します。

IPTablesのテーブルとチェーン

iptablesファイアウォールは、ルールを整理するためにテーブルを使用します。これらのテーブルは、それらが行う決定の種類に応じてルールを分類します。例えば、ネットワークアドレス変換に関するルールはnatテーブルに追加されます。パケットをその宛先に続けるかどうかを決定するためのルールは、おそらくフィルタテーブルに追加されるでしょう。

各iptablesテーブル内では、ルールは個別の「チェーン」内でさらに整理されています。テーブルは保持するルールの一般的な目的によって定義されますが、組み込みのチェーンはそれらをトリガーするnetfilterフックを表します。チェーンはルールが評価されるタイミングを決定します。

組み込みチェーンの名前は、関連するnetfilterフックの名前と対応しています。

  • PREROUTING: Triggered by the NF_IP_PRE_ROUTING hook.
  • INPUT: Triggered by the NF_IP_LOCAL_IN hook.
  • FORWARD: Triggered by the NF_IP_FORWARD hook.
  • OUTPUT: Triggered by the NF_IP_LOCAL_OUT hook.
  • POSTROUTING: Triggered by the NF_IP_POST_ROUTING hook.

チェーンは、管理者がパケットの送信経路でルールを評価する場所を制御することを可能にします。各テーブルには複数のチェーンがあるため、テーブルの影響は処理の複数のポイントで行使されることができます。ネットワークスタックの特定のポイントでのみ意味を持つ決定の種類があるため、すべてのテーブルにはカーネルフックごとにチェーンが登録されているわけではありません。

ネットフィルターカーネルのフックは、わずか5つしかありませんので、複数のテーブルのチェーンはそれぞれのフックに登録されます。例えば、3つのテーブルにはPREROUTINGチェーンがあります。これらのチェーンが関連するNF_IP_PRE_ROUTINGフックに登録する際、優先度が指定されます。この優先度によって、各テーブルのPREROUTINGチェーンが呼び出される順序が決まります。最も優先度の高いPREROUTINGチェーン内のルールは、次のPREROUTINGチェーンに移る前に順次評価されます。まもなく各チェーンの具体的な順序を見てみましょう。

どのテーブルが利用可能ですか?

ひとつのオプションだけが必要ですので、日本語で以下の文を言い換えます:
「少し後ろに下がり、iptablesが提供する異なるテーブルを見てみましょう。これらはパケットの評価のために、関心の対象ごとに整理された異なるルールのセットを表しています。」

フィルターテーブル

フィルターテーブルはiptablesで最も広く使用されるテーブルの一つです。フィルターテーブルは、パケットがその意図した宛先に進めるべきか、またはリクエストを拒否するかの判断を行うために使用されます。ファイアウォール用語では、これを「パケットのフィルタリング」と呼びます。このテーブルは、ファイアウォールに関する議論の際に人々が思い浮かべるほとんどの機能を提供します。

NATテーブル

ネットワークアドレス変換ルールを実装するために、NATテーブルが使用されます。パケットがネットワークスタックに入ると、このテーブルのルールによって、パケットの送信元または宛先アドレスをどのように変更するかが決定されます。これにより、パケットと応答トラフィックの経路に影響を与えることができます。これは、直接アクセスが不可能な場合に、パケットをネットワークにルーティングするためによく使用されます。

マングルテーブル

マングルテーブルは、パケットのIPヘッダーを様々な方法で変更するために使用されます。たとえば、パケットのTTL(生存時間)値を調整することができ、パケットが持続できる有効なネットワークホップの数を長くしたり短くしたりすることができます。他のIPヘッダーも同様の方法で変更できます。

このテーブルは、他のテーブルやネットワーキングツールによる追加処理のために、パケットに内部のカーネル「マーク」を付けることもできます。このマークは実際のパケットに触れず、カーネルがパケットの表現にマークを追加します。

生のテーブル

iptablesファイアウォールはステートフルであり、パケットは以前のパケットとの関係を考慮して評価されます。netfilterフレームワークの上に構築された接続追跡機能により、iptablesはパケットを単独のストリームではなく、進行中の接続やセッションの一部として見ることができます。接続追跡ロジックは通常、パケットがネットワークインターフェースに到達した直後に適用されます。

生のテーブルは非常に狭義に定義された機能を持っています。その唯一の目的は、パケットにマーキングすることで、コネクション追跡から除外する仕組みを提供することです。

セキュリティテーブル

セキュリティテーブルは、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)

パケットがネットフィルターフックをトリガーすると、関連するチェーンは上から下に順番に処理されます。パケットが受信パケットか送信パケットか、ルーティングの決定、およびパケットがフィルタリング基準をクリアするかどうかによって、トリガーされるフック(列)が決まります。

特定のイベントが発生すると、処理中にテーブルのチェーンがスキップされます。例えば、接続の最初のパケットのみがNATのルールに基づいて評価されます。最初のパケットに対して行われたNATの判断は、追加の評価なしで接続のすべての後続パケットに適用されます。NATを適用した接続への応答では、ルーティングを正しく行うために自動的に逆のNATルールが適用されます。

連鎖走査順

もしサーバーがパケットのルーティング方法を知っており、ファイアウォールのルールがその送信を許可していると仮定すると、以下のフローは異なる状況で通過する経路を表しています。

  • Incoming packets destined for the local system: PREROUTING -> INPUT
  • Incoming packets destined to another host: PREROUTING -> FORWARD -> POSTROUTING
  • Locally generated packets: OUTPUT -> POSTROUTING

前述の情報と前の表で示された順序を組み合わせると、ローカルシステムに行くパケットは最初に raw、mangle、natのPREROUTINGチェーンで評価されます。その後、mangle、filter、security、natのINPUTチェーンを通過して、最終的にローカルソケットに配信されます。

IPTablesルール

特定のテーブルの特定の連鎖内にルールが配置されます。各連鎖が呼び出されると、対象のパケットは連鎖内の各ルールと順番に照合されます。各ルールには照合コンポーネントとアクションコンポーネントがあります。

マッチング

ルールのマッチング部分は、関連するアクション(または「ターゲット」)が実行されるためにパケットが満たす必要のある条件を指定します。

マッチングシステムは非常に柔軟であり、iptablesの追加拡張によって大幅に拡張することが可能です。プロトコルタイプ、宛先または送信元アドレス、宛先または送信元ポート、宛先または送信元ネットワーク、入力または出力インターフェース、ヘッダー、接続状態などの条件によってマッチするルールを作成することができます。これらは組み合わせて、異なるトラフィックを区別するための複雑なルールセットを作成することができます。

ターゲット

「ターゲット」とは、パケットがルールの一致基準を満たした場合にトリガーされるアクションを指します。ターゲットは一般的に2つのカテゴリーに分けられます。

  • Terminating targets: Terminating targets perform an action which terminates evaluation within the chain and returns control to the netfilter hook. Depending on the return value provided, the hook might drop the packet or allow the packet to continue to the next stage of processing.
  • Non-terminating targets: Non-terminating targets perform an action and continue evaluation within the chain. Although each chain must eventually pass back a final terminating decision, any number of non-terminating targets can be executed beforehand.

各ターゲットの利用可能性は文脈によって異なります。例えば、テーブルやチェーンの種類によって利用可能なターゲットが制約される場合があります。また、ルールで活性化されるエクステンションやマッチング句もターゲットの利用可能性に影響を及ぼすことがあります。

ユーザー定義のチェーンにジャンプする

日本語での表現例:
「ジャンプターゲット」という特別な非終了ターゲットも存在します。ジャンプターゲットは、評価を追加処理のために異なるチェーンに移動させる行動です。私たちは、それらを呼び出すNetfilterフックに関連付けられた組み込みチェーンについて説明しました。しかし、iptablesでは管理者が自分自身の組織的な目的のために独自のチェーンを作成することも可能です。

規則は、組み込みのチェーンに配置されるのと同じ方法で、ユーザー定義のチェーンに配置することができます。異なる点は、ユーザー定義のチェーンは、ルールから「ジャンプ」しなければアクセスできないことです(ネットフィルターフックには登録されません)。

ユーザー定義のチェーンは、呼び出したチェーンの拡張機能として機能します。たとえば、ユーザー定義のチェーンでは、ルールリストの終わりに到達した場合や、マッチするルールによってアクティブ化されたRETURNターゲットがある場合に、評価が呼び出し元のチェーンに戻ります。評価はさらに、他のユーザー定義のチェーンにジャンプすることも可能です。

この構造は、より大きな組織化を可能にし、より堅牢な分岐のために必要なフレームワークを提供します。

IPTablesと接続トラッキング

私たちは、RAWテーブルと接続状態の一致基準について議論した際、netfilterフレームワークの上に実装された接続追跡システムを紹介しました。接続追跡により、iptablesは進行中の接続の文脈でパケットに関する決定を下すことができます。接続追跡システムは、iptablesが「ステートフル」な操作を実行するために必要な機能性を提供します。

パケットがネットワーキングスタックに入った直後には、接続追跡がすぐに適用されます。コネクションに関連付けられる前に、パケットに対して行われるのは、生のテーブルチェーンといくつかのサニティチェックだけです。

システムは各パケットを既存の接続と照合します。必要に応じて接続の状態を更新し、新しい接続をシステムに追加します。生のチェーンのいずれかでNOTRACKターゲットが指定されたパケットは、接続追跡ルーチンをバイパスします。

利用可能な州

接続トラッキングシステムによって追跡された接続は、次のいずれかの状態となります。

  • NEW: When a packet arrives that is not associated with an existing connection, but is not invalid as a first packet, a new connection will be added to the system with this label. This happens for both connection-aware protocols like TCP and for connectionless protocols like UDP.
  • ESTABLISHED: A connection is changed from NEW to ESTABLISHED when it receives a valid response in the opposite direction. For TCP connections, this means a SYN/ACK and for UDP and ICMP traffic, this means a response where source and destination of the original packet are switched.
  • RELATED: Packets that are not part of an existing connection, but are associated with a connection already in the system are labeled RELATED. This could mean a helper connection, as is the case with FTP data transmission connections, or it could be ICMP responses to connection attempts by other protocols.
  • INVALID: Packets can be marked INVALID if they are not associated with an existing connection and aren’t appropriate for opening a new connection, if they cannot be identified, or if they aren’t routable among other reasons.
  • UNTRACKED: Packets can be marked as UNTRACKED if they’ve been targeted in a raw table chain to bypass tracking.
  • SNAT: This is a virtual state set when the source address has been altered by NAT operations. This is used by the connection tracking system so that it knows to change the source addresses back in reply packets.
  • DNAT: This is a virtual state set when the destination address has been altered by NAT operations. This is used by the connection tracking system so that it knows to change the destination address back when routing reply packets.

接続追跡システムで追跡される状態により、管理者は接続の寿命における特定のポイントに対してルールを作成することができます。これにより、より徹底的で安全なルールを実現するための機能が提供されます。

結論

Linuxサーバー上のほとんどのファイアウォールソリューションは、Netfilterパケットフィルタリングフレームワークとiptablesファイアウォールを基礎としています。Netfilterカーネルフックはネットワーキングスタックに十分に近く、システムによって処理されるパケットに対して強力な制御を提供します。iptablesファイアウォールはこれらの機能を活用し、カーネルにポリシー要件を柔軟かつ拡張可能な方法で伝えます。これらの要素がどのように組み合わさるかを学ぶことで、サーバー環境をより効果的に制御し、セキュリティを確保することができます。

iptablesポリシーの効果的な選択方法についてもっと知りたい場合は、このガイドを参照してください。

これらのガイドは、iptablesファイアウォールルールの実装を始めるのに役立ちます。

  • How To Set Up a Firewall Using Iptables
  • Iptables Essentials: Common Firewall Rules and Commands
  • How To Set Up a Firewall with UFW on Ubuntu 22.04
  • How To Set Up a Firewall Using firewalld on Rocky Linux 8
  • How To Set Up an Iptables Firewall to Protect Traffic Between your Servers
コメントを残す 0

Your email address will not be published. Required fields are marked *