匿名集合是在nftables规则中直接内联定义的一组匹配值,如IP段或端口,语法为大括号括起、逗号分隔,支持多种字段类型且执行高效,但不可复用或动态修改。

匿名集合能快速把多个离散值打包进一条规则,省去重复写多条相似规则的麻烦,适合一次性配置、变动不频繁的场景。
匿名集合是什么
它是在定义规则时直接内联写出的一组匹配值,比如多个IP段或端口,不需要提前创建命名对象。nftables内部会自动将其编译为高效查找结构,语法紧凑,执行效率高。
- 只在规则中出现一次,不能复用或动态修改
- 支持IP地址、端口、协议、接口名等多种字段类型
- 一个规则里可同时使用多个匿名集合,彼此逻辑与关系
怎么写一条带匿名集合的规则
基本格式是把值用大括号{}括起来,逗号分隔。例如允许特定网段访问几个常用服务:
nft add rule inet filter input ip saddr { 10.0.1.0/24, 172.16.5.0/28 } tcp dport { 22, 80, 443 } accept
这条命令等价于手动写6条规则(3个端口 × 2个网段),但只占一行,也只产生一次规则插入开销。
- IP段和端口可以混合CIDR与单IP,如{ 192.168.1.100, 192.168.2.0/24 }
- 支持IPv6地址,只要协议簇设为inet或ip6
- 注意空格:大括号前后、逗号后需有空格,否则语法报错
适用场景与注意事项
匿名集合最适合初始部署、临时策略或配置固化环境,比如VPS初始化脚本、CI/CD流水线中的防火墙快照。
- 不适合需要运行时增删IP的场景——改一个地址就得删整条规则再重加
- 调试时用nft list ruleset能看到展开后的原始写法,便于核对
- 若集合元素过多(如几百个IP),建议改用命名集合+脚本批量导入,避免命令行过长或解析失败
和命名集合对比的关键区别
匿名集合是“写死”的,命名集合才是可维护的。比如你要每天更新黑名单IP,用命名集合配合nft add element就能增量操作;而匿名集合每次都要重载整条规则。
- 匿名集合:轻量、即用、不可变
- 命名集合:需预先定义、支持动态增删、可被多条规则引用
- 选哪个?看规则是否要“活着改”——要就用命名,不要就用匿名

















