封禁量级为什么要上 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,port | IP 与端口组合 | 只封某来源对某端口的访问 |
| bitmap:ip | 固定范围内的 IP | 条目多但范围固定,内存占用更优 |
timeout 参数让封禁自动过期,避免人工维护超长名单;同时集合本身只存在内存中,重启前必须 ipset save,否则封禁名单会整体丢失。
封禁要写明来源与到期策略:误封运营商 NAT 出口或公司出口 IP 会导致大范围访问中断,回滚手段(删除集合条目)要事先演练。
集合条目数量应纳入监控:ipset list 可看到条目数与内存占用,长期只增不减的名单既占内存也说明缺少回收机制。