nftables パケット フィルター 0.9.9 リリース

パケット フィルタ nftables 0.9.9 のリリースが公開され、IPv4、IPv6、ARP、およびネットワーク ブリッジのパケット フィルタリング インターフェイスが統合されました (iptables、ip6table、a​​rptables、ebtables の置き換えを目的としています)。 同時に、コンパニオン ライブラリ libnftnl 1.2.0 のリリースが公開され、nf_tables サブシステムと対話するための低レベル API が提供されました。 nftables 0.9.9 リリースが動作するために必要な変更は、Linux カーネル 5.13-rc1 に含まれています。

nftables パッケージには、ユーザー空間で実行されるパケット フィルター コンポーネントが含まれていますが、カーネル レベルの作業は、リリース 3.13 以降 Linux カーネルの一部となっている nf_tables サブシステムによって提供されます。 カーネル レベルは、パケットからのデータの抽出、データ操作の実行、およびフロー制御の基本機能を提供する、プロトコルに依存しない汎用インターフェイスのみを提供します。

フィルタリング ルールとプロトコル固有のハンドラはユーザー空間でバイトコードにコンパイルされ、その後、このバイトコードは Netlink インターフェイスを使用してカーネルにロードされ、BPF (Berkeley Packet Filters) を思わせる特別な仮想マシンのカーネルで実行されます。 このアプローチにより、カーネル レベルで実行されるフィルタリング コードのサイズを大幅に削減し、プロトコルを操作するための解析ルールとロジックのすべての機能をユーザー空間に移動できます。

主な革新:

  • フローテーブル処理をネットワーク アダプター側に移動する機能が実装され、「オフロード」フラグを使用して有効になります。 フローテーブルは、パケット リダイレクトのパスを最適化するメカニズムであり、すべてのルール処理チェーンの完全な通過が最初のパケットにのみ適用され、フロー内の他のすべてのパケットが直接転送されます。 table ip global { flowtable f { フック入力優先度フィルター + 1 デバイス = { lan3, lan0, ​​wan } flags offload }chain forward { type filter フック転送優先度フィルター; ポリシーを受け入れます。 ip プロトコル { tcp, udp } flow add @f }chain post { type nat フック ポストルーティング優先度フィルター; ポリシーを受け入れます。 oifname "wan" マスカレード } }
  • プロセスによるテーブルの排他的使用を保証するために、テーブルに所有者フラグをアタッチするためのサポートが追加されました。 プロセスが終了すると、それに関連付けられたテーブルは自動的に削除されます。 プロセスに関する情報は、コメントの形式でルール ダンプに表示されます。 table ip x { # progname nft flags owner chain y { type filter hook input priority filter; ポリシーを受け入れます。 カウンタパケット 1 バイト 309 } }
  • 複数の VLAN タグを単一のイーサネット フレームに置き換える手段を定義する IEEE 802.1ad 仕様 (VLAN スタッキングまたは QinQ) のサポートが追加されました。 たとえば、外部イーサネット フレーム 8021ad と vlan id=342 のタイプを確認するには、... ether type 802.1ad vlan id 342 という構文を使用して、イーサネット フレーム 8021ad/vlan id=1、ネストされた 802.1 の外部タイプを確認します。 q/vlan id=2 およびさらなる IP パケットのカプセル化: ... ether type 8021ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
  • 統合階層 cgroups v2 を使用したリソース管理のサポートが追加されました。 cgroups v2 と v1 の主な違いは、CPU リソースの割り当て、メモリ消費の調整、および I/O に個別の階層を使用するのではなく、すべての種類のリソースに共通の cgroups 階層を使用することです。 たとえば、最初のレベル cgroupv2 のソケットの祖先が「system.slice」マスクと一致するかどうかを確認するには、次の構造を使用できます。 ...ソケット cgroupv2 レベル 1 「system.slice」
  • SCTP パケットのコンポーネントをチェックする機能が追加されました (これに必要な機能は Linux カーネル 5.14 で提供される予定です)。 たとえば、パケットにタイプ「data」およびフィールド「type」のチャンクが含まれているかどうかを確認するには、次のようにします。 ... sctp チャンク データが存在します ... sctp チャンク データ タイプ 0
  • 「-f」フラグを使用すると、ルールのロード操作の実行が約 XNUMX 倍高速化されました。 ルールのリストの出力も高速化されました。
  • フラグ ビットが設定されているかどうかを確認するためのコンパクトな形式が提供されています。 たとえば、snat および dnat ステータス ビットが設定されていないことを確認するには、次のように指定できます。 ... ct status ! snat,dnat syn ビットがビットマスクに設定されていることを確認します syn,ack: ... tcp flags syn / syn,ack fin ビットと rst ビットがビットマスク syn,ack,fin,rst に設定されていないことを確認します。 ... tcp フラグ ! = fin,rst / syn,ack,fin,rst
  • set/map typeof 定義で「verdict」キーワードを許可します: add map xm { typeof iifname 。 IPプロトコル番目のポート: 判定 ;}

出所: オープンネット.ru

コメントを追加します