42.6. 在 nftables 命令中使用判决映射
				判决映射(也称为字典),使 nft 能够通过将匹配条件映射到某个操作来根据数据包信息执行操作。
			
42.6.1. 在 nftables 中使用匿名映射
					匿名映射是直接在规则中使用的 { match_criteria : action } 语句。这个语句可以包含多个用逗号分开的映射。
				
匿名映射的缺点是,如果要修改映射,则必须替换规则。对于动态解决方案,请使用命名映射,如 在 nftables 中使用命名映射 中所述。
例如,您可以使用匿名映射将 IPv4 和 IPv6 协议的 TCP 和 UDP 数据包路由到不同的链,以分别计算传入的 TCP 和 UDP 数据包。
流程
- 创建新表: - nft add table inet example_table - # nft add table inet example_table- Copy 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_packets- Copy 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 counter- Copy 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_packets- Copy 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 counter- Copy 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链中的计数器显示两者接收的数据包和字节数。
42.6.2. 在 nftables 中使用命名映射
					nftables 框架支持命名映射。您可以在表中的多个规则中使用这些映射。匿名映射的另一个好处在于,您可以更新命名映射而不比替换使用它的规则。
				
在创建命名映射时,您必须指定元素的类型:
- 
							匹配部分包含 IPv4 地址的映射的 ipv4_addr,如192.0.2.1。
- 
							匹配部分包含 IPv6 地址的映射的 ipv6_addr,如2001:db8:1::1。
- 
							匹配部分包含介质访问控制(MAC)地址的映射的ether_addr,如52:54:00:6b:66:42。
- 
							匹配部分包含互联网协议类型的映射的 inet_proto,如tcp。
- 
							匹配部分包含互联网服务名称端口号的映射的 inet_service,如ssh或22。
- 
							匹配部分包含数据包的映射的 mark。数据包标记可以是任意正 32 位整数值(0到2147483647)。
- 
							匹配部分包含计数器值的映射的 counter。计数器值可以是任意正 64 位整数值。
- 
							匹配部分包含配额值的映射的 quota。配额值可以是任意正 64 位整数值。
例如,您可以根据其源 IP 地址允许或丢弃传入的数据包。使用命名映射时,您只需要一条规则来配置这种场景,而 IP 地址和操作被动态存储在映射中。
流程
- 创建表。例如,要创建一个处理 IPv4 数据包的、名为 - example_table的表:- nft add table ip example_table - # nft add table ip example_table- Copy 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 重要- 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。 
- 创建一个空的映射。例如,要为 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_table中的- example_chain添加了一条规则,该规则将操作应用到在- example_map中定义的 IPv4 地址:- nft add rule example_table example_chain ip saddr vmap @example_map - # nft add rule example_table example_chain ip saddr vmap @example_map- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 向 - example_map添加 IPv4 地址和相应的操作:- 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.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