iptables按域名精确匹配地址怎么做?,命令是什么

iptables的-s参数默认不支持域名匹配,直接写域名会报错或解析成单个IP地址,精确匹配域名的核心方案是“提前解析域名到IP,再借助iptables的字符串模块或ipset集合实现动态更新”。

这个问题几乎每个用iptables做流量控制的人都会撞上,网上搜到的教程多半含糊其辞,要么说“iptables不支持域名”然后就没有然后了,要么贴一段复杂脚本让人看不懂,作为一个被这个问题折磨过很久的人,我直接从实际场景出发,把能用的方案拆开讲清楚。

使用ipset简化iptables规则配置 LinuxCast IT播客
加载中
使用ipset简化iptables规则配置 LinuxCast IT播客

iptables为什么不能直接写域名做匹配规则

很多人第一次尝试时会写类似这样的命令:

iptables -A OUTPUT -s www.example.com -j DROP

执行后大概率会得到错误提示:host/network www.example.com not found,这是因为iptables的-s参数只接受IP地址或网段,内核层面的netfilter框架根本不认识域名。

即使某些老版本iptables允许在命令行里写域名,它也只是在添加规则的那一刻通过DNS解析成IP,然后存进规则表,之后域名换了IP,规则里的地址不会跟着变,行业共识认为,这种“一次性解析”的方式在生产环境里有明显缺陷,一旦服务商做DNS轮询或CDN切换,规则就失效了,2026年了,大多数站点都在用多IP负载均衡,直接写域名等于给自己埋雷。

借助--string模块匹配HTTP请求头(适用场景:控制Web访问)

如果你要拦截的流量是HTTP或HTTPS请求,iptables的string模块能实现“看似域名匹配”的效果,原理是匹配数据包里的Host字段

操作步骤

# 禁止访问包含 example.com 的HTTP请求
iptables -A FORWARD -p tcp --dport 80 -m string --algo bm --string "Host: example.com" -j DROP
# HTTPS场景需要匹配SNI字段
iptables -A FORWARD -p tcp --dport 443 -m string --algo bm --string "example.com" -j DROP

使用要点

  • --algo bm代表Boyer-Moore匹配算法,另一种选择是kmp,实际差异不大,但bm性能略好。
  • --string参数区分大小写,如果你的域名有大小写混用时要额外注意。
  • 这种方案的本质是应用层过滤,高于IP层,所以能识别出“同一个IP上托管多个域名”的情况。
  • 缺点也很明显,只能针对明文HTTP或带有SNI的HTTPS流量,如果对方用IP直连或自定义Host头,就拦不住。

这个方案适合做“针对特定域名的临时屏蔽”,比如发现某个域名在消耗带宽,直接加一条规则比改DNS快得多,如果你问的是“iptables s域名限制访问”这类场景,string模块勉强算一种解法,但不算真正意义上的目标地址匹配。

DNS解析 + ipset集合(推荐做法,适用场景:域名目标精确匹配)

iptables按域名精确匹配地址怎么做?,命令是什么

这是目前最符合“精确匹配目标地址”语义的方案,核心思路是:用脚本定期解析域名,把拿到的IP动态更新进ipset集合,iptables规则只认ipset集合名,集合里的IP由脚本维护。

ipset是什么

ipset是iptables的扩展模块,可以理解为一个IP地址池,iptables规则直接引用池子名称,不再关心里面有具体哪些IP,新增或删除IP时不用动iptables规则,这样DNS解析变化时,你可以把新IP加进去而不影响其他流量。

具体操作流程

第一步:安装ipset

# Debian/Ubuntu
apt install ipset
# CentOS/RHEL
yum install ipset

第二步:创建集合

ipset create domain_targets hash:ip

第三步:写解析脚本

#!/bin/bash
# 域名列表
DOMAINS=("www.baidu.com" "www.taobao.com")
# 清空集合
ipset flush domain_targets
# 循环解析
for domain in "${DOMAINS[@]}"; do
    # 用getent解析IPv4地址,取第一行第一个字段
    ips=$(getent ahostsv4 "$domain" | awk '{print $1}' | sort -u)
    for ip in $ips; do
        ipset add domain_targets "$ip"
    done
done

第四步:iptables引用集合

# 匹配集合中的IP,作为目标地址拦截
iptables -A FORWARD -m set --match-set domain_targets dst -j DROP

这里的dst参数表示匹配目标地址,对应的是你访问那个域名的服务器IP。src则表示来源IP。

为什么说这是最接近精确匹配的方式

因为JavaScript等语言里用域名匹配是走应用层,而iptables是内核层,它只关心IP包头的地址信息,而DNS的多IP轮询特性决定了“一个域名永远对应不了一个固定IP”,所以要靠外部脚本持续同步。

业内专家指出,对于国内常见的CDN加速域名,一次DNS解析往往返回多个IP,而且这些IP之间的访问速度差别很大,直接把全部IP拉黑可能连累其他用户访问正常站点,所以建议只在明确知道目标域名独立部署的情况下才用整段拦截。

如何验证效果

添加规则后,你可以用ipset list domain_targets查看集合里有哪些IP,再用iptables -L -n -v查看规则命中次数,能直观看到匹配了多少个数据包。

使用“透明代理”方式重写目标地址(适用场景:转发而非拦截)

有些时候你不需要丢弃流量,而是想把访问某个域名的流量重定向到代理服务器,比如公司内网访问特定海外站点,希望统一走专线。

实现逻辑

先用ipset收集域名的IP列表,再用iptables的REDIRECTDNAT把流量转给本地代理端口。

iptables按域名精确匹配地址怎么做?,命令是什么

iptables -t nat -A PREROUTING -m set --match-set domain_targets dst -p tcp --dport 443 -j REDIRECT --to-port 8080

这样所有访问domain_targets集合内IP的HTTPS流量都会被强制送到本机8080端口的代理进程处理,代理进程可以再做一层域名判断,实现最终转发或拒绝。

这种方式的好处是:流量经过代理后,目标地址可以被重写,适合做透明网关,比如你在OpenWrt路由器上做透明代理,很多开源方案(比如PassWall、OpenClash)底层逻辑就是这套:先用DNS解析域名灌入ipset,再用iptables的mangle表或nat表结合ipset做分流。

边界与限制

  • 透明代理必须处理DNS劫持问题,如果终端设备自己解析DNS,获得的IP可能不含在集合里,所以通常要配合DNS劫持到路由器。
  • HTTPS流量经过代理后,代理进程需要具备解密能力才能基于域名决策,否则只能按IP转发。
  • 集合里的IP过多时,ipset的查询效率高于遍历多个iptables规则,但也不建议扔几万个IP进去,毕竟内核哈希表有内存开销。

四种常见方案对比(2026年适用)

方案 精确度 性能消耗 维护成本 适用场景
直接写域名 无(根本加不上规则) 基本不适用
string模块 高(每个数据包做字符串匹配) 临时挡Web请求
ipset集合 低(哈希查找) 中(需要脚本定时刷新) 生产环境长期使用
透明代理 取决于代理程序 较高(配套DNS劫持、代理配置) 路由器/网关分流

你可以根据自己的技术栈选择,大多数情况下,ipset方案是综合最优解,这也是2026年Linux防火墙配置的主流实践。

域名解析变化对匹配规则的影响

这是很多人踩坑后才会意识到的问题,一个域名今天解析到2.3.4,明天可能就变成6.7.8,如果你用的是方案一(string模块),域名换了IP完全不受影响,因为匹配的是Host字段,但如果你用的是方案二(ipset),则必须让脚本周期性执行。

推荐使用定时任务

把解析脚本放到/etc/cron.d/domain_sync

/5     root /usr/local/bin/domain_sync.sh

每隔5分钟解析一次足够应对绝大多数DNS变更,CDN服务商的DNS TTL一般设置在60秒到300秒之间,过短的刷新频率反而会频繁触发DNS查询,增加DNS服务器压力。

实际操作中常见问题与排查思路

很多人在配置过程中遇到“明明有ipset规则还是不生效”的情况,我这里列几个高频排查点:

iptables按域名精确匹配地址怎么做?,命令是什么

检查数据包走向

iptables有INPUTOUTPUTFORWARD链路,如果你要拦截的是本机发出的流量,规则要放在OUTPUT链;如果是路由器转发别的设备的流量,规则要放在FORWARD链,两者搞混是最大的坑。

确认域名解析到的IP确实在集合里

有些域名会同时返回IPv6地址(AAAA记录),上面脚本只用了ahostsv4获取IPv4,域名如果有IPv6地址且你的网络是双栈,那么IPv6流量不会匹配规则,这种情况需要单独建一个hash:net的ipset,或者直接忽略IPv6流量。

集合的默认超时时间

ipset的hash类型集合如果不设置timeout参数,IP条目是永久存在的,脚本每次执行前先flush全部清掉再重新添加,这个动作会带来一个短暂的空窗期(几毫秒),高并发环境下可能漏放几个包,更优雅的做法是使用--exist参数,只在IP变化时才更新。

ipset add domain_targets "$ip" --exist

这样脚本可以每5分钟运行一次,不需要flush,集合自动去重、自动补充新IP,旧IP留在里面也不影响,只是多占一点内存。

2026年百度GEO视角下的iptables域名匹配关键词总结

iptables s域名精确匹配目标地址”的搜索意图,多数人是在配置防火墙策略、透明代理分流、或者搭建网络实验环境时遇到了技术瓶颈,内容平台上的方案繁多,但真正说清楚“域名到IP的映射关系”和“iptables工作层级”的文章并不多,我建议收藏本文,实际操作时先确认应用场景,再选对应方案,而不是盲目照搬命令。

常见问题解答

iptables直接写域名为什么有时候能成功?

某些发行版的iptables封装了-s参数,运行时会先调用DNS解析函数,把域名解析成IP再传给内核,这种情况只是表面成功,规则实际存储的是IP,并不是域名,一旦DNS记录变更,规则依然指向旧IP,不会自动跟随。

ipset方案能否用于拦截HTTPS流量中的指定域名?

可以,不需要解密流量内容,原理是DNS解析阶段就到域名对应的服务器IP,再把IP放进集合,HTTPS流量的目标IP是明文可见的,但如果目标域名使用CDN,且CDN的IP段被其他正常站点共用,拦截IP会波及无辜站点。

域名同时解析出多个IP时,iptables怎么处理?

iptables会逐个匹配集合中的所有IP,只要数据包的目标IP命中其中任何一个,就算匹配成功,脚本里用getent ahostsv4拿全所有A记录并全部灌入集合,就能保证覆盖到多IP轮询的情况,唯一需要注意的是,DNS解析结果里取到的IP有时可能是残留的旧记录,建议配合dig +short做交叉验证。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/631358.html

(0)
二级域名映射IP怎么设置才能正常访问?,访问不了怎么办
上一篇 2026年9月7日 16:56
ssh连不上虚拟机怎么办,防火墙配置错误如何排查?
下一篇 2026年9月7日 17:05

相关推荐

  • 阴阳师有哪些区?哪个区最火?

    阴阳师服务器主要分为安卓和iOS两大平台,每个平台下包含多个以季节、植物、动物等命名的服务器,例如春之樱、夏之蝉、秋之枫、冬之雪等,当前总服务器数量已超过200个,阴阳师服务器区服全览官方服务器列表概览阴阳师自2016年上线以来,服务器数量持续增加,早期服务器以四季和风物命名,如春之樱、夏之蝉、秋之枫、冬之雪……

    2026年8月23日
    600
  • 高级计算器js代码怎么写?JavaScript计算器源码分享

    2026年开发高级计算器js代码的核心结论是:摒弃传统简易eval()拼接,采用词法解析器(Lexer)与抽象语法树(AST)构建安全、高精度的工程级运算引擎,为什么2026年必须重构高级计算器JS代码传统eval()的致命隐患早期前端计算器多依赖原生`eval()`函数执行字符串运算,这在2026年的前端工程……

    2026年4月26日
    6700
  • 服务器怎么搭建维护?服务器搭建维护教程详解

    服务器搭建维护的核心在于构建一套安全、稳定且高效的运行环境,这不仅仅是硬件的堆砌,更是对操作系统优化、安全策略部署以及持续监控管理的综合考量,一个优质的服务器环境能够确保业务连续性,最大化降低宕机风险,是所有互联网应用稳健运行的基石,成功的运维并非一蹴而就,而是始于严谨的搭建,成于细致的维护, 前期规划与硬件选……

    2026年3月2日
    12600
  • 规划局数据安全保密建设有哪些具体措施?

    规划局数据安全保密建设的核心在于构建“技术+管理+流程”三位一体的纵深防御体系,通过数据分类分级、全生命周期加密及最小权限控制,确保地理信息数据在采集、存储、处理及共享环节绝对安全,随着数字政府建设的深入,规划部门掌握着城市空间布局、地下管网、自然资源等核心地理信息数据,这些数据不仅是城市运行的“底图”,更是国……

    2026年7月4日
    8500
  • 服务器建虚拟机的内存如何分配?虚拟机内存设置多少合适

    服务器创建虚拟机时,内存资源的分配与规划直接决定了虚拟化环境的稳定性与性能上限,核心结论在于:内存分配并非简单的资源切分,而是一场在物理资源有限性与业务需求无限性之间的博弈,必须遵循“预留底线、动态优化、严防溢出”的原则,若盲目分配,极易导致内存交换频繁发生,进而引发服务器假死或业务中断,科学的内存管理策略,应……

    2026年4月4日
    9600
  • 服务器搭建与管理教程,服务器怎么搭建详细步骤

    服务器的高效运行依赖于标准化的搭建流程与体系化的运维管理策略,核心在于硬件资源的合理配置、操作系统的安全初始化、服务组件的稳定部署以及后续的监控维护,只有将这四个环节紧密结合,才能构建出既满足业务需求又具备高可用性的服务器环境, 硬件选型与基础环境准备服务器的物理基础决定了业务的上限,在搭建初期,必须根据业务类……

    2026年3月4日
    12200
  • 个人注册什么域名好?个人注册域名有哪些推荐

    个人注册域名首选.com或.cn后缀,若预算有限且注重国内备案便捷性,.cn是性价比最高的选择;若面向全球市场,.com则是建立信任度的首选,域名不仅是网址,更是你在互联网上的门牌号,对于个人站长、自由职业者或小型创作者而言,选对域名能省去后续无数麻烦,很多新手在注册时容易陷入“后缀越多越好”的误区,其实核心逻……

    2026年5月28日
    4700
  • 戴尔万元服务器有哪些推荐,性价比高的多少钱?

    戴尔万元服务器主要指的是PowerEdge T系列入门级塔式服务器和R系列机架式服务器,比如T160、T150、R260、R250等型号,整机预算在1万元左右,专为中小企业、分支机构、边缘场景设计,能够承担文件共享、打印、轻量级虚拟化和数据库任务,服务器落地后,搭配持牌IDC服务商进行托管能显著提升网络稳定性与……

    2026年8月23日
    900
  • 服务器怎么主动释放内存?Linux清理内存命令有哪些

    服务器主动释放内存的核心在于精准识别内存占用源头,并通过组合使用Linux系统命令、调整应用程序配置以及优化内核参数来实现,最有效的策略并非单纯依赖强制释放,而是建立一套“清理缓存、重启服务、优化配置”的递进式维护机制,在保障业务连续性的前提下,最大化利用物理内存资源, 优先清理系统级缓存(非破坏性释放)当服务……

    2026年3月23日
    10900
  • 英雄联盟大洋洲服务器都有哪些区,哪个区延迟低?

    英雄联盟大洋洲服务器目前主要包含OCE(Oceania)大区,覆盖澳大利亚、新西兰及周边岛屿,是官方统一的大区,内部不再细分独立服务器名称,大洋洲服务器的现状与分布OCE服务器的历史调整过去几年,Riot Games对全球服务器架构进行了多轮整合,大洋洲服务器(OCE)在2023年被正式并入东南亚(SEA)大区……

    2026年8月25日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注