ipset能将iptables匹配从o(n)优化至o(1),通过内核哈希表存储ip/网段,仅需一条规则引用集合,显著提升性能、减少规则数量并降低内存占用;支持hash:net等类型,可批量导入、动态增删、设置超时,且规则实时生效。

直接用 iptables 一条条加 -s 规则封成百上千个 IP,性能会明显下降——因为每来一个包都要顺序比对所有规则,是 O(n) 时间复杂度。而用 ipset + iptables 组合,能把匹配压到接近 O(1),核心就是把 IP(或网段)存进内核级哈希表,iptables 只需查一次表。
必须先装好 ipset
CentOS/RHEL:
yum install -y ipset iptables-services
Ubuntu/Debian:
apt-get install -y ipset
创建高效可扩容的集合
别用默认大小(65536),尤其要封大量 IP 或网段时:
ipset create blacklist hash:net hashsize 4096 maxelem 1000000
-
hash:net:支持存单个 IP(如1.2.3.4)和 CIDR 网段(如192.168.1.0/24) -
hashsize 4096:初始哈希桶数量,太小易冲突,太大浪费内存;4096 是稳妥起点 -
maxelem 1000000:上限设足,避免后续 add 失败
批量导入 IP 或网段
比如你有一个 badips.txt,每行一个 IP 或网段:
while IFS= read -r ip; do [ -n "$ip" ] && ipset add blacklist "$ip" 2>/dev/null done <p>注意跳过空行和注释,否则 <code>ipset add</code> 会报错中断。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)"><img src="https://img.php.cn/upload/skill/000/000/081/179228531040284.jpg" alt="Obsidian (Linux)" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)" class="overflowclass">Obsidian (Linux)</a> <p class="overflowclass">操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。</p> </div> <a rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><p><strong>挂载 iptables 规则(关键位置)</strong><br> 这条规则要插在 INPUT 链最前面,确保优先匹配: </p><pre class="brush:bash;toolbar:false;">iptables -I INPUT -m set --match-set blacklist src -j DROP
-
-I INPUT:插入链首(不是-A追加末尾) -
--match-set blacklist src:匹配源地址是否在 blacklist 集合中 - 顺序很重要:如果前面已有 ACCEPT 规则放行了 SSH,那 DROP 就没机会生效
保存与开机自启
规则重启后不丢,分两步:
# 保存 ipset 内容 ipset save blacklist > /etc/ipset-blacklist.conf # 保存 iptables 规则(含 -m set 模块) iptables-save > /etc/sysconfig/iptables
开机自动加载:
- CentOS/RHEL:确保
ipset服务启用,且/etc/rc.d/rc.local或 systemd service 中执行ipset restore - Ubuntu:可用
iptables-persistent配合ipset restore脚本
日常维护更省心
- 加新 IP:
ipset add blacklist 203.0.113.42 - 删某个 IP:
ipset del blacklist 203.0.113.42 - 清空整个集合:
ipset flush blacklist(不清除集合定义) - 查当前内容:
ipset list blacklist | head -20
不需要重启网络或重载 iptables,所有操作实时生效。










