6.5. nftables コマンドにおける決定マップの使用
ディクショナリーとしても知られる決定マップにより、
nft は一致基準をアクションにマッピングすることで、パケット情報に基づいてアクションを実行できます。
6.5.1. nftables での匿名マップの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
匿名マップは、ルール内で直接使用する
{ match_criteria : action } ステートメントです。ステートメントには、複数のコンマ区切りマッピングを含めることができます。
匿名マップの欠点は、マップを変更する場合には、ルールを置き換える必要があることです。動的なソリューションの場合は、「nftables での名前付きマップの使用」 の説明に従って名前付きマップを使用します。
この例では、匿名マップを使用して、IPv4 プロトコルおよび IPv6 プロトコルの TCP パケットと UDP パケットの両方を別のチェーンにルーティングし、着信 TCP パケットと UDP パケットを個別にカウントする方法を説明します。
手順6.15 nftables での匿名マップの使用
- example_table を作成します。
nft add table inet example_table
# nft add table inet example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow - example_table に
tcp_packetsチェーンを作成します。nft add chain inet example_table tcp_packets
# nft add chain inet example_table tcp_packetsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - このチェーンのトラフィックをカウントする
tcp_packetsにルールを追加します。nft add rule inet example_table tcp_packets counter
# nft add rule inet example_table tcp_packets counterCopy to Clipboard Copied! Toggle word wrap Toggle overflow - example_table で
udp_packetsチェーンを作成します。nft add chain inet example_table udp_packets
# nft add chain inet example_table udp_packetsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - このチェーンのトラフィックをカウントする
udp_packetsにルールを追加します。nft add rule inet example_table udp_packets counter
# nft add rule inet example_table udp_packets counterCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 着信トラフィックのチェーンを作成します。たとえば、example_table で着信トラフィックをフィルターする
incoming_trafficという名前のチェーンを作成するには、次のコマンドを実行します。nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 匿名マップを持つルールを
incoming_trafficに追加します。nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 匿名マップはパケットを区別し、プロトコルに基づいて別のカウンターチェーンに送信します。 - トラフィックカウンターの一覧を表示する場合は、example_table を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tcp_packetsおよびudp_packetsチェーンのカウンターは、受信したパケットとバイトの数の両方を表示します。
6.5.2. nftables での名前付きマップの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、名前付きマップに対応します。テーブルの複数のルールでこのマップを使用できます。匿名マップに対する別の利点は、名前付きマップを使用するルールを置き換えることなく、名前付きマップを更新できることです。
名前付きマップを作成する場合は、要素のタイプを指定する必要があります。
- 一致する部分に
192.0.2.1などのIPv4アドレスが含まれるマップの場合はipv4_addr。 - 一致する部分に
2001:db8:1::1 などのIPv6アドレスが含まれるマップの場合はipv6_addr。 52:54:00:6b:66:42 など、一致する部分にメディアアクセス制御(MAC)アドレスが含まれるマップの場合はether_addr。- 一致する部分に
tcpなどのインターネットプロトコルタイプが含まれるマップの場合はinet_proto。 - 一致する部分に
sshや22などのインターネットサービス名のポート番号が含まれるマップの場合はinet_service。 - 一致する部分にパケット
マークが含まれるマップの場合は mark。パケットマークは、任意の正の 32 ビットの整数値(0~2147483647)にできます。 - 一致する部分に
カウンター値が含まれるマップの場合は counter。カウンター値は、正の値の 64 ビットであれば任意の値にすることができます。 - 一致する部分に
クォータ値が含まれるマップの場合は quota。クォータの値は、64 ビットの整数値にできます。
この例では、送信元の IP アドレスに基づいて着信パケットを許可または破棄する方法を説明します。名前付きマップを使用すると、このシナリオを設定するのに必要なルールは 1 つだけで、IP アドレスとアクションがマップに動的に保存されます。この手順では、マップからエントリーを追加および削除する方法を説明します。
手順6.16 nftables での名前付きマップの使用
- テーブルを作成します。たとえば、
IPv4パケットを処理する example_table という名前のテーブルを作成するには、次のコマンドを実行します。nft add table ip example_table
# nft add table ip example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow - チェーンを作成します。たとえば、example_table に、example_chain という名前のチェーンを作成するには、次のコマンドを実行します。
nft add chain ip example_table example_chain { type filter hook input priority 0 \; }# nft add chain ip example_table example_chain { type filter hook input priority 0 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要シェルで、セミコロンがコマンドの最後として解釈されないようにするには、セミコロンをバックスラッシュでエスケープする必要があります。 - 空のマップを作成します。たとえば、
IPv4アドレスのマップを作成するには、次のコマンドを実行します。nft add map ip example_table example_map { type ipv4_addr : verdict \; }# nft add map ip example_table example_map { type ipv4_addr : verdict \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - マップを使用するルールを作成します。たとえば、次のコマンドは、両方とも example_map で定義されている
IPv4アドレスにアクションを適用するルールを example_table の example_chain に追加します。nft add rule example_table example_chain ip saddr vmap @example_map
# nft add rule example_table example_chain ip saddr vmap @example_mapCopy to Clipboard Copied! Toggle word wrap Toggle overflow IPv4アドレスと対応するアクションを example_map に追加します。nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }# nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、IPv4アドレスのアクションへのマッピングを定義します。上記で作成したルールと組み合わせて、ファイアウォールは 192.0.2.1 からのパケットを受け入れ、192.0.2. からのパケットをドロップします。- 必要に応じて、別の IP アドレスおよび action ステートメントを追加してマップを拡張します。
nft add element ip example_table example_map { 192.0.2.3 : accept }# nft add element ip example_table example_map { 192.0.2.3 : accept }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 必要に応じて、マップからエントリーを削除します。
nft delete element ip example_table example_map { 192.0.2.1 }# nft delete element ip example_table example_map { 192.0.2.1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 必要に応じて、ルールセットを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.5.3. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
決定マップの詳細は、
nft (8) man ページの Maps セクションを参照してください。