如何使用集合作为 (v)map 中的键?

如何使用集合作为 (v)map 中的键?

例如,人们可以:

ip saddr vmap { 192.168.1.2: goto chain_a, 192.168.1.6: goto chain_b }

但显然不是:

ip saddr vmap { { 192.168.1.2, 192.168.1.4 }: goto chain_a,
                { 192.168.1.6, 192.168.1.8 }: goto chain_b }

我知道一个人可以:

ip saddr vmap { 192.168.1.2: goto chain_a, 192.168.1.4: goto chain_a,
                192.168.1.6: goto chain_b, 192.168.1.8: goto chain_b }

或者甚至只是:

ip saddr { 192.168.1.2, 192.168.1.4 } goto chain_a
ip saddr { 192.168.1.6, 192.168.1.8 } goto chain_b

但我只是好奇是否有一种方法可以使用集合(或类似的东西)作为 (v)map 中的键。

答案1

nftables 1.0.0(2021 年 8 月发布),您可以执行以下操作:

将包含集合的变量展开为多个映射

define interfaces = { eth0, eth1 }

 table ip x {
       chain y {
               type filter hook input priority 0; policy accept;
               iifname vmap { lo : accept, $interfaces : drop }
       }
}
# nft -f x.nft
# nft list ruleset
table ip x {
      chain y {
               type filter hook input priority 0; policy accept;
               iifname vmap { "lo" : accept, "eth0" : drop, "eth1" : drop }
       }
}

我不知道使用不在变量内的集合是否也有效,但现在可以了,因为每个新版本都会nftables增加可能性。

相关内容