XNUMX年間の開発を経て
カーネル レベルは、パケットからのデータの抽出、データ操作の実行、およびフロー制御の基本機能を提供する、プロトコルに依存しない汎用インターフェイスのみを提供します。
フィルタリング ロジック自体とプロトコル固有のハンドラーはユーザー空間でバイトコードにコンパイルされ、その後、このバイトコードは Netlink インターフェイスを使用してカーネルにロードされ、BPF (Berkeley Packet Filters) を思わせる特別な仮想マシンで実行されます。このアプローチにより、カーネル レベルで実行されるフィルタリング コードのサイズを大幅に削減し、プロトコルを操作するための解析ルールとロジックのすべての機能をユーザー空間に移動できます。
主な革新:
- IPsec のサポート。パケット、IPsec 要求 ID、および SPI (セキュリティ パラメーター インデックス) タグに基づいてトンネル アドレスを照合できます。例えば、
... IP SDDR 192.168.1.0/24 の ipsec
... spi 1-65536 の ipsec経路がIPsecトンネルを通過しているかどうかも確認できます。たとえば、IPSec を経由しないトラフィックをブロックするには、次のようにします。
…フィルタ出力 rt ipsec 欠落ドロップ
- IGMP (インターネット グループ管理プロトコル) のサポート。たとえば、ルールを使用して、受信した IGMP グループ メンバーシップ要求を破棄できます。
NFT 追加ルール netdev foo bar igmp タイプ メンバーシップ クエリ カウンター ドロップ
- 変数を使用して遷移チェーン (jump / goto) を定義する可能性。例えば:
dest = ber を定義します
ルールを追加 ip foo bar ジャンプ $dest - ヘッダーの TTL 値に基づいてオペレーティング システム (OS フィンガープリント) を識別するためのマスクのサポート。たとえば、送信側 OS に基づいてパケットをマークするには、次のコマンドを使用できます。
... メタ マーク セット osf ttl スキップ ネーム マップ { "Linux" : 0x1,
「Windows」: 0x2、
「MacOS」: 0x3、
"不明" : 0x0 }
... OSF TTL スキップ バージョン "Linux:4.20" - 送信者の ARP アドレスとターゲット システムの IPv4 アドレスを照合する機能。たとえば、アドレス 192.168.2.1 から送信される ARP パケットのカウンタを増やすには、次のルールを使用できます。
テーブル arp x {
チェーン y {
タイプフィルターフック入力優先度フィルター。ポリシーを受け入れます。
arp sawdr ip 192.168.2.1 カウンタ パケット 1 バイト 46
}
} - プロキシ (tproxy) を介したリクエストの透過的な転送のサポート。たとえば、ポート 80 への呼び出しをプロキシ ポート 8080 にリダイレクトするには、次のようにします。
テーブル IP x {
チェーン y {
タイプ フィルター フック プリルーティング優先度 -150;ポリシーを受け入れます。
tcp dport 80 tproxy から:8080
}
} - SO_MARK モードでの setsockopt() を介して設定マークをさらに取得できる機能を備えたソケットのマーキングのサポート。例えば:
テーブル inet x {
チェーン y {
タイプ フィルター フック プリルーティング優先度 -150;ポリシーを受け入れます。
tcp dport 8080 マーク セット ソケット マーク
}
} - チェーンの優先テキスト名の指定のサポート。例えば:
nft add chain ip x raw { タイプ フィルタ フック プレルーティング優先順位 raw; }
nft add chain ip x filter { type フィルタ フック プレルーティング優先度フィルタ; }
nft add chain ip x filter_later { type フィルターフック プレルーティング優先フィルター + 10; } - SELinux タグ (Secmark) のサポート。たとえば、SELinux コンテキストで「sshtag」タグを定義するには、次のコマンドを実行できます。
nft secmark inet フィルター sshtag "system_u:object_r:ssh_server_packet_t:s0" を追加
そして、ルール内でこのラベルを使用します。
nft ルールの追加 inet フィルター入力 tcp dport 22 メタ secmark セット「sshtag」
nft add map inet filter secmapping { type inet_service : secmark; }
nft 要素の追加 inet フィルター secmapping { 22 : "sshtag" }
nft ルールの追加 inet フィルター入力メタ secmark セット tcp dport マップ @secmapping - /etc/services ファイルで定義されているように、プロトコルに割り当てられたポートをテキスト形式で指定する機能。例えば:
nft ルール xy tcp dport "ssh" を追加
NFT リスト ルールセット -l
テーブル x {
チェーン y {
...
tcp dポート「ssh」
}
} - ネットワークインターフェイスのタイプを確認する機能。例えば:
ルール inet raw プレルーティング メタ iifkind "vrf" を追加します。
- 「動的」フラグを明示的に指定することにより、セットの内容を動的に更新するためのサポートが改善されました。たとえば、セット「s」を更新して送信元アドレスを追加し、30 秒間パケットがない場合にエントリをリセットするには、次のようにします。
テーブルxを追加
add set xs { type ipv4_addr;サイズ128。タイムアウトは 30 秒。動的フラグ。 }
add chain xy { type フィルタフック入力優先度 0; }
ルール xy 更新 @s { ip addr } を追加します - 別のタイムアウト条件を設定する機能。たとえば、ポート 8888 に到着するパケットのデフォルトのタイムアウトをオーバーライドするには、次のように指定できます。
テーブル IP フィルター {
ct タイムアウト アグレッシブ tcp {
プロトコルtcp;
l3プロトIP;
ポリシー = {確立: 100、close_wait: 4、close: 4}
}
連鎖出力 {
...
tcp dport 8888 ct タイムアウト セット "aggressive-tcp"
}
} - inet ファミリの NAT サポート:
テーブル inet nat {
...
ip6 お父さんが死んだ::2::1 dnat から死んだ:2::99
} - タイプミスエラーレポートの改善:
NFT 追加チェーン フィルター テスト
エラー: そのようなファイルまたはディレクトリはありません。ファミリ IP のテーブル「フィルター」のことですか?
チェーンフィルターテストを追加
^^^^^^ - インターフェイス名をセットで指定する機能:
set sc {
「inet_service」と入力します。 ifname
要素 = { "ssh" . "eth0" }
} - 更新されたフローテーブル ルール構文:
nft テーブル x を追加
nft add flowtable x ft {フック入力優先度 0;デバイス = { eth0、wlan0 }; }
...
nft add ルール x フォワード ip プロトコル { tcp, udp } flow add @ft - JSON サポートが改善されました。
出所: オープンネット.ru