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

パケット フィルタ nftables 1.0.0 のリリースが公開され、IPv4、IPv6、ARP、およびネットワーク ブリッジのパケット フィルタリング インターフェイスが統合されました (iptables、ip6table、a​​rptables、ebtables の置き換えを目的としています)。 nftables 1.0.0 リリースが機能するために必要な変更は、Linux 5.13 カーネルに含まれています。バージョン番号の大幅な変更は、基本的な変更とは関係ありませんが、0.9.9 進数表記の番号付けが一貫して継続された結果にすぎません (以前のリリースは XNUMX でした)。

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

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

主な革新:

  • 「*」マスク要素のサポートがセット リストに追加されました。これは、セット内で定義されている他の要素に該当しないパッケージに対してトリガーされます。テーブル x { マップ ブロックリスト { type ipv4_addr : 判定フラグ 間隔要素 = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * :drop } }chain y { type フィルタ フック プレルーティング優先順位 0;ポリシーを受け入れます。 ipsaddrvmap@blocklist } }
  • 「--define」オプションを使用してコマンドラインから変数を定義できます。 # cat test.nft table netdev x {chain y { type フィルターフック入力デバイス = $dev priority 0;政策の中止。 } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • マップ リストでは、定数 (ステートフル) 式の使用が許可されます。 table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : Jump ssh_input, * counter packets 0 bytes 0 :drop } }チェーン ssh_input { } チェーン wan_input { tcp dport vmap @portmap } チェーン プレルーティング { タイプ フィルター フック プレルーティング優先順位 raw;ポリシーを受け入れます。 iif vmap { "lo" : ジャンプ wan_input } } }
  • 特定のパケット ファミリのハンドラーのリストを表示する「listフック」コマンドを追加しました。 # nft list hooks ip device eth0 family ip {フック ingress { +0000000010chain netdev xy [nf_tables] +0000000300chain inet mw [nf_tables] }フック入力{ -0000000100 チェーン ip ab [nf_tables] +0000000300 チェーン inet mz [nf_tables] } フックフォワード { -0000000225 selinux_ipv4_forward 0000000000 チェーン ip ac [nf_tables] } フック出力 { -0000000225 selinux_ipv4_output }フック postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • キュー ブロックを使用すると、jhash、symhash、および numgen 式を組み合わせて、パケットをユーザー空間のキューに分散できます。 … symhash mod 65536 へのキュー … numgen inc mod 65536 へのキューフラグのバイパス … jhash oif へのキュー。 meta mark mod 32 "queue" をマップ リストと組み合わせて、任意のキーに基づいてユーザー空間内のキューを選択することもできます。 ... キュー フラグは oifname マップにバイパスします { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • セット リストを含む変数を複数のマップに拡張することができます。インターフェイスの定義 = { eth0, eth1 } table ip x {chain y { type フィルターフック入力優先順位 0;ポリシーを受け入れます。 iifname vmap { lo : accept, $interfaces :drop } } } # nft -f x.nft # nft list ruleset table ip x {chain y { type filter hook input priority 0;ポリシーを受け入れます。 iifname vmap { "lo" : 受け入れる、 "eth0" : ドロップ、 "eth1" : ドロップ } } }
  • # nft add rules xy tcp dport という間隔で vmap (判定マップ) を結合することが許可されます。 ipsaddr vmap { 1025-65535 . 192.168.10.2 : 受け入れる }
  • NAT マッピングの簡略化された構文。アドレス範囲を指定できます: ... snat to ip sawdr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } または明示的な IP アドレスとポート: ... dnat to ip sawdr map { 10.141.11.4 : 192.168.2.3 。 80 } または IP 範囲とポートの組み合わせ: ... dnat から ip sawdr 。 tcp dport マップ { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5。 8888-8999 }

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

コメントを追加します