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的REDIRECT或DNAT把流量转给本地代理端口。

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有INPUT、OUTPUT、FORWARD链路,如果你要拦截的是本机发出的流量,规则要放在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/iptables%e6%8c%89%e5%9f%9f%e5%90%8d%e7%b2%be%e7%a1%ae%e5%8c%b9%e9%85%8d%e5%9c%b0%e5%9d%80%e6%80%8e%e4%b9%88%e5%81%9a%ef%bc%9f%e5%91%bd%e4%bb%a4%e6%98%af%e4%bb%80%e4%b9%88/

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

相关推荐

  • 服务器快照资费怎么算,服务器快照备份多少钱一次

    服务器快照资费的核心在于理解“存储成本”与“数据价值”的平衡,企业应建立分级备份策略,利用生命周期管理功能,将备份成本控制在云服务器租赁费用的10%-15%以内,避免因盲目全量备份导致的资源浪费,服务器快照资费的形成机制与计费模式云服务商对快照的收费并非单一维度,而是基于底层存储资源的消耗,了解计费逻辑是实现成……

    2026年3月24日
    9300
  • 个人网站域名免费注册,个人网站域名怎么免费注册

    个人网站域名无法真正“免费”获得,但通过特定注册商的活动或赠送策略,你可以以零现金成本获取.com/.cn等主流域名,前提是接受其后续续费的高昂费用或域名后缀的非主流性,很多人对“免费域名”抱有幻想,认为存在一种永久的、无隐藏成本的完美方案,事实是,互联网基础设施是有成本的,域名注册局向注册商收费,注册商再向用……

    服务器运维 2026年5月25日
    4800
  • 莞城智慧停车怎么收费?东莞莞城路边停车收费标准

    莞城智慧停车已实现全区覆盖,核心结论是:通过“莞城停车”小程序或APP可实时查询空位并在线缴费,路边泊位实行分时段差异化收费,首小时通常免费或低价,超时后按阶梯计费,彻底解决“找位难、缴费繁”的痛点,莞城智慧停车收费模式与价格体系解析路边泊位分时段差异化计费规则莞城作为东莞的老城区,道路资源紧张,智慧停车系统采……

    2026年7月8日
    11600
  • 游戏中哪些服务器有铭文?,怎么查询完整列表信息

    有铭文的服务器,指的是机身带有品牌标识、型号和序列号的正规品牌服务器,目前市面上主流的铭文服务器来自戴尔、浪潮、新华三、华为、联想等厂商,铭文是服务器的”身份证”,它决定了硬件来源是否可靠、售后是否有保障、配置是否可追溯,采购时务必先看铭文再谈配置,什么是”有铭文”的服务器很多刚接触服务器的人会问:铭文是什么……

    2026年8月28日
    600
  • 服务器更换方案怎么做,企业服务器迁移流程详解

    服务器更换不仅仅是硬件升级或云厂商迁移,而是一项涉及业务连续性、数据安全和未来扩展性的系统工程,核心结论在于:成功的迁移必须建立在“零停机”或“最小化停机”策略之上,通过严格的预演、灰度发布及完善的回滚机制来保障业务平稳过渡, 制定一份科学的服务器更换方案是确保这一过程万无一失的前提,它要求技术人员在执行前对现……

    2026年2月24日
    13800
  • 个人数据安全如何法律保护?个人信息泄露怎么维权

    个人数据安全法律保护的核心在于构建“事前授权明确、事中监控透明、事后追责有力”的全链条合规体系,用户需主动行使知情权与删除权,企业则必须落实数据最小化采集原则,在数字化生存的今天,你的每一次点击、每一笔消费甚至每一次位置移动,都在被转化为数据资产,很多人误以为隐私保护只是设置一个复杂的密码,或者勾选几个“同意……

    服务器运维 2026年6月3日
    4600
  • 个人域名有哪些?个人域名注册流程及注意事项

    个人域名的核心价值在于建立独立的网络身份标识,相比社交媒体账号,它能提供永久所有权、品牌自主权及更高的搜索信任度,是构建个人IP或专业展示面的最佳基础设施,在数字化生存成为常态的2026年,拥有一个专属域名已不再是科技极客的专利,而是个人品牌建设的标配,很多人误以为有了微信公众号或抖音账号就足够了,但平台算法的……

    2026年5月31日
    4400
  • 银行业务服务器有哪些知名品牌和主流型号,哪个牌子好

    银行业务服务器主要分为核心交易服务器、外围渠道服务器、数据分析与风控服务器以及容灾备份服务器四大类,分别承担账务处理、客户交互、智能决策与安全兜底职能,银行业务服务器的核心分类与场景银行IT架构像个庞大的齿轮组,不同服务器各司其职,咱们从业务链路的先后顺序拆解,看看每一类服务器到底在忙什么,核心交易服务器:账务……

    2026年8月6日
    1300
  • 个人可以做域名解析吗?如何设置域名解析

    个人完全可以自己做域名解析,只需登录域名注册商后台,添加对应的A记录或CNAME记录即可,无需购买额外服务或具备编程基础,很多人认为域名解析是网站管理员或IT专家的特权,实际上它只是将人类易记的域名(如 example.com)转换为计算机可识别的IP地址(如 192.0.2.1)的过程,这一操作就像给房子贴门……

    2026年6月12日
    3700
  • 互联网的服务器都有哪些类型,怎么选最合适

    互联网服务器从形态上主要分为物理服务器、虚拟专用服务器(VPS)、云服务器和边缘服务器,选择哪种取决于业务规模、预算和性能需求,物理服务器:独占硬件资源物理服务器是传统意义上的独立硬件,用户拥有完整的计算、内存和存储资源,不与其他租户共享,这种架构适合对性能、安全性和合规性要求极高的场景,例如金融交易系统、核心……

    2026年8月21日
    700

发表回复

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