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月、ハラルド・ウェルテがコアチームの議長に就任した。2004年4月、 GPLに準拠せずにルーターに組み込まれたプロジェクト用ソフトウェアを配布する者に対するプロジェクトによる取り締まりを受け、ドイツの裁判所はGPLの条項に従うことを拒否したSitecom Germany社に対し、ウェルテに歴史的な差止命令を下した( GPL関連の紛争を参照)。2007年9月、過去数年間開発を率いてきたパトリック・マクハーディがコアチームの新議長に選出された。
iptables が登場する以前は、Linux ファイアウォールを作成するための主要なソフトウェア パッケージは、Linux カーネル 2.2.x のipchainsとLinux カーネル 2.0.x のipfwadmでした[ 3 ] 。ipfwadm は、 BSDのipfwをベースにしていました。Linux カーネルには Netfilter が導入されるまで一般的なパケット制御フレームワークがなかったため、ipchains と ipfwadm はどちらもネットワーク コードを変更してパケットを操作できるようにしていました。
ipchainsとipfwadmはパケットフィルタリングとNAT(特にマスカレード、ポートフォワーディング、リダイレクトという3種類のNAT)を組み合わせているのに対し、Netfilterはパケット操作を複数の部分に分割しており、以下に説明します。各部分は異なるポイントでNetfilterフックに接続し、パケットにアクセスします。接続追跡およびNATサブシステムは、ipchainsとipfwadmの基本的なバージョンよりも汎用的で強力です。
2017年にIPv4およびIPv6フローオフロードインフラストラクチャが追加され、ソフトウェアフローテーブル転送の高速化とハードウェアオフロードのサポートが可能になりました。[ 4 ] [ 5 ]

ip_tables、、ip6_tables(arp_tablesアンダースコアは名前の一部です)、およびという名前のカーネルモジュールは、 ebtablesNetfilterフックシステムの従来のパケットフィルタリング部分を構成します。これらは、パケットをフィルタリングまたは変換できるファイアウォールルールを定義するためのテーブルベースのシステムを提供します。テーブルは、ユーザー空間ツール、、、およびを介して管理できます。iptablesカーネルモジュールとユーザー空間ユーティリティはどちらも似たような名前ですが、それぞれ異なる機能を持つ別のエンティティであることに注意してください。ip6tablesarptablesebtables
各テーブルはそれぞれ独立したフックであり、それぞれ特定の目的のために導入されています。Netfilterにおいては、特定のテーブルは他のテーブルに対して特定の順序で実行されます。どのテーブルも自身を呼び出すことができ、独自のルールを実行することもできるため、追加処理や反復処理が可能になります。
ルールはチェーン、つまり「ルールのチェーン」に整理されます。これらのチェーンには、、、などの定義済みのタイトルが付けられますINPUT。OUTPUTこれらFORWARDのチェーンのタイトルは、Netfilterスタック内での発生源を説明するのに役立ちます。たとえば、パケットの受信はに属し、はPREROUTINGローカルINPUTで配信されるデータを表し、転送されるトラフィックはに属しますFORWARD。ローカルで生成された出力はチェーンを通過しOUTPUT、送信されるパケットはPOSTROUTINGチェーンに属します。
テーブルに整理されていないNetfilterモジュール(下記参照)は、オリジンをチェックして動作モードを選択することができます。
iptable_rawモジュールiptable_mangleモジュールiptable_natモジュールiptable_filterモジュールsecurity_filterモジュールSECMARK。CONNSECMARK(これらのいわゆる「ターゲット」は、Security-Enhanced Linux マーカーを指します。) 強制アクセス制御は、SELinux などの Linux セキュリティ モジュールによって実装されます。セキュリティ テーブルは、フィルタ テーブルが呼び出された後に呼び出され、フィルタ テーブル内の任意アクセス制御 (DAC) ルールが MAC ルールよりも先に有効になります。このテーブルには、次の組み込みチェーンがあります。INPUT(コンピュータ自体に入ってくるパケット用)、OUTPUT(ルーティング前にローカルで生成されたパケットを変更するため)、FORWARD(コンピュータを経由してルーティングされるパケットを変更するため)。nftables は Netfilter の新しいパケットフィルタリング部分です。は、、、nftを置き換える新しいユーザー空間ユーティリティです。iptablesip6tablesarptablesebtables
nftablesカーネルエンジンは、Linuxカーネルにシンプルな仮想マシンを追加します。この仮想マシンは、バイトコードを実行してネットワークパケットを検査し、そのパケットをどのように処理するかを決定できます。この仮想マシンによって実装される操作は、意図的に基本的なものになっています。パケット自体からデータを取得したり、関連するメタデータ(たとえば、受信インターフェース)を確認したり、接続追跡データを管理したりできます。算術演算子、ビット演算子、比較演算子を使用して、そのデータに基づいて決定を行うことができます。また、仮想マシンはデータセット(通常はIPアドレス)を操作することもでき、複数の比較操作を単一のセット検索に置き換えることができます。[ 6 ]
これは、プロトコル認識がコードに深く組み込まれているため、ファイアウォール エンジンが汎用的に使用するにはプロトコルに特化しすぎているためIPv4、IPv6、ARP、イーサネット ブリッジング用に4 回複製する必要があった従来の Xtables (iptables など)コードとは対照的です。 [ 6 ]主な利点は、Linux カーネルABIの簡素化、コードの重複の削減、エラー報告の改善、フィルタリング ルールの実行、保存、および増分的な原子的な変更の効率化です。iptables
このnf_defrag_ipv4モジュールは、IPv4パケットがNetfilterの接続追跡モジュールに到達する前にデフラグします。これは、カーネル内の接続追跡モジュールとNATヘルパーモジュール(「ミニALGnf_conntrack_ipv4 」の一種)にとって必要不可欠です。これらのモジュールは、パケット全体に対してのみ確実に動作し、断片に対しては必ずしも動作しません。
IPv6デフラグメンターは独立したモジュールではなく、nf_conntrack_ipv6モジュールに統合されています。
Netfilterフレームワークの上に構築された重要な機能の1つは、接続追跡です。[ 7 ]接続追跡により、カーネルはすべての論理ネットワーク接続またはセッションを追跡し、それによってその接続を構成する可能性のあるすべてのパケットを関連付けることができます。NATはこの情報に依存して、関連するすべてのパケットを同じ方法で変換し、iptablesこの情報を使用してステートフルファイアウォールとして機能します。
ただし、接続状態は、TCPやSCTPの状態など、上位レベルの状態とは完全に独立しています。その理由の一つは、パケットを単に転送する場合(つまり、ローカル配信を行わない場合)、TCPエンジンが必ずしも呼び出されるとは限らないからです。UDP 、IPsec(AH/ESP)、GREなどのコネクションレスモードの伝送でも、少なくとも擬似的な接続状態が存在します。このようなプロトコルのヒューリスティックは、多くの場合、非アクティブ状態に対する事前設定されたタイムアウト値に基づいており、そのタイムアウト値が経過するとNetfilter接続は切断されます。
Netfilter接続はそれぞれ、(レイヤ3プロトコル、送信元アドレス、宛先アドレス、レイヤ4プロトコル、レイヤ4キー)のタプルによって一意に識別されます。レイヤ4キーはトランスポートプロトコルによって異なり、TCP/UDPの場合はポート番号、トンネルの場合はトンネルID、それ以外の場合はタプルに含まれないかのようにゼロになります。TCPポートを常に検査できるようにするため、パケットは必ずデフラグされます。
Netfilterの接続は、ユーザー空間ツールを使用して操作できますconntrack。
iptables接続の状態やステータスなどの情報を確認することで、パケットフィルタリングルールをより強力かつ管理しやすくすることができます。最も一般的な状態は次のとおりです。
NEWESTABLISHEDRELATEDnf_conntrack_ftp検出したときに、これらの予期を設定します。PASVINVALIDUNTRACKED一般的な例としては、conntrackサブシステムが最初に検出したパケットは「新規」と分類され、応答は「確立済み」と分類され、ICMPエラーは「関連」と分類されます。既知の接続と一致しないICMPエラーパケットは「無効」と分類されます。
プラグインモジュールを使用することで、接続追跡機能はアプリケーション層プロトコルに関する知識を得ることができ、2つ以上の異なる接続が「関連している」ことを認識できます。たとえば、FTPプロトコルを考えてみましょう。制御接続は確立されますが、データが転送されるたびに、それを転送するための別の接続が確立されます。nf_conntrack_ftpモジュールがロードされると、FTPデータ接続の最初のパケットは、既存の接続の論理的な一部であるため、「新規」ではなく「関連」として分類されます。
ヘルパーは一度に1つのパケットしか検査しないため、IPフラグメンテーションまたはTCPセグメンテーションによって接続追跡に必要な情報が2つのパケットに分割されている場合、ヘルパーは必ずしもパターンを認識できず、処理を実行しません。IPフラグメンテーションはデフラグメンテーションを必要とする接続追跡サブシステムで処理されますが、TCPセグメンテーションは処理されません。FTPの場合、セグメンテーションは標準セグメントサイズのようにコマンドの「近く」で発生するとはみなされないPASVため、Netfilterでも処理されません。
各接続には、元のIPアドレスと応答アドレスのセットがあり、これらは最初は同じです。NetfilterにおけるNATは、応答アドレスと必要に応じてポートを変更するだけで実現されます。パケットが受信されると、その接続タプルも応答アドレスのペア(およびポート)と比較されます。フラグメント化されていないこともNATの要件です。(必要に応じて、IPv4パケットは通常のNetfilter以外のIPv4スタックによって再フラグメント化される場合があります。)
接続追跡ヘルパーと同様に、NATヘルパーはパケット検査を行い、ペイロード内の元のアドレスを応答アドレスに置き換えます。
Netfilterプロジェクトは、Netfilterコードを直接利用するカーネルモジュールではないものの、他にも注目すべきソフトウェアをいくつか提供しています。
conntrack-toolsは、システム管理者が接続追跡エントリとテーブルと対話できるようにする、Linux 用のユーザー空間ツールのセットです。このパッケージには、conntrackdデーモンとコマンドラインインターフェイスが含まれていますconntrack。ユーザー空間デーモンをconntrackd使用すると、高可用性クラスタベースのステートフルファイアウォールを有効にし、ステートフルファイアウォールの使用状況の統計を収集できます。コマンドラインインターフェイスは、conntrack廃止されたよりも接続追跡システムへのより柔軟なインターフェイスを提供します/proc/net/nf_conntrack。
Connection Tracking などの他の拡張機能とは異なり、ipset[ 8 ]iptablesはコア Netfilter コードよりもに関連しています。ipsetたとえば Netfilter フックは使用せず、実際にはiptablesIP セットを照合して最小限の変更 (設定/クリア) を行うモジュールを提供します。
と呼ばれるユーザー空間ツールはipset、Linuxカーネル内のいわゆる「IPセット」の設定、維持、および検査に使用されます。IPセットは通常、IPアドレスのセットを含みますが、その「タイプ」によっては、他のネットワーク番号のセットを含むこともあります。これらのセットは、単純なルールよりもはるかに検索効率が高いですが、当然ながらメモリ使用量が大きくなる可能性があります。ユーザーが最適なソリューションを選択できるように、iptablesさまざまなストレージアルゴリズム(メモリ内のデータ構造用)が提供されています。ipset
あるセット内の任意のエントリは、別のセットに紐付けることができ、高度なマッチング操作が可能になります。セットは、iptablesそれを参照するルールや他のセットが存在しない場合にのみ削除(破棄)できます。
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_queuelibnfnetlinklibnetfilter_conntracklibnfnetlinklibnetfilter_loglibnfnetlinklibnl-3-netfilterlibnlプロジェクトの一部[ 12 ]libiptcnetlinkライブラリに基づいておらず、そのAPIはiptablesユーティリティによって内部的に使用されます。libipsetlibmnl。Netfilterプロジェクトは、進行中の研究開発活動について議論するために、開発者向けの年次会議を開催しています。2018年のNetfilterワークショップは、2018年6月にドイツのベルリンで開催されました。[ 13 ]