用 ipset 替代 iptables 多规则实现高效黑名单:选 hash:ip 或 hash:net 类型,显式设置 maxelem 和 hashsize,用 restore 批量导入,iptables 规则需 -m set 并插入链首,动态更新用 swap 原子切换。

直接用 iptables -s 加几千条规则会拖垮服务器——每次数据包进来都要线性比对,CPU 占用飙升、吞吐下降、延迟升高。真正高效的做法是用 ipset 创建内核级哈希集合,让 iptables 只需一条规则做一次 O(1) 查表,万级甚至十万级 IP 对性能几乎无影响。
选对类型和关键参数
纯 IPv4 黑名单必须用 hash:ip 类型;含网段(如 192.168.0.0/24)则用 hash:net。别混用,也别用 list:set 或 bitmap:ip。
-
maxelem 必须显式设置:默认上限仅 65536,万级 IP 很容易溢出。预估峰值后上浮 20%,例如预期最多 12 万 IP,就写
maxelem 120000 -
hashsize 推荐设为 maxelem 的 2–4 倍(如
hashsize 524288),能减少哈希冲突,提升查询稳定性 - 加 timeout 0 关闭自动过期,适合长期有效的黑名单
批量导入要快且稳
逐行执行 ipset add 是最慢的方式——每条命令都启动新进程,万次调用光 shell 开销就几秒,还可能被限频或中断。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 先清理原始 IP 列表:
grep -v '^#|^$' blacklist.txt | sed 's/^/add blacklist /' - 拼成标准 restore 文件:
echo "create blacklist hash:ip hashsize 524288 maxelem 120000 timeout 0" > blacklist.restore && cat adds.txt >> blacklist.restore - 一次性加载:
ipset restore -f blacklist.restore,万条毫秒级完成
iptables 引用必须准确到位
集合建好了,但规则写错就完全不生效。
- 确保内核模块已加载:
modprobe ip_set_hash_ip,并写入/etc/modules持久化 - 规则中必须带 -m set,否则报 “No chain/target/match by that name”
- 必须用
iptables -I INPUT 1插入链首,不能用-A追加;若前面已有-j ACCEPT,DROP 规则永远不触发 - 完整命令示例:
iptables -I INPUT 1 -m set --match-set blacklist src -j DROP
动态更新要零停机
直接 ipset flush 再重加,清空瞬间所有黑名单 IP 都能通行,存在明显防护真空。
- 后台创建新集合:
ipset create blacklist_new hash:ip hashsize 524288 maxelem 120000 timeout 0 - 导入新名单:
ipset restore -f blacklist_new.restore - 原子切换:
ipset swap blacklist blacklist_new,毫秒完成 - 立刻清理旧集:
ipset destroy blacklist_new,释放内核内存

















