iptables直接加十万条规则会严重拖垮性能,必须改用ipset构建哈希集合:创建时显式指定hashsize和maxelem(如hashsize 16384 maxelem 120000),用restore批量导入,再通过-m set绑定到INPUT链顶部,并用swap实现零停机更新。

直接用 iptables -s 加十万条规则会彻底拖垮性能——每次匹配都要线性扫描,平均查五万次,CPU占用飙升、延迟激增、甚至触发 conntrack 抖动。真正可行的方案是用 ipset 构建哈希集合,让 iptables 只做一次 O(1) 查表。
创建高容错的 hash:ip 集合
必须显式指定容量和哈希参数,否则默认 maxelem=65536,十万条直接溢出报错:
- ipset create blacklist hash:ip hashsize 16384 maxelem 120000 —— hashsize 建议设为略大于预期元素数的 2 的幂(如 120000 → 16384),避免哈希冲突导致性能下降
- 类型选 hash:ip(纯 IPv4 地址);若含网段,改用 hash:net,但注意它不兼容单 IP 混插
- 创建后执行 ipset list blacklist 确认 maxelem 和 size 字段已生效
批量导入十万条 IP 的正确方式
别用循环调用 ipset add,shell 启动开销会让导入耗时翻倍。应使用 restore 批量加载:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 准备文本文件 blacklist.txt,格式为每行一条命令:
create blacklist hash:ip hashsize 16384 maxelem 120000
add blacklist 192.0.2.1
add blacklist 192.0.2.2
……(共十万行 add) - 执行 ipset restore -f blacklist.txt,通常几秒内完成
- 导入后用 ipset test blacklist 192.0.2.1 随机抽检几条验证准确性
绑定到 iptables 并确保规则生效
iptables 本身不理解 ipset,必须加载 set 模块并放在关键链的靠前位置:
- iptables -I INPUT -m set --match-set blacklist src -j DROP —— 必须用 -m set,漏掉就报错 “No chain/target/match by that name”
- 规则必须插在 INPUT 或 FORWARD 链**顶部附近**,若写在 -j ACCEPT 之后,所有黑名单 IP 都会被提前放行
- 检查模块是否加载:lsmod | grep ip_set,缺失则运行 modprobe ip_set_hash_ip 并写入 /etc/modules
- IPv4 集合无法匹配 IPv6 地址,若日志里混有 ::ffff:192.0.2.1 这类映射地址,需先清洗再导入
安全更新黑名单,避免毫秒级放行窗口
flush + 重加会导致清空瞬间所有黑名单 IP 全部通行。零停机切换只需三步:
- 后台生成新名单,存为 blacklist_new.txt,执行 ipset restore -f blacklist_new.txt
- 原子切换:ipset swap blacklist blacklist_new —— 毫秒完成,旧集合立即变空,新集合实时生效
- 立刻清理残留:ipset destroy blacklist_new,否则空集合持续占用内核内存
- 注意:两个集合类型、family(inet/inet6)必须完全一致,否则 swap 报错 “different types”

















