在nftables中使用集合真的很酷。我目前在我的nftables.conf
规则集中使用了很多这样的语句:
iifname {clients0, dockernet} oifname wan0 accept \
comment "Allow clients and Docker containers to reach the internet"
在上面的规则{clients0, dockernet}
中是一组匿名(内联)接口。我不想一遍又一遍地重复规则,我想在文件顶部定义一组接口,在 nftables 中称为命名集。手册页 (Debian Buster)显示了如何为几种类型的集合执行此操作:ipv4_addr、ipv6_addr、ether_addr、inet_proto、inet_service和mark。但是,它似乎不适用于按名称或简单的原始类型(如字符串)的接口。
我有下面的方法,但这不适用于给出的错误:
省略类型:
table inet filter { set myset { elements = { clients0, dockernet, } } [...] }
结果:
Error: set definition does not specify key
。使用
string
类型:table inet filter { type string; set myset { elements = { clients0, dockernet, } } [...] }
结果:
Error: unqualified key type string specified in set definition
。
真的没有办法命名我在顶部显示的匿名集吗?
通过在源代码中搜索 0.9.0 版本:
[...]
[...]
然后寻找它们的 定义位置:
[...]
有可能发现所需的类型是
iface_index
(例如:)iif lo
和ifname
(例如iifname "lo"
),即使(在撰写此答案时)它在nft
的手册页中没有记录。请注意,集合中的 ifname 通配符支持已在nftables 1.0.3中的 2022-05-31 添加。必须使用命名集
flags intervals
,并且最后的通配符是*
(+
不像在iptables中那样)。可以使用以下方法轻松找到元素数据类型
nft
:你看到了,
ifname
并且iface_index
是可能的类型,所以你可以声明:在上面的例子中,如果你不知道类型,你甚至可以写
typeof iifname
代替(需要v0.9.4 或更高版本)。type ifname
nft