nftables具名集合实现秒级拉黑,通过interval标志支持CIDR与自动过期,配合timeout避免手动清理,单条规则引用集合即可拦截,增删元素毫秒生效且不中断服务。

用 nftables 的 Named Set(具名集合)实现在线秒级拉黑,关键在于把恶意 IP 当作“数据”而非“规则”来管理——集合本身是内核中可动态修改的查表结构,增删元素不触发规则重载,自然无需 reload 或 flush,毫秒级生效。
创建支持 CIDR 和自动过期的集合
必须启用 interval 标志才能混合存单 IP 与网段(如 192.0.2.5 和 203.0.113.0/24),同时加 timeout 避免手动清理:
- nft add set inet firewall blacklist { type ipv4_addr \ flags interval \ timeout 24h }
- 不加 interval 会导致 /24 网段被拆成 256 个独立条目,内存暴涨、匹配变慢
- timeout 单位支持 s/m/h/d,超时后条目自动消失,无需脚本轮询删除
在链中只引用一次,不写重复规则
集合必须绑定到 filter 链才起作用,且只需一条规则即可覆盖全部黑名单条目:
- 先确保 input 链存在并设默认策略:nft add chain inet firewall input { type filter hook input priority 0 \; policy drop \; }
- 再添加拦截动作:nft add rule inet firewall input ip saddr @blacklist drop
- 此后所有发往本机的包,内核直接查 @blacklist 哈希表,命中即丢弃,O(1) 时间复杂度
运行时动态增删,完全不中断服务
所有操作实时生效,不影响现有连接或规则链运行:
- 封单个 IP:nft add element inet firewall blacklist { 203.0.113.42 }
- 封整个网段:nft add element inet firewall blacklist { 198.51.100.0/24 }
- 批量导入(从文件逐行读取):while read ip; do nft add element inet firewall blacklist { $ip }; done
- 删除某 IP:nft delete element inet firewall blacklist { 192.0.2.100 }
避免常见误操作导致放行风险
集合内容可改,但操作方式直接影响安全性:
- 切勿用 nft flush set inet firewall blacklist 清空再重载——清空瞬间所有 IP 失效,攻击流量会漏进来
- 应优先依赖 timeout 自动清理;若需强制清除,用 nft delete element 逐条删,或重建新集合再切换引用
- 确认是否生效:nft list set inet firewall blacklist 查看当前条目;nft list chain inet firewall input 确认规则存在


















