ipset域名是运维人员通过ipset工具批量管理域名对应IP地址的高效方法,在CDN加速、防盗链、DDoS防护等场景中广泛使用。 它让你从繁琐的iptables单条规则中解放出来,通过集合操作实现动态、批量管控,配合定时脚本能自动跟上域名解析的变化。
ipset域名配置步骤详解
安装ipset并确认内核支持
ipset是Linux内核模块xt_set的用户态工具,安装前检查内核是否支持,执行lsmod | grep xt_set,若未加载则modprobe ip_set,安装命令随发行版不同:
- Debian/Ubuntu:
sudo apt-get install ipset - CentOS/RHEL:
sudo yum install ipset - 安装后验证:
ipset -v,输出版本号即成功。
创建域名IP集合
ipset支持多种类型,管理域名IP最常用的是hash:ip,创建集合时指定名称和最大元素数:
ipset create domain_whitelist hash:ip maxelem 65536
若需存储CIDR网段,使用hash:net类型,集合创建后可用ipset list查看,初始为空。
编写域名解析更新脚本
手动添加IP不现实,推荐脚本化,以下脚本从域名列表文件逐行读取,解析A记录并更新集合:
#!/bin/bash
IPSET_NAME="domain_whitelist"
DOMAIN_FILE="/etc/ipset/domains.txt"
# 清空旧集合,避免累积过期IP
ipset flush $IPSET_NAME
while read domain; do
# 只取IPv4地址,忽略CNAME
ips=$(dig +short $domain A | grep -E '^[0-9]+.[0-9]+.[0-9]+.[0-9]+$')
for ip in $ips; do
ipset add $IPSET_NAME $ip
done
done < $DOMAIN_FILE
赋予执行权限,加入crontab,每5分钟执行一次:/5 /usr/local/bin/update_ipset.sh,注意调整dig的超时设置,避免DNS故障时阻塞。
关联iptables规则实现控制
创建集合后,需与iptables联动,白名单集合只允许指定IP访问80端口:
iptables -A INPUT -p tcp --dport 80 -m set --match-set domain_whitelist src -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP
黑名单同理,将ACCEPT改为DROP,规则顺序重要,白名单规则应放在DROP之前,若需同时匹配源和目标IP,使用--match-set的src或dst参数。
ipset域名与iptables性能对比
匹配效率的差异
传统iptables规则按顺序匹配,每条规则都需检查五元组,当IP列表达到几百条时,CPU开销明显,ipset基于哈希表,时间复杂度O(1),无论集合有100个还是10万个元素,匹配速度几乎不变,行业共识认为,超过1000个独立IP时,ipset的性能优势是一到两个数量级。
管理便捷性对比
| 维度 | iptables逐条规则 | ipset集合 |
|---|---|---|
| 添加/删除IP | 需插入或删除整条规则,影响规则编号 | 直接ipset add/del,不影响其他规则 |
| 批量操作 | 写脚本循环执行iptables,易出错 | 支持文件导入、集合间swap、flush |
| 持久化 | 通过iptables-save/restore | 通过ipset save/restore,格式更简洁 |
| 原子性 | 多条规则需同时操作时无法保证 | 集合操作本身原子,脚本可封装事务 |
内存占用实测参考
在同等IP数量下,ipset哈希表占用内存略高于单条规则,但远低于iptables规则链的元数据开销,据统计,一个包含5000个IP的hash:ip集合,内存占用约3-5MB,而同等数量的iptables规则可能消耗10-15MB,随着规则增长,差距更大。
ipset域名批量封禁场景
攻击IP自动封禁
当网站遭遇DDoS,攻击IP往往来自多个域名,收集恶意域名列表(如从日志、第三方威胁情报),编写脚本定时解析并加入黑名单集合,关键步骤:

- 创建黑名单集合:
ipset create blacklist hash:ip maxelem 1000000 - 编写脚本,解析域名后
ipset add blacklist $ip - iptables规则:
iptables -A INPUT -m set --match-set blacklist src -j DROP - 配合conntrack,已建立的连接不受影响,需配合
-m state --state NEW。 - 脚本执行频率建议与恶意域名TTL匹配,通常每5-10分钟。
CDN节点白名单管理
使用CDN服务时,只允许CDN节点IP访问源站,传统做法是手动维护IP段列表,但CDN厂商会动态增减节点,ipset方案:
- 收集CDN官方域名(如
cdn.example.com),解析出所有A记录。 - 每日或每6小时执行脚本,清空白名单集合后重新添加。
- iptables规则:
iptables -A INPUT -p tcp --dport 443 -m set --match-set cdn_whitelist src -j ACCEPT,其余DROP。 - 注意:若CDN节点同时使用IPv6,需创建hash:ip6集合并添加对应规则。
多服务器同步方案
当有多台后端服务器,需保持ipset集合一致,常用方法:
- 主服务器生成集合文件,通过rsync或scp分发到各节点,触发
ipset restore。 - 使用共享存储(如NFS),所有服务器挂载同一文件,但需注意并发写入。
- 高级方案:使用etcd或consul广播IP变更,各节点监听后调用ipset命令,业内专家指出,此方案适用于大规模集群,但复杂度较高。
ipset域名常见问题与优化
集合大小限制与调整
创建集合时未指定maxelem,默认65536,若需更大,在创建时设置:ipset create big_set hash:ip maxelem 1000000,注意:maxelem太大可能消耗过多内存,建议根据实际IP数量设置,通常10万以内足够。
持久化配置
ipset集合在重启后消失,持久化方法:
- 导出:
ipset save > /etc/ipset/ipset.conf - 恢复:

ipset restore < /etc/ipset/ipset.conf
- 在系统服务中启用自动恢复,如systemd的ipset.service,或写入rc.local,注意:恢复应在iptables规则加载之前执行,否则规则引用空集合会报错。
更新频率与DNS缓存
域名解析脚本不宜执行太频繁,防止被DNS服务器限速,建议根据域名的TTL设定,取TTL的一半,例如TTL为600秒,每300秒执行一次,若域名解析变化不频繁,可延长至1小时,在脚本中增加日志,监控解析失败或异常,避免清空集合。
与iptables规则的兼容性
ipset规则与普通iptables规则可混用,但注意匹配顺序,若集合为空,--match-set会匹配失败,所以先确保集合有数据再加载规则,ipset不支持-m set的--return-nomatch标志,需注意。
ipset域名方案将域名管理与IP集合深度融合,在日常运维和安全防护中展现出极高效率,无论你是搭建CDN白名单,还是构建自动封禁系统,掌握这套技术栈都能显著提升响应速度。
ipset域名常见问题解答
ipset域名集合如何同时用于多个iptables链? 同一个集合可在多个规则中引用,只需在iptables命令中指定相同的集合名,同时在INPUT和FORWARD链中使用-m set --match-set domain_whitelist src,集合更新后所有规则自动生效。
ipset域名集合在重启后iptables规则报错怎么解决? 确保ipset服务在iptables之前启动,在systemd中,可设置iptables.service的After=ipset.service,若手动恢复,先执行ipset restore,再执行iptables-restore。
ipset域名方案是否支持IPv6域名? 支持,创建集合时指定family inet6,如ipset create ipv6list hash:ip family inet6,解析域名时使用dig AAAA,更新脚本中过滤IPv6地址,iptables规则对应使用ip6tables及-m set --match-set ipv6list src。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/684053.html


评论列表(3条)
读了这篇文章,我深有感触。作者对使用的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@影ai577:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是使用部分,给了我很多新的思路。感谢分享这么好的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于使用的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!