| 初回リリース | 1999年8月26日(Linux 2.3.15) |
|---|---|
| 安定版リリース | 6.12.1 [1]
/ 2024年11月22日 |
| 書かれた | C |
| オペレーティング·システム | リナックス |
| タイプ |
|
| ライセンス | GNU GPL |
| Webサイト | ネットフィルター |
NetfilterはLinux カーネルによって提供されるフレームワークであり、カスタマイズされたハンドラーの形式でさまざまなネットワーク関連の操作を実装できます。Netfilter は、パケット フィルタリング、ネットワーク アドレス変換、ポート変換のさまざまな機能と操作を提供し、ネットワークを介してパケットを誘導し、パケットがネットワーク内の機密の場所に到達するのを禁止するために必要な機能を提供します。
Netfilter はLinux カーネル内のフックのセットを表し、特定のカーネル モジュールがカーネルのネットワーク スタックにコールバック関数を登録できるようにします。これらの関数は通常、フィルタリングと変更のルールの形でトラフィックに適用され、ネットワーク スタック内の対応するフックを通過するすべてのパケットに対して呼び出されます。[2]
歴史

Rusty Russell は1998 年にnetfilter/iptables プロジェクトを開始しました。彼はこのプロジェクトの前身であるipchains の作者でもありました。プロジェクトが成長するにつれ、彼は1999 年にNetfilter Core Team (または単にcoreteam ) を設立しました。彼らが作成したソフトウェア (以降netfilterと呼びます) はGNU General Public License (GPL) ライセンスを使用しており、1999 年 8 月 26 日にLinux カーネル メインラインのバージョン 2.3.15 に統合され、2.4.0 安定バージョンになりました。[3]
2003 年 8 月、Harald Welte がコアチームの議長に就任しました。2004 年 4 月、GPL に準拠せずにルーターに組み込まれたプロジェクトのソフトウェアを配布する人々に対するプロジェクトの取り締まりを受けて、ドイツの裁判所は、GPL の条件に従うことを拒否した Sitecom Germany に対して Welte に歴史的な差し止め命令を下しました( GPL 関連の紛争を参照)。2007 年 9 月、過去数年間開発を指揮してきた Patrick McHardy がコアチームの新しい議長に選出されました。
iptables 以前は、Linux ファイアウォールを作成するための主流のソフトウェア パッケージは、Linux カーネル 2.2.x のipchainsと Linux カーネル 2.0.x の ipfwadm でした。[3]これらは、 BSDのipfwをベースとしていました。Linux カーネルには Netfilter が導入されるまで一般的なパケット制御フレームワークがなかったため、ipchains と ipfwadm はどちらもネットワーク コードを変更してパケットを操作できるようにしました。
ipchains と ipfwadm はパケット フィルタリングと NAT (特に、マスカレード、ポート転送、リダイレクトと呼ばれる3 種類のNAT ) を組み合わせていますが、Netfilter はパケット操作を以下に説明する複数の部分に分割します。それぞれが異なるポイントで Netfilter フックに接続してパケットにアクセスします。接続追跡と NAT サブシステムは、ipchains と ipfwadm 内の基本的なバージョンよりも汎用的で強力です。
2017年にはIPv4とIPv6のフローオフロードインフラストラクチャが追加され、ソフトウェアフローテーブル転送とハードウェアオフロードサポートの高速化が可能になりました。[4] [5]
ユーザー空間ユーティリティプログラム

iptables
ip_tables、、 (アンダースコアip6_tablesはarp_tables名前の一部です)、およびという名前のカーネル モジュールebtablesは、Netfilter フック システムの従来のパケット フィルタリング部分を構成します。これらは、パケットをフィルタリングまたは変換できるファイアウォール ルールを定義するためのテーブルベースのシステムを提供します。テーブルは、ユーザー空間ツールの、、、およびを使用して管理できますiptables。カーネルip6tablesモジュールとユーザー空間ユーティリティはどちらも同様の名前を持っていますが、それぞれが異なる機能を持つ別のエンティティであることに注意してください。
arptablesebtables
各テーブルは実際には独自のフックであり、各テーブルは特定の目的を果たすために導入されました。Netfilter に関しては、特定のテーブルを他のテーブルに対して特定の順序で実行します。どのテーブルも自分自身を呼び出したり、独自のルールを実行したりできるため、追加の処理や反復が可能になります。
ルールはチェーン、つまり「ルールのチェーン」に編成されます。これらのチェーンにはINPUT、、、OUTPUTなどの定義済みのタイトルが付けられFORWARDます。これらのチェーン タイトルは、Netfilter スタック内の発信元を説明するのに役立ちます。たとえば、パケット受信は に分類されPREROUTING、はINPUTローカルに配信されたデータを表し、転送されたトラフィックはチェーンに分類されますFORWARD。ローカルで生成された出力はチェーンを通過しOUTPUT、送信されるパケットはPOSTROUTINGチェーン内にあります。
テーブルに整理されていない Netfilter モジュール (以下を参照) は、オリジンをチェックして動作モードを選択できます。
iptable_rawモジュール- ロードされると、他の Netfilter フックの前に呼び出されるフックを登録します。これは、接続追跡などのメモリを大量に消費する操作に到達する前にパケットをフィルタリングするために使用できるrawと呼ばれるテーブルを提供します。
iptable_mangleモジュール- 接続トラッキング (下記参照) の後に (ただし他のテーブルの前に) 実行するフックとマングルテーブルを登録して、パケットに変更を加えることができるようにします。これにより、NAT や追加のフィルタリングなどの後続のルールによる追加の変更が可能になります。
iptable_natモジュール- 2 つのフックを登録します。宛先ネットワーク アドレス変換ベースの変換 ("DNAT") はフィルター フックの前に適用されます。送信元ネットワーク アドレス変換ベースの変換 ("SNAT") は後に適用されます。iptablesで使用できるネットワーク アドレス変換テーブル (または "nat") は、 NATマッピング専用の "構成データベース" にすぎず、いかなる種類のフィルタリングにも使用できません。
iptable_filterモジュール- 汎用フィルタリング(ファイアウォール)に使用されるフィルタテーブルを登録します。
security_filterモジュールSECMARKおよびターゲットによって有効化されるものなどの、強制アクセス制御 (MAC) ネットワーク ルールに使用されますCONNSECMARK。(これらのいわゆる「ターゲット」は、Security-Enhanced Linux マーカーを指します。) 強制アクセス制御は、SELinux などの Linux セキュリティ モジュールによって実装されます。セキュリティ テーブルは、フィルタ テーブルの呼び出しに続いて呼び出され、フィルタ テーブル内の任意アクセス制御 (DAC) ルールが MAC ルールよりも先に有効になります。このテーブルは、次の組み込みチェーンを提供します:INPUT(コンピュータ自体に着信するパケット用)、OUTPUT(ルーティング前にローカルで生成されたパケットを変更するため)、およびFORWARD(コンピュータを介してルーティングされるパケットを変更するため)。
nftables
nftables は、Netfilter の新しいパケット フィルタリング部分です。は、、、およびnftを置き換える新しいユーザー空間ユーティリティです。
iptablesip6tablesarptablesebtables
nftables カーネル エンジンは、Linux カーネルにシンプルな仮想マシンを追加します。この仮想マシンは、バイトコードを実行してネットワーク パケットを検査し、そのパケットの処理方法を決定することができます。この仮想マシンによって実装される操作は、意図的に基本的なものになっています。パケット自体からデータを取得し、関連するメタデータ (たとえば、受信インターフェイス) を確認し、接続追跡データを管理できます。算術演算子、ビット演算子、比較演算子を使用して、そのデータに基づいて決定を下すことができます。仮想マシンは、データ セット (通常は IP アドレス) を操作することもできるため、複数の比較操作を 1 つのセット検索に置き換えることができます。[6]
これは、従来のXtables(iptablesなど)コードとは対照的です。Xtablesコードにはプロトコル認識がコードに深く組み込まれているため、ファイアウォールエンジンがプロトコルに特化しているため汎用的に使用できず、IPv4、IPv6、ARP、イーサネットブリッジングについて4回複製する必要がありました。[6]従来のXtablesコードと比較した主な利点は、iptablesLinuxカーネルABIの簡素化、コード重複の削減、エラー報告の改善、フィルタリングルールの実行、保存、増分的かつアトミックな変更の効率化です。
パケットのデフラグ
このnf_defrag_ipv4モジュールは、IPv4 パケットが Netfilter の接続追跡 (モジュール) に到達する前に、パケットをデフラグします。これは、必ずしもフラグメントではなくパケット全体でのみ確実に機能するカーネル内接続追跡モジュールと NAT ヘルパー モジュール (「ミニALGnf_conntrack_ipv4 」の一種) に必要です。
IPv6 デフラグツールは、それ自体がモジュールではなく、nf_conntrack_ipv6モジュールに統合されています。
接続追跡
Netfilterフレームワーク上に構築された重要な機能の1つは、接続追跡です。[7]接続追跡により、カーネルはすべての論理ネットワーク接続またはセッションを追跡し、それによってその接続を構成する可能性のあるすべてのパケットを関連付けることができます。NATはこの情報に依存して、関連するすべてのパケットを同じように変換し、iptablesこの情報を使用してステートフルファイアウォールとして機能します。
ただし、接続状態は、TCP や SCTP の状態などの上位レベルの状態とは完全に独立しています。その理由の 1 つは、パケットを転送するだけの場合、つまりローカル配信を行わない場合、TCP エンジンが必ずしも呼び出されるわけではないことです。UDP 、IPsec (AH/ESP)、GRE、その他のトンネリング プロトコルなどのコネクションレス モードの送信でも、少なくとも疑似接続状態があります。このようなプロトコルのヒューリスティックは、非アクティブ状態に対する事前設定されたタイムアウト値に基づいていることが多く、そのタイムアウト値が経過すると、Netfilter 接続が切断されます。
各 Netfilter 接続は、(レイヤー 3 プロトコル、送信元アドレス、宛先アドレス、レイヤー 4 プロトコル、レイヤー 4 キー) タプルによって一意に識別されます。レイヤー 4 キーはトランスポート プロトコルによって異なります。TCP/UDP の場合はポート番号、トンネルの場合はトンネル ID になりますが、それ以外の場合はタプルの一部ではないかのように 0 になります。すべてのケースで TCP ポートを検査できるように、パケットは強制的にデフラグされます。
Netfilter 接続は、ユーザー空間ツールを使用して操作できますconntrack。
iptables状態やステータスなどの接続情報をチェックすることで、パケット フィルタリング ルールをより強力にし、管理しやすくすることができます。最も一般的な状態は次のとおりです。
NEW- 新しい接続を作成しようとしています
ESTABLISHED- 既存の接続の一部
RELATED- 新しい接続を開始し、「期待」されているパケットに割り当てられます。前述のミニALGは、たとえばモジュールがFTP「」コマンドを
nf_conntrack_ftp検出したときに、これらの期待を設定します。PASV INVALID- パケットが無効であることが判明しました。たとえば、 TCP 状態図に準拠していないなどです。
UNTRACKED- 特定のパケットの接続追跡をバイパスするために管理者が割り当てることができる特別な状態 (上記の生の表を参照)。
通常の例としては、conntrack サブシステムが最初に確認するパケットは「新規」に分類され、応答は「確立済み」に分類され、ICMPエラーは「関連」に分類されます。既知の接続と一致しない ICMP エラー パケットは「無効」になります。
接続追跡ヘルパー
プラグイン モジュールを使用すると、接続追跡にアプリケーション層プロトコルの知識が与えられ、2 つ以上の異なる接続が「関連している」ことを理解できるようになります。たとえば、FTPプロトコルを考えてみましょう。制御接続が確立されますが、データが転送されるたびに、それを転送するための別の接続が確立されます。モジュールnf_conntrack_ftpがロードされると、FTP データ接続の最初のパケットは、論理的には既存の接続の一部であるため、「新規」ではなく「関連」として分類されます。
ヘルパーは一度に 1 つのパケットのみを検査するため、接続追跡に重要な情報がIP フラグメンテーションまたは TCP セグメンテーションによって 2 つのパケットに分割されている場合、ヘルパーは必ずしもパターンを認識せず、操作を実行しません。IP フラグメンテーションはデフラグを必要とする接続追跡サブシステムで処理されますが、TCP セグメンテーションは処理されません。FTP の場合、セグメンテーションは標準セグメント サイズのようにコマンドの「近く」で発生しないと見なされるPASVため、Netfilter でも処理されません。
ネットワークアドレス変換
各接続には、元のアドレスと応答アドレスのセットがあり、最初は同じです。Netfilter の NAT は、応答アドレスと、必要に応じてポートを変更するだけで実装されます。パケットが受信されると、その接続タプルも応答アドレス ペア (およびポート) と比較されます。フラグメントフリーであることも NAT の要件です (必要に応じて、IPv4 パケットは通常の非 Netfilter IPv4 スタックによって再フラグメント化される場合があります)。
NATヘルパー
接続追跡ヘルパーと同様に、NAT ヘルパーはパケット検査を実行し、ペイロード内の応答アドレスを元のアドレスに置き換えます。
さらなるNetfilterプロジェクト
Netfilter コードを直接使用するカーネル モジュールではありませんが、Netfilter プロジェクトには注目すべきソフトウェアがいくつかホストされています。
conntrackツール
conntrack-toolsは、システム管理者が接続追跡エントリおよびテーブルを操作できるようにする Linux 用のユーザー空間ツールのセットです。パッケージには、conntrackdデーモンとコマンド ライン インターフェイスが含まれていますconntrack。ユーザー空間デーモンをconntrackd使用すると、高可用性のクラスターベースのステートフル ファイアウォールを有効にし、ステートフル ファイアウォールの使用に関する統計を収集できます。コマンド ライン インターフェイスは、conntrack旧式の よりも柔軟なインターフェイスを接続追跡システムに提供します/proc/net/nf_conntrack。
ipset
接続追跡などの他の拡張機能とは異なり、ipset[8]はiptablesコアNetfilterコードよりもコアNetfilterコードに関連しています。ipsetたとえば、Netfilterフックは使用しませんが、実際にはiptablesIPセットを一致させ、最小限の変更(設定/クリア)を行うモジュールを提供します。
と呼ばれるユーザー空間ツールは、ipsetLinux カーネルでいわゆる「IP セット」を設定、維持、検査するために使用されます。IP セットには通常、IPアドレスのセットが含まれますが、「タイプ」に応じて他のネットワーク番号のセットも含まれる場合があります。これらのセットは、ベア ルールよりもはるかに検索効率が高くなりますが、当然ながらメモリ フットプリントが大きくなる可能性があります。ユーザーが最適なソリューションを選択できるように、
iptablesさまざまなストレージ アルゴリズム (メモリ内のデータ構造用) が で提供されています。ipset
あるセット内の任意のエントリを別のセットにバインドして、高度なマッチング操作を行うことができます。セットはiptables、それを参照するルールや他のセットが存在しない場合にのみ削除 (破棄) できます。
SYNプロキシ
SYNPROXYターゲットは、このような場合に接続追跡によって課せられる大きなパフォーマンスペナルティなしに、大規模なSYNフラッドの処理を可能にします。最初のSYNリクエストをSYNPROXYターゲットにリダイレクトすることにより、接続は検証された最終状態に達するまで接続追跡に登録されずACK、接続追跡は大量の潜在的に無効な接続を計算する必要がなくなります。このようにして、大規模なSYNフラッドを効果的に処理できます。[9]
2013年11月3日、SYNLinuxカーネルメインラインのバージョン3.12がリリースされ、プロキシ機能がNetfilterに統合されました。[10] [11]
ウログ
ulogdは、Netfilter サブシステムからパケットとイベント通知を受信して記録するユーザー空間デーモンです。ユーザーip_tables空間のキューイング メカニズムを介してパケットを配信でき、接続追跡は と対話して、ulogdパケットまたはイベント (接続の切断、NAT の設定など) に関する詳細情報を交換できます。
ユーザー空間ライブラリ
Netfilter は、名前のプレフィックスとして を持つ一連のライブラリも提供しておりlibnetfilter、これを使用してユーザー空間からさまざまなタスクを実行できます。これらのライブラリは、GNU GPL バージョン 2 に基づいてリリースされています。具体的には、次のライブラリです。
libnetfilter_queue- iptablesと組み合わせてユーザー空間パケットキューイングを実行できます。
libnfnetlink libnetfilter_conntrack- ユーザー空間からの接続追跡エントリの操作を可能にする。
libnfnetlink libnetfilter_log- iptablesによって生成されたログメッセージの収集を可能にします。
libnfnetlink libnl-3-netfilter- キュー、接続追跡、ログの操作を可能にする。
libnlプロジェクトの一部である[12] libiptc- iptablesファイアウォールルールセットの変更を可能にします。これは
netlinkライブラリに基づいておらず、そのAPIはiptablesユーティリティによって内部的に使用されます。 libipset- IP セットに対する操作を許可します。 に基づきます
libmnl。
ネットフィルターワークショップ
Netfilterプロジェクトは開発者向けの年次会議を開催し、進行中の研究開発の取り組みについて議論しています。2018年のNetfilterワークショップは2018年6月にドイツのベルリンで開催されました。[13]
参照
- バークレーパケットフィルタ
- ジェニアテック対マクハーディ(2018)訴訟
- IP 仮想サーバー(IPVS、LVS の一部)
- ipchains 、 iptablesの前身
- ipfw
- Linux 仮想サーバー(LVS)
- Netlink、Netfilter拡張機能で使用されるAPI
- ネットワーク スケジューラ、ネットワーク スタックの別の低レベル コンポーネント
- NPF (ファイアウォール)
- PF (ファイアウォール)
- シンプルなファイアウォール
参考文献
- ^ Greg Kroah-Hartman (2024年11月22日). 「Linux 6.12.1」 . 2024年11月22日閲覧。
- ^ 「netfilter/iptables プロジェクトのホームページ - netfilter.org プロジェクト」。netfilter.org。2014年 7 月 4 日閲覧。
- ^ ab Harald Welte、netfilter archeology: 2.3 から 4.x までの 18 年間、2017 年 12 月 5 日
- ^ 「フローオフロードインフラストラクチャ」。LWN.net。
- ^ 「フローオフロードインフラストラクチャ」。LWN.net。
- ^ Jonathan Corbet (2013-08-20). 「nftables の復活」LWN.net . 2013-10-22閲覧。
- ^ Neira Ayuso、Pablo (2006 年 6 月 14 日)。「Netfilter の接続追跡システム」(PDF)。
- ^ 「IP セット」。ipset.netfilter.org 。2014 年 7 月 4 日閲覧。
- ^ Patrick McHardy (2013-08-07). 「netfilter: netfilter SYN プロキシを実装する」LWN.net . 2013-11-05閲覧。
- ^ "netfilter: add SYNPROXY core/target". kernel.org. 2013-08-27 . 2013-11-05閲覧。
- ^ "netfilter: IPv6 SYNPROXY ターゲットを追加". kernel.org. 2013-08-27 . 2013-11-05閲覧。
- ^ 「Netfilter ライブラリ (libnl-nf)」. infradead.org. 2013-04-02 . 2013-12-28閲覧。
- ^ 「14th Netfilter Workshop」. workshop.netfilter.org. 2018-09-26 . 2018-09-26閲覧。
外部リンク
- 公式サイト
- conntrack-tools ホームページ
- ipset ホームページ
- ulogdホームページ
- Netfilter ワークショップのウェブサイトのホーム
- 「Netfilter モジュールの作成」(電子書籍、2009 年)
- 「Netfilter と Iptables — Linux 用のステートフル ファイアウォール」(2001 年 10 月 11 日)
- Rami Rosenによるネットワーク概要
