2.8. nftables コマンドにおける決定マップの使用
ディクショナリーとしても知られている決定マップにより、nft は一致基準をアクションにマッピングすることで、パケット情報に基づいてアクションを実行できます。
2.8.1. nftables での匿名マップの使用 リンクのコピーリンクがクリップボードにコピーされました!
匿名マップは、ルールで直接使用する { match_criteria : action } ステートメントです。ステートメントには、複数のコンマ区切りマッピングを含めることができます。
匿名マップの欠点は、マップを変更する場合には、ルールを置き換える必要があることです。動的なソリューションの場合は、nftables での名前付きマップの使用 で説明されているように名前付きマップを使用します。
たとえば、匿名マップを使用して、IPv4 プロトコルおよび IPv6 プロトコルの TCP パケットと UDP パケットの両方を異なるチェーンにルーティングし、着信 TCP パケットと UDP パケットを個別にカウントできます。
手順
新しいテーブルを作成します。
# nft add table inet example_tableexample_tableにtcp_packetsチェーンを作成します。# nft add chain inet example_table tcp_packetsこのチェーンのトラフィックをカウントする
tcp_packetsにルールを追加します。# nft add rule inet example_table tcp_packets counterexample_tableでudp_packetsチェーンを作成します。# nft add chain inet example_table udp_packetsこのチェーンのトラフィックをカウントする
udp_packetsにルールを追加します。# nft add rule inet example_table udp_packets counter着信トラフィックのチェーンを作成します。たとえば、
example_tableに、着信トラフィックをフィルタリングするincoming_trafficという名前のチェーンを作成するには、次のコマンドを実行します。# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }匿名マップを持つルールを
incoming_trafficに追加します。# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }匿名マップはパケットを区別し、プロトコルに基づいて別のカウンターチェーンに送信します。
トラフィックカウンターの一覧を表示する場合は、
example_tableを表示します。# nft list table inet example_table table inet example_table { chain tcp_packets { counter packets 36379 bytes 2103816 } chain udp_packets { counter packets 10 bytes 1559 } chain incoming_traffic { type filter hook input priority filter; policy accept; ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets } } }tcp_packetsチェーンおよびudp_packetsチェーンのカウンターは、受信パケットとバイトの両方を表示します。