首页/安全/安全加固速查/ipset 大规模 IP 封禁(黑名单万级条目)
防火墙与访问控制50 条

ipset 大规模 IP 封禁(黑名单万级条目)

iptables 直接堆几万条封禁规则会拖慢匹配;ipset 把集合做成哈希表,一条规则命中整个集合,是封禁量级上台阶的标准做法。

安全加固速查安全更新于 2026-10-13

封禁量级为什么要上 ipset

iptables 是线性匹配:几万条封禁条目意味着每个包都要走一遍长链,CPU 与延迟都会受影响。ipset 把名单做成哈希或位图集合,一条规则即可命中整个集合,封禁从几百条扩到几万条,性能基本不下降,是黑名单规模化的标准做法。

基本信息

适用平台Linux(iptables + ipset,需 ipset 包与内核 xt_set 模块)
集合类型hash:ip、hash:net、hash:ip,port、hash:net,port、bitmap:ip
常用机制创建集合、加条目、用 -m set --match-set 在规则里引用
持久化iptables-save 不含集合,需单独 ipset save/restore

典型使用场景

  • 拦截自动化扫描来源:把上万条恶意 IP 一次导入集合,规则只需一条
  • 按业务封禁:把风控系统产出的名单定时同步到集合里
  • 自动过期:用 timeout 让条目到期自动清除,避免维护超长名单
  • 云环境常态运维:公网 IP 被扫描是日常,封禁需要可批量、可回收

创建集合与规则

创建集合与规则
# 创建集合,条目 24 小时后自动失效
ipset create blocklist hash:ip timeout 86400
# 支持 CIDR 网段(hash:ip 类型下可直接加网段)
ipset add blocklist 203.0.113.10
ipset add blocklist 198.51.100.0/24
# 一条规则命中整个集合
# 放在通用放行之前,否则永远不会被匹配
iptables -I INPUT -m set --match-set blocklist src -j DROP
# 查看与保存
ipset list blocklist | head -20
ipset save > /etc/ipset.rules

集合类型对照

类型匹配对象适用场景
hash:ip单个 IP 或网段最常见的封禁名单
hash:net标准网段按段封禁,避免逐条列举
hash:ip,portIP 与端口组合只封某来源对某端口的访问
bitmap:ip固定范围内的 IP条目多但范围固定,内存占用更优
timeout 参数让封禁自动过期,避免人工维护超长名单;同时集合本身只存在内存中,重启前必须 ipset save,否则封禁名单会整体丢失。
封禁要写明来源与到期策略:误封运营商 NAT 出口或公司出口 IP 会导致大范围访问中断,回滚手段(删除集合条目)要事先演练。
集合条目数量应纳入监控:ipset list 可看到条目数与内存占用,长期只增不减的名单既占内存也说明缺少回收机制。

易错点

  • 忘了持久化:只有 iptables 规则被保存,重启后集合为空,规则匹配不到任何东西
  • 集合条数不做监控:集合持续膨胀会吃内存,应定期统计条目数并清理
  • 把拒绝规则放在链尾:前面的通用放行已经放行,封禁规则永不生效
  • 用 CIDR 误封整段:写错掩码会连带封掉正常客户,变更前先小范围验证

数据来源与参考

  • ipset(8) 手册
  • netfilter 文档:Set 匹配

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌