Netfilter

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
Netfilter
安定リリース
5.16.12 [1] ウィキデータでこれを編集する / 2022年3月2日; 0日前 (2022年3月2日
プレビューリリース
5.17-rc5 [2] ウィキデータでこれを編集する / 2022年2月20日; 10日前 (2022年2月20日
で書かれているC
オペレーティング・システムLinux
タイプ
ライセンスGNU GPL
Webサイトnetfilter .org

Netfilterは、 Linuxカーネルによって提供されるフレームワークであり、さまざまなネットワーク関連の操作をカスタマイズされたハンドラーの形式で実装できます。Netfilterは、パケットフィルタリングネットワークアドレス変換、およびポート変換のためのさまざまな機能と操作を提供します。これらは、ネットワークを介してパケットを送信し、ネットワーク内の機密性の高い場所にパケットが到達するのを防ぐために必要な機能を提供します

Netfilterは、Linuxカーネル内のフックのセットを表し、特定のカーネルモジュールがカーネルのネットワークスタックにコールバック関数を登録できるようにします。これらの機能は、通常、フィルタリングおよび変更ルールの形式でトラフィックに適用され、ネットワークスタック内のそれぞれのフックを通過するすべてのパケットに対して呼び出されます。[3]

歴史

異なるNetfilterコンポーネント(の一部)の関係

RustyRussellは1998年にnetfilter / iptablesプロジェクトを開始しました。彼はまた、プロジェクトの前身であるipchainsを作成しました。プロジェクトが成長するにつれて、彼は1999年にNetfilter Core Team(または単にcoreteam)を設立しました。彼らが作成したソフトウェア(以下、 netfilterと呼びます)はGNU General Public License(GPL)ライセンスを使用し、2000年3月にバージョン2.4に統合されました。Linuxカーネルメインラインのx

2003年8月、ハラルド・ウェルテがコアチームの会長に就任しました。2004年4月、GPLに準拠せずにルーター組み込まれたプロジェクトのソフトウェアを配布するプロジェクトによる取り締まりに続き、ドイツの裁判所は、GPLの条件に従うことを拒否したSitecomGermanyに対する歴史的な差し止め命令をWelteに認めました(GPL-参照)。関連する紛争)。2007年9月、過去数年間開発を主導してきたPatrick McHardyが、コアチームの新しい会長に選出されました。

iptables以前は、Linuxファイアウォールを作成するための主なソフトウェアパッケージは、Linuxカーネル2.2.xのipchainsとLinuxカーネル2.0.xのipfwadmでした。これは、 BSDipfwに基づいていましたLinuxカーネルにはNetfilterが導入されるまで一般的なパケット制御フレームワークがなかったため、ipchainsとipfwadmはどちらもネットワークコードを変更してパケットを操作できるようにします。

ipchainsとipfwadmはパケットフィルタリングとNAT(特に、マスカレードポートフォワーディングリダイレクションと呼ばれる3つの特定の種類のNAT )を組み合わせますが、Netfilterはパケット操作を複数の部分に分割します(以下で説明します)。それぞれが異なるポイントでNetfilterフックに接続して、パケットにアクセスします。接続追跡およびNATサブシステムは、ipchainsおよびipfwadm内の基本バージョンよりも一般的で強力です。

2017年に、 IPv4およびIPv6フローオフロードインフラストラクチャが追加され、ソフトウェアフローテーブル転送とハードウェアオフロードサポートの高速化が可能になりました。[4] [5]

ユーザースペースユーティリティプログラム

従来のiptablesパケットフィルタリングを使用したNetfilterを介したネットワークパケットのフロー

iptables

、、という名前ip_tablesカーネルモジュール(アンダースコアは名前の一部です)は、Netfilterフックシステムのレガシーパケットフィルタリング部分を構成します。これらは、パケットをフィルタリングまたは変換できるファイアウォールルールを定義するためのテーブルベースのシステムを提供します。テーブルは、ユーザースペースツール、、、、およびを介して管理できますカーネルモジュールとユーザースペースユーティリティはどちらも同じような名前ですが、それぞれが異なる機能を持つ異なるエンティティであることに注意してください。 ip6_tablesarp_tablesebtablesiptablesip6tablesarptablesebtables

各テーブルは実際には独自のフックであり、各テーブルは特定の目的を果たすために導入されました。Netfilterに関する限り、他のテーブルに対して特定の順序で特定のテーブルを実行します。どのテーブルもそれ自体を呼び出すことができ、独自のルールを実行することもできます。これにより、追加の処理と反復が可能になります。

ルールはチェーン、つまり「ルールのチェーン」に編成されます。これらのチェーンには、、、などの事前定義されたタイトルが付けられてINPUTますこれらのチェーンタイトルは、Netfilterスタックの起源を説明するのに役立ちます。たとえば、パケット受信はに分類されはローカルに配信されたデータを表し、転送されたトラフィックはチェーンに分類されます。ローカルで生成された出力はチェーンを通過し、送信されるパケットはチェーン内にありますOUTPUTFORWARDPREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

テーブルに編成されていないNetfilterモジュール(以下を参照)は、オリジンをチェックして動作モードを選択することができます。

iptable_rawモジュール
ロードされると、他のNetfilterフックの前に呼び出されるフックを登録します。これは、接続追跡などのメモリを必要とする操作に到達する前にパケットをフィルタリングするために使用できるrawと呼ばれるテーブルを提供します。
iptable_mangleモジュール
接続追跡(以下を参照)の後で(ただし、他のテーブルの前に)実行するフックとマングルのテーブルを登録して、パケットに変更を加えることができるようにします。これにより、NATや追加のフィルタリングなど、後続のルールによる追加の変更が可能になります。
iptable_natモジュール
2つのフックを登録します。宛先ネットワークアドレス変換ベースの変換( "DNAT")はフィルターフックの前に適用され、送信元ネットワークアドレス変換ベースの変換( "SNAT")は後で適用されます。iptablesで利用できるネットワークアドレス変換テーブル(または「nat」)は、NATマッピング専用の「構成データベース」であり、いかなる種類のフィルタリングも目的としていません。
iptable_filterモジュール
汎用フィルタリング(防火壁)に使用されるフィルターテーブルを登録します。
security_filterモジュール
SECMARKおよびCONNSECMARKターゲットによって有効化されるルールなど、強制アクセス制御(MAC)ネットワークルールに使用されます。(これらのいわゆる「ターゲット」とは、Security-Enhanced Linuxマーカーを指します。)強制アクセス制御は、SELinuxなどのLinuxセキュリティモジュールによって実装されます。セキュリティテーブルは、フィルタテーブルの呼び出しに続いて呼び出され、フィルタテーブル内の随意アクセス制御(DAC)ルールがMACルールの前に有効になるようにします。この表は、次の組み込みチェーンを提供します:(INPUTコンピューター自体に着信するパケット用)、OUTPUT(ルーティング前にローカルで生成されたパケットを変更するため)、およびFORWARD(コンピューターを介してルーティングされるパケットを変更するため)。

nftables

nftablesは、Netfilterの新しいパケットフィルタリング部分です。、、、およびnft置き換える新しいユーザースペースユーティリティですiptablesip6tablesarptablesebtables

nftablesカーネルエンジンは、Linuxカーネルに単純な仮想マシンを追加します。これにより、バイトコードを実行してネットワークパケットを検査し、そのパケットの処理方法を決定できます。この仮想マシンによって実装される操作は、意図的に基本化されています。パケット自体からデータを取得し、関連するメタデータ(たとえば、インバウンドインターフェイス)を確認し、接続追跡データを管理できます。算術演算子、ビット演算子、および比較演算子を使用して、そのデータに基づいて決定を下すことができます。仮想マシンは、データのセット(通常はIPアドレス)を操作することもでき、複数の比較操作を単一のセットルックアップに置き換えることができます。[6]

これは、プロトコル認識がコードに深く組み込まれているため、ファイアウォールとして4回複製する必要がある従来のXtables(iptablesなど)コードとは対照的です。エンジンはプロトコル固有であるため、一般的な方法で使用することはできません。[6]に対する主な利点iptablesは、LinuxカーネルABIの簡素化、コードの重複の削減、エラーレポートの改善、およびフィルタリングルールの より効率的な実行、ストレージ、および段階的なアトミックな変更です。

パケットの最適化

モジュールは、 IPv4パケットがNetfilterの接続追跡(モジュール)nf_defrag_ipv4に到達する前にデフラグします。nf_conntrack_ipv4これは、必ずしもフラグメントではなく、パケット全体でのみ確実に 機能するカーネル内接続追跡およびNATヘルパーモジュール(「ミニALG 」の形式)に必要です。

IPv6デフラグツールは、それ自体がモジュールではありませんが、モジュールに統合されていnf_conntrack_ipv6ます。

接続追跡

Netfilterフレームワークの上に構築された重要な機能の1つは、接続の追跡です。[7]接続追跡により、カーネルはすべての論理ネットワーク接続またはセッションを追跡し、それによってその接続を構成する可能性のあるすべてのパケットを関連付けることができます。NATはこの情報に依存して、関連するすべてのパケットを同じ方法で変換し、iptablesこの情報を使用してステートフルファイアウォールとして機能できます。

ただし、接続状態は、TCPやSCTPの状態などの上位レベルの状態から完全に独立しています。この理由の一部は、単にパケットを転送する場合、つまりローカル配信がない場合、TCPエンジンが必ずしも呼び出されない可能性があるためです。UDPIPsec(AH / ESP)、GRE、その他のトンネリングプロトコルなどのコネクションレスモードの伝送でさえ、少なくとも疑似接続状態になっています。このようなプロトコルのヒューリスティックは、多くの場合、非アクティブの事前設定されたタイムアウト値に基づいており、その有効期限が切れると、Netfilter接続がドロップされます。

各Netfilter接続は、(レイヤー3プロトコル、送信元アドレス、宛先アドレス、レイヤー4プロトコル、レイヤー4キー)タプルによって一意に識別されます。レイヤー4キーは、トランスポートプロトコルによって異なります。TCP / UDPの場合はポート番号、トンネルの場合はトンネルIDにすることができますが、それ以外の場合は、タプルの一部ではないかのようにゼロになります。すべての場合にTCPポートを検査できるようにするために、パケットは強制的に最適化されます。

Netfilter接続は、ユーザースペースツールを使用して操作できますconntrack

iptables状態やステータスなどの接続情報のチェックを利用して、パケットフィルタリングルールをより強力で管理しやすくすることができます。最も一般的な状態は次のとおりです。

NEW
新しい接続を作成しようとしています
ESTABLISHED
既存の接続の一部
RELATED
新しい接続を開始し、「予期された」パケットに割り当てられます。前述のミニALGは、たとえば、nf_conntrack_ftpモジュールがFTP " PASV"コマンドを検出した場合に、これらの期待値を設定します。
INVALID
パケットが無効であることが判明しました。たとえば、 TCP状態に準拠していません。
UNTRACKED
管理者が特定のパケットの接続追跡をバイパスするために割り当てることができる特別な状態(上記のrawテーブルを参照)。

通常の例では、conntrackサブシステムが最初に確認するパケットは「新規」に分類され、応答は「確立済み」に分類され、ICMPエラーは「関連」に分類されます。既知の接続と一致しなかったICMPエラーパケットは「無効」になります。

接続追跡ヘルパー

プラグインモジュールを使用することで、接続追跡にアプリケーション層プロトコルの知識を与えることができ、2つ以上の異なる接続が「関連している」ことを理解できます。たとえば、FTPプロトコルについて考えてみます。制御接続が確立されますが、データが転送されるたびに、データを転送するために別の接続が確立されます。モジュールがロードされるnf_conntrack_ftpと、FTPデータ接続の最初のパケットは、論理的には既存の接続の一部であるため、「新規」ではなく「関連」として分類されます。

ヘルパーは一度に1つのパケットしか検査しないため、 IPフラグメンテーションまたはTCPセグメンテーションのいずれかが原因で接続追跡の重要な情報が2つのパケットに分割された場合、ヘルパーは必ずしもパターンを認識せず、したがってその操作を実行しません。IPフラグメンテーションは、TCPセグメンテーションは処理されませんが、最適化を必要とする接続追跡サブシステムで処理されます。PASVFTPの場合、セグメンテーションは標準のセグメントサイズの ようにコマンドの「近く」で発生しないと見なされるため、Netfilterでも処理されません。

ネットワークアドレス変換

各接続には、元のアドレス応答アドレスのセットがあり、最初は同じものから始まります。NetfilterのNATは、応答アドレスと、必要に応じてポートを変更するだけで実装されます。パケットが受信されると、それらの接続タプルも応答アドレスペア(およびポート)と比較されます。フラグメントフリーであることもNATの要件です。(必要に応じて、IPv4パケットは、通常の非NetfilterのIPv4スタックによって再断片化される場合があります。)

NATヘルパー

接続追跡ヘルパーと同様に、NATヘルパーはパケットインスペクションを実行し、ペイロード内の応答アドレスで元のアドレスを置き換えます。

その他のNetfilterプロジェクト

Netfilterコードを直接利用するカーネルモジュールではありませんが、Netfilterプロジェクトはさらにいくつかの注目すべきソフトウェアをホストしています。

conntrack-tools

conntrack-toolsは、システム管理者が接続追跡エントリおよびテーブルを操作できるようにするLinux用のユーザースペースツールのセットです。パッケージには、conntrackdデーモンとコマンドラインインターフェイスが含まれていますconntrackユーザースペースデーモンconntrackdを使用して、高可用性クラスターベースのステートフルファイアウォールを有効にし、ステートフルファイアウォールの使用に関する統計を収集できます。コマンドラインインターフェイスconntrackは、廃止されたものよりも柔軟なインターフェイスを接続追跡システムに提供します/proc/net/nf_conntrack

ipset

Connection Trackingなどの他の拡張機能とは異なり、ipset[8]iptablesはコアNetfilterコードよりも関連性があります。ipsetたとえば、Netfilterフックを使用しませんが、実際には、iptablesIPセットに一致して最小限の変更(セット/クリア)を行うためのモジュールを提供します。

と呼ばれるユーザースペースツールipsetは、Linuxカーネルでいわゆる「IPセット」をセットアップ、保守、および検査するために使用されます。IPセットには通常、IPアドレスのセットが含まれますが、その「タイプ」によっては、他のネットワーク番号のセットを含めることもできます。これらのセットは、ベアルールよりもルックアップ効率がはるかに高くなりますiptablesが、もちろん、メモリフットプリントが大きくなる可能性があります。ipsetユーザーが最適なソリューションを選択できるように、 さまざまなストレージアルゴリズム(メモリ内のデータ構造用)が用意されています。

あるセットの任意のエントリを別のセットにバインドできるため、高度なマッチング操作が可能になります。iptablesセットを参照するルールまたは他のセット がない場合にのみ、セットを削除(破棄)できます。

SYNプロキシ

SYNPROXYtargetを使用すると、このような場合に接続追跡によって課せられる大きなパフォーマンスの低下なしに、大規模なSYNフラッドの処理が可能になります。初期SYN要求をSYNPROXYターゲットにリダイレクトすることにより、接続は検証済みの最終状態に達するまで接続追跡に登録されず、接続追跡ACKが無効になる可能性のある多数の接続のアカウンティングから解放されます。このようにして、大規模なSYN洪水を効果的に処理することができます。[9]

2013年11月3日、SYNプロキシ機能がNetfilterに統合され、Linuxカーネルメインラインのバージョン3.12がリリースされました。[10] [11]

ulogd

ulogdNetfilterサブシステムからパケットとイベント通知を受信して​​ログに記録するためのユーザースペースデーモンです。ip_tablesは、ユーザースペースキューイングメカニズムを介してパケットを配信でき、接続トラッキングは、ulogdパケットまたはイベント(接続の切断、NATセットアップなど)に関する詳細情報を交換するために対話できます。

ユーザースペースライブラリ

Netfilterはlibnetfilter、ユーザースペースからさまざまなタスクを実行するために使用できる、名前のプレフィックスとして持つライブラリーのセットも提供します。これらのライブラリはGNUGPLバージョン2でリリースされています。具体的には、次のとおりです。

libnetfilter_queue
iptablesと組み合わせてユーザースペースパケットキューイングを実行できます。に基づくlibnfnetlink
libnetfilter_conntrack
ユーザースペースからの接続追跡エントリの操作を許可します。に基づくlibnfnetlink
libnetfilter_log
iptablesによって生成されたログメッセージの収集を許可します。に基づくlibnfnetlink
libnl-3-netfilter
キュー、接続追跡、およびログの操作を許可します。libnlプロジェクトの一部[12]
libiptc
iptablesファイアウォールルールセットに変更を加えることができます。ライブラリに基づいておらずnetlink、そのAPIiptablesユーティリティによって内部的に使用されます
libipset
IPセットでの操作を許可します。に基づくlibmnl

Netfilterワークショップ

Netfilterプロジェクトは、開発者向けの年次会議を開催します。この会議は、進行中の研究開発の取り組みについて話し合うために使用されます。2018 Netfilterワークショップは、2018年6月にドイツのベルリンで開催されました。[13]

も参照してください

参考文献

  1. ^ 「Linux5.16.12」2022年3月2日2022年3月3日取得
  2. ^ 「Linux5.17-rc5」2022年2月20日。
  3. ^ 「netfilter / iptablesプロジェクトのホームページ-netfilter.orgプロジェクト」netfilter.org 2014年7月4日取得
  4. ^ 「フローオフロードインフラストラクチャ」LWN.net
  5. ^ 「フローオフロードインフラストラクチャ」LWN.net
  6. ^ a b Jonathan Corbet(2013-08-20)。「nftablesのリターン」LWN.net 2013年10月22日取得
  7. ^ Neira Ayuso、Pablo(2006年6月14日)。「Netfilterの接続追跡システム」(PDF)
  8. ^ 「IPセット」ipset.netfilter.org 2014年7月4日取得
  9. ^ Patrick McHardy(2013-08-07)。「netfilter:netfilterSYNプロキシを実装する」LWN.net 2013年11月5日取得
  10. ^ "netfilter:SYNPROXYコア/ターゲットを追加"kernel.org。2013-08-27 2013年11月5日取得
  11. ^ 「netfilter:IPv6SYNPROXYターゲットを追加」kernel.org。2013-08-27 2013年11月5日取得
  12. ^ 「Netfilterライブラリ(libnl-nf)」infradead.org。2013-04-02 2013年12月28日取得
  13. ^ 「第14回Netfilterワークショップ」Workshop.netfilter.org。2018-09-26 2018年9月26日取得

外部リンク