当前位置:首页 > 运维技术 > 正文

ipset域名如何正确设置?ipset域名设置方法有哪些

ipset域名是运维人员通过ipset工具批量管理域名对应IP地址的高效方法,在CDN加速、防盗链、分布防护等场景中广泛使用。 它让你从繁琐的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端口:

ipset域名如何正确设置?ipset域名设置方法有哪些 第1张

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自动封禁

当网站遭遇分布,攻破IP往往来自多个域名,收集恶意域名列表(如从日志、第三方威胁情报),编写脚本定时解析并加入黑名单集合,关键步骤:

ipset域名如何正确设置?ipset域名设置方法有哪些 第2张

  • 创建黑名单集合: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域名如何正确设置?ipset域名设置方法有哪些 第3张

  • 导出: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。

0