高效导入IP黑名单需生成标准restore文件后用ipset restore一次性加载:首行create定义集合,后续add添加条目;须确保集合已预先创建且类型参数一致,避免被iptables引用,并区分IPv4/IPv6。

直接用循环逐条 ipset add 会极慢且不可靠——万次调用意味着万次进程启动、万次内核交互,几分钟都跑不完,还容易中断或被系统限频。真正高效的做法是生成标准 restore 文件,再一次性加载。
必须用 ipset restore 批量导入
ipset restore 是原子操作,毫秒级完成,支持百万级条目。关键在于文件格式要严格符合规范:首行 create 定义集合,后续每行 add 添加条目,不能有多余空行或注释。
准备原始 IP 列表(比如 malicious_ips.txt),先清理干净:
grep -v '^#|^$' malicious_ips.txt | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' > clean_ips.txt
生成 restore 文件(以 blacklist 集合为例):
echo "create blacklist hash:ip maxelem 120000 hashsize 524288 timeout 0" > blacklist.restore
awk '{print "add blacklist " $1}' clean_ips.txt >> blacklist.restore执行导入:
ipset restore -f blacklist.restore
导入后验证是否成功:
-
ipset list blacklist | grep "Number of entries"看总数 -
ipset list blacklist | head -n 3看前几条是否正确
注意几个硬性前提
- 集合必须提前创建,且类型、参数(如
hash:ip/maxelem)与 restore 文件中声明的一致,否则报错Set cannot be swapped: different types或Set is full - 导入前确保该集合未被 iptables 正在引用,否则 restore 会失败;可临时删规则:
iptables -D INPUT -m set --match-set blacklist src -j DROP - IPv6 地址必须单独用
hash:ip6类型建集,不能混进hash:ip集合
不复杂但容易忽略


















