ウェブサイト検索

Iptablesファイアウォールの仕組み


紹介

ファイアウォールを設定することは、現代のオペレーティングシステムを保護するために欠かせないステップです。ほとんどのLinuxディストリビューションには、ファイアウォールを設定するために使用できるいくつかの異なるファイアウォールツールが付属しています。このガイドでは、iptablesファイアウォールについて説明します。

Iptablesは、ほとんどのLinuxディストリビューションにデフォルトで含まれている標準的なファイアウォールです。これは、Linuxネットワークスタックを操作できるカーネルレベルのnetfilterフックへのコマンドラインインターフェースです。Iptablesは、ネットワーキングインターフェースを通過する各パケットを一連のルールと照合して、何をするかを決定することで機能します。

このガイドでは、Iptablesの動作について確認します。より深く掘り下げる方法については、「IptablesとNetfilterアーキテクチャの深掘り」をお読みください。

Iptablesの仕組み

まず、いくつかの用語を復習し、iptablesがどのように機能するかについて話しましょう。

iptablesファイアウォールは、ネットワークトラフィックを一連のルールと比較することによって機能します。ルールは、ネットワークパケットが一致するために必要な特性を定義し、一致したパケットに対して取るべきアクションを決定します。

特定のルールに一致するパケットを確立するための多くのオプションがあります。パケットのプロトコルタイプ、送信元または宛先のアドレスまたはポート、使用されているインターフェース、以前のパケットとの関連などを一致させることができます。

定義されたパターンに一致したときに行われるアクションはターゲットと呼ばれます。ターゲットは、パケットに対する最終的なポリシー決定、たとえばACCEPTやDROPである場合があります。また、パケットを処理のために別のチェーンに移動させたり、遭遇をログに記録したりすることもできます。選択肢はたくさんあります。

これらのルールはチェーンと呼ばれるグループに整理されています。チェーンは、パケットが順次チェックされるルールのセットです。パケットがルールの一つに一致すると、関連するアクションが実行され、チェーン内の残りのルールはスキップされます。

ユーザーは必要に応じてチェーンを作成できます。デフォルトで定義されているチェーンは3つです。それらは:

  • このチェーンは、あなたのサーバーに宛てられたすべてのパケットを処理します。
  • 出力: このチェーンには、あなたのサーバーによって作成された交通のためのルールが含まれています。
  • 転送: このチェーンは、あなたのサーバー上で作成されていない他のサーバー向けのトラフィックを処理するために使用されます。このチェーンは、他のマシンへのリクエストのルーティングを設定するための方法です。

各チェーンはゼロ以上のルールを含むことができ、デフォルトのポリシーを持っています。このポリシーは、パケットがチェーン内のすべてのルールを通過し、どのルールにも一致しなかった場合に何が起こるかを決定します。一致しないルールがない場合、パケットをドロップするか、受け入れるかのいずれかを選択できます。

Iptablesは接続を追跡することもできます。これは、以前のパケットとの関係に基づいてパケットに何が起こるかを定義するルールを作成できることを意味します。この機能は「状態追跡」、「接続追跡」または「状態マシン」の設定と呼ばれます。

IPv4対IPv6

Linuxカーネルに含まれているnetfilterファイアウォールは、IPv4とIPv6のトラフィックを完全に分離しています。ファイアウォールルールセットを含むテーブルを操作するために使用されるIptablesツールも異なります。サーバーでIPv6が有効になっている場合、サーバーのトラフィックに対処するために両方のテーブルを構成する必要があります。

注意: NftablesはIptablesの後継で、IPv4とIPv6の処理をより密接に統合しています。iptables-translateコマンドを使用して、IptablesルールをNftablesに移行できます。

通常のiptablesコマンドは、IPv4トラフィックを管理するルールを含むテーブルを操作するために使用されます。IPv6トラフィックの場合は、ip6tablesという補助コマンドが使用されます。iptablesを使用して設定したルールは、IPv4アドレスを使用するパケットにのみ影響しますが、これらのコマンド間の構文は同じです。iptablesコマンドはIPv4トラフィックに適用されるルールを作成し、ip6tablesコマンドはIPv6トラフィックに適用されるルールを作成します。ip6tablesルールを作成する際は、サーバーのIPv6アドレスを使用することを忘れないでください。

覚えておくべきこと

iptablesがインターフェースを通過するパケットをどのように処理するかを理解したので、パケットを適切なチェーンに割り当て、一致するルールを見つけるまで各ルールに対してチェックし、一致するものが見つからない場合はチェーンのデフォルトポリシーを発行するという流れがわかったので、ルールの作成を開始できます。

まず、デフォルトドロップポリシーを実装する場合は、現在の接続をアクティブに保つためのルールがあることを確認する必要があります。これは、SSHを通じてサーバーに接続している場合に特に重要です。現在の接続をドロップするルールまたはポリシーを誤って実装した場合は、ブラウザベースのリカバリーコンソールを使用してサーバーにログインする必要があるかもしれません。

もう一つ考慮すべき点は、各チェーン内のルールの順序が重要であるということです。パケットは、より具体的なルールに一致することを意図している場合、より一般的なルールに出会ってはいけません。

これにより、チェーンの上部に近いルールは、下部のルールよりも高い具体性レベルを持つべきです。最初に特定のケースをマッチさせ、その後、より一般的なルールを提供して広範なパターンにマッチさせるべきです。パケットがチェーン全体を通過する場合(いずれのルールにもマッチしない場合)、最も一般的なルール、つまりデフォルトポリシーに従います。

この理由から、チェーンのデフォルトポリシーは、チェーンに含まれるルールの種類を強く決定します。デフォルトポリシーが ACCEPT のチェーンには、明示的にパケットをドロップするルールが含まれます。一方、デフォルトが DROP のチェーンには、特に受け入れるべきパケットの例外が含まれます。

結論

この時点で、自分のファイアウォールを実装する準備が整いました。これには、『Nftablesを使用してUbuntu 22.04にファイアウォールを設定する方法』を読むべきです。また、より高レベルのアプローチを希望する場合は、『UFWを使用してUbuntu 22.04にファイアウォールを設定する方法』を参照してください。ファイアウォールを管理サービス層として実行したい場合は、DigitalOceanのクラウドファイアウォールを試すこともできます。

関連記事: