nftables集合通过哈希表或基数树实现o(1)匹配,将线性增长的规则延迟降为常数级;支持ip、端口等多类型元素自动合并与动态更新,并可结合映射(map)实现策略分级。

用 nftables 集合(Sets)优化匹配性能,核心是把大量离散值(比如几百个IP、几十个端口)从“逐条规则匹配”变成“一次哈希查找”。它不靠堆规则数量取胜,而是靠数据结构降维打击。
为什么集合能显著提速
传统写法中,每加一个IP或端口就得新增一条规则,规则链越长,包匹配越慢——延迟随规则数线性增长。而集合底层用哈希表或基数树实现,查询时间基本稳定在 O(1),哪怕存 10 万个 IP,匹配开销也和查 10 个差不多。
- 10 万条独立规则 → 内存占用高、加载慢、更新卡顿、匹配延迟飙升
- 1 个含 10 万个元素的集合 + 1 条引用规则 → 内存省 20 倍、更新毫秒级、匹配快 15 倍以上
- 还支持自动合并相邻网段(如 192.168.1.0/24 和 192.168.2.0/24 可合并为 192.168.0.0/23),进一步压缩存储
创建和使用 IP 地址集合
先建一个命名集合,再往里加地址,最后在规则里引用:
-
创建 IPv4 地址集合(支持网段):
nft add set inet filter trusted_ips { type ipv4_addr\; flags interval\; } -
添加单个 IP 或网段:
nft add element inet filter trusted_ips { 192.168.1.100, 10.0.0.0/8, 172.16.0.0/12 } -
在规则中直接引用:
nft add rule inet filter input ip saddr @trusted_ips accept
注意 flags interval 能让集合自动合并连续地址段,减少内部条目,对 CIDR 列表特别友好。
端口、协议等多类型集合统一管理
不止 IP,端口、ICMP 类型、甚至 TCP 标志位都能放进集合,复用同一套机制:
- 端口集合:
nft add set inet filter web_ports { type inet_service\; }
nft add element inet filter web_ports { 80, 443, 8080 } - 混用多个集合(IP + 端口):
nft add rule inet filter input ip saddr @trusted_ips tcp dport @web_ports accept - 支持动态更新:随时
nft add/del element,无需重载整套规则
配合映射(Map)实现行为分级
单纯集合只能做“匹配后放行/拒绝”,而 Map 能把 IP 映射到不同动作,比如封禁等级、跳转链、限速策略:
- 定义映射:源 IP → 处理链
nft add map inet filter ip_action { type ipv4_addr : verdict\; } - 绑定行为:
nft add element inet filter ip_action { 192.168.1.200 : jump blackhole_chain, 10.0.0.50 : drop } - 主规则只需一行:
nft add rule inet filter input meta skfip @ip_action
这样就把“哪个 IP 执行什么动作”的逻辑从规则体里抽出来,既清晰又可编程——脚本增删 IP 就等于调整策略,不用碰规则语法。











