![如何使用集合作为 (v)map 中的键?](https://linux22.com/image/193244/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E4%BD%9C%E4%B8%BA%20(v)map%20%E4%B8%AD%E7%9A%84%E9%94%AE%EF%BC%9F.png)
例如,人们可以:
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
增加可能性。