カーネル レベルは、パケットからのデータの抽出、データ操作の実行、およびフロー制御の基本機能を提供する、プロトコルに依存しない汎用インターフェイスのみを提供します。 フィルタリング ルールとプロトコル固有のハンドラはユーザー空間でバイトコードにコンパイルされ、その後、このバイトコードは Netlink インターフェイスを使用してカーネルにロードされ、BPF (Berkeley Packet Filters) を思わせる特別な仮想マシンのカーネルで実行されます。 このアプローチにより、カーネル レベルで実行されるフィルタリング コードのサイズを大幅に削減し、プロトコルを操作するための解析ルールとロジックのすべての機能をユーザー空間に移動できます。
主な革新:
- 接続における範囲のサポート (連結、比較を簡素化するアドレスとポートの特定のバンドル)。 たとえば、要素が添付ファイルであるセット「ホワイトリスト」の場合、「間隔」フラグを指定すると、セットに添付ファイルに範囲を含めることができることが示されます(添付ファイル「ipv4_addr . ipv4_addr . inet_service」の場合、以前は正確なリストをリストすることが可能でした) 「192.168.10.35. 192.68.11.123」という形式の一致があり、アドレスのグループ「80-192.168.10.35-192.168.10.40」)を指定できるようになりました。
テーブル IP foo {
ホワイトリストを設定 {
ipv4_addr と入力します。 ipv4_addr. inet_service
フラグ間隔
要素 = { 192.168.10.35-192.168.10.40 。 192.68.11.123-192.168.11.125。 80}
}チェーンバー{
タイプ フィルタ フック プレルーティング優先度フィルタ。 政策の中止。
イプ・サドル。 ipパパ。 tcp dport @whitelist を受け入れる
}
} - セットおよびマップ リストでは、照合時の要素の形式を決定する「typeof」ディレクティブを使用できます。
たとえば、次のようにテーブル IP foo {
ホワイトリストを設定 {
IPサドルのタイプ
要素 = { 192.168.10.35、192.168.10.101、192.168.10.135 }
}チェーンバー{
タイプ フィルタ フック プレルーティング優先度フィルタ。 政策の中止。
IP パパ @whitelist を受け入れます
}
}テーブル IP foo {
マップアドレス2マーク {
typeof ip saddr : メタマーク
要素 = { 192.168.10.35 : 0x00000001、192.168.10.135 : 0x00000002 }
}
} - NAT バインディングで結合を使用する機能が追加されました。これにより、マップ リストまたは名前付きセットに基づいて NAT 変換を定義するときにアドレスとポートを指定できるようになります。
nft ルール ip nat pre dnat ip addr を追加します。 ポートから IP saddr へのマップ { 1.1.1.1 : 2.2.2.2 。 30 }
nft add map ip nat destinations {type ipv4_addr . inet_service: ipv4_addr。 inet_service \\; }
nft ルール ip nat pre dnat ip addr を追加します。 IPサドルへのポート。 tcp dport マップ @destinations - ネットワーク カードによって実行されるいくつかのフィルタリング操作によるハードウェア アクセラレーションのサポート。 アクセラレーションは ethtool ユーティリティ (「ethtool -K eth0 hw-tc-offload on」) によって有効になり、その後「offload」フラグを使用してメイン チェーンの nftables でアクティブ化されます。 Linux カーネル 5.6 を使用する場合、ハードウェア アクセラレーションは、パケットの受信、破棄、複製 (dup)、および転送 (fwd) と組み合わせて、ヘッダー フィールドのマッチングと受信インターフェイスの検査に対してサポートされます。 以下の例では、アドレス 192.168.30.20 からのパケットをドロップする操作が、パケットをカーネルに渡さずにネットワーク カード レベルで実行されます。
# 猫ファイル.nft
テーブル netdev x {
チェーン y {
タイプ フィルター フック入力デバイス eth0 優先度 10; フラグをオフロードします。
IPサドル192.168.30.20ドロップ
}
}
# nft -f ファイル.nft - ルール内のエラーの場所に関する情報が改善されました。
# nft 削除ルール ip yz ハンドル 7
エラー: ルールを処理できませんでした: そのようなファイルまたはディレクトリはありません
ルール IP yz ハンドル 7 を削除します
^# nft 削除ルール ip xx ハンドル 7
エラー: ルールを処理できませんでした: そのようなファイルまたはディレクトリはありません
ルール IP xx ハンドル 7 を削除します
^# nftテーブルtwst削除
エラー: そのようなファイルまたはディレクトリはありません。 ファミリ IP のテーブル「テスト」のことですか?
ツイステテーブル削除
^^^^最初の例は、テーブル「y」がシステムにないこと、7 番目の例は「XNUMX」ハンドラーが欠落していること、XNUMX 番目の例はテーブル名の入力時にタイプミス プロンプトが表示されることを示しています。
- 「meta sdif」または「meta sdifname」を指定してスレーブ インターフェイスをチェックするためのサポートが追加されました。
...メタ sdifname vrf1 ...
- 右または左シフト操作のサポートが追加されました。 たとえば、既存のパケット ラベルを 1 ビット左にシフトし、マイナー ビットを 1 に設定するには、次のようにします。
… メタ マーク セット メタ マーク lshift 1 または 0x1 …
- 拡張バージョン情報を表示する「-V」オプションを実装しました。
# nft -V
nftables v0.9.4 (ジャイブ アット ファイブ)
cli:readline
ジェソン: はい
minigmp: いいえ
libxtables: はい - コマンドラインオプションはコマンドの前に指定する必要があります。 たとえば、「nft -a list ruleset」を指定する必要があり、「nft list ruleset -a」を実行するとエラーが発生します。
出所: オープンネット.ru