配置实践 · Clash 技术博客

OpenClash 与 AdGuard Home DNS 冲突怎么办?

OpenClash 与 AdGuard Home 共用时,53 端口抢占或互相指回上游会造成失败。核对真实监听与查询方向,选择单向转发,分别验证过滤、分流和停用后的解析恢复。

  • OpenClash
  • AdGuard Home
  • DNS
  • OpenWrt
本文目录

两个管理页面都显示运行中,家里的设备却时好时坏,这时反复换 DNS 端口往往难以判断原因。要看清一条查询先到哪个服务、再转给谁,并决定保留终端过滤统计还是优先让域名进入代理规则,之后才能检查停用服务时如何恢复解析。

AdGuard 与 OpenClash 的上游不能互相指回

OpenClash 和 AdGuard Home 都想处理 DNS,但职责不同:AdGuard Home 负责过滤、重写和查询记录,OpenClash 的内核 DNS 负责让域名解析与代理规则配合。两者可以共存,前提是一条查询只沿一个方向前进。

写下终端从 DHCP 得到的 DNS、路由器 53 端口由谁接收、AdGuard 的上游是谁、OpenClash 内核监听在哪个端口。只要查询最终又回到前一个服务,就会形成循环。

同一条查询应按选定方向转发。若另一个插件也会劫持 53 或转发 DNS,停掉其中一套冲突的劫持,并明确两个服务的先后顺序;dnsmasq 的上游应与这条路径一致。

根据你想保留的能力选路径

路径查询方向优点取舍
AdGuard 在前LAN DNS 入口 → AdGuard → OpenClash DNS → 外部上游AdGuard 更容易记录每台终端并先做过滤必须关闭 OpenClash 对 LAN 53 的抢先劫持
OpenClash 在前LAN / dnsmasq → OpenClash → AdGuard → 外部上游域名先进入 OpenClash,Fake-IP 与规则路径更集中AdGuard 通常只看到来自路由器/内核的查询,难以区分每台终端

确认实际监听和转发,不要只看 LuCI 开关

先识别几个入口

入口常见作用不要混淆
路由器 TCP/UDP 53LAN 设备默认访问的 DNS 入口同一个地址端口不能同时被 dnsmasq 与 AdGuard 独占
AdGuard Home DNS 监听接收查询、过滤并转给上游3000 等 Web 管理端口不是 DNS 端口
OpenClash 内核 DNS按模式解析并配合规则常见内部监听为 127.0.0.1:7874,但应以运行页和日志为准
浏览器 DoH / Android 私人 DNS终端直接向外部解析它可能绕过路由器上的两套服务

通过 SSH 登录 OpenWrt,查看 53、OpenClash 内部 DNS 端口以及你为 AdGuard 设置的端口分别由哪个进程监听。若 53 已被占用,另一个服务可能根本没有启动;若两个页面都显示运行,也可能靠防火墙重定向绕过了你以为的顺序。

只读检查
ss -lntup | grep -E '(:53|:7874|:5335)'
uci show dhcp | grep -E 'server|port|noresolv'
logread | grep -Ei 'dnsmasq|AdGuardHome|OpenClash.*DNS' | tail -n 80

先记下这些结果

  • TCP 53 与 UDP 53 的监听进程
  • AdGuard Home 的实际 DNS 监听地址和端口
  • OpenClash 状态页显示的 DNS 监听端口
  • dnsmasq 当前 server 指向
  • 防火墙里是否存在 DNS redirect / hijack
  • 修改前可恢复的 OpenWrt 与 AdGuard 配置备份

要保留 AdGuard 客户端统计,就让它先收到查询

这条路径可以写成“终端的 53 入口 → AdGuard Home → 127.0.0.1:7874 → OpenClash 外部上游”。在 OpenClash 的 DNS 设置里停用本地 DNS 劫持,避免防火墙把 LAN 的 53 查询提前截走。

在 AdGuard Home 的“设置 → DNS 设置 → 上游 DNS 服务器”里删除会产生分叉的其他上游,只保留当前 OpenClash 内核 DNS 监听地址。

127.0.0.1:7874 是 OpenClash 文档中的常见示例,不是可以盲抄的固定值。应从 OpenClash 状态、配置和 ss 输出确认实际端口。

AdGuard 使用 53、dnsmasq 移到其他端口,还是由 dnsmasq 转发到 AdGuard,取决于原来的 OpenWrt 集成。但经转发时,AdGuard 可能只看到转发者,不能保证每台终端的统计。同一条 LAN 查询也只能进入 AdGuard 一次。

改完后按查询顺序逐项确认

  1. AdGuard 能启动

    日志没有 bind: address already in use,TCP 与 UDP 监听都符合预期。

  2. OpenClash DNS 在内部端口监听

    本机能看到 7874 或实际端口由 Mihomo/OpenClash 占用。

  3. 关闭 OpenClash LAN DNS 劫持

    重启后检查防火墙和启动日志,确认没有规则抢在 AdGuard 前面。

  4. AdGuard 只转给 OpenClash

    查询日志出现客户端地址,新的允许域名能得到响应。

更重视 Fake-IP 与规则一致性,就让 OpenClash 先接收查询

这条路径保留 OpenClash 的本地 DNS 劫持,并关闭 AdGuard Home 自己对 LAN 53 的重定向或劫持。让 AdGuard 只在一个不冲突的本机端口监听,例如 127.0.0.1:5335,再在 OpenClash“覆写设置 → DNS 设置”的自定义上游中填写这个实际地址。

AdGuard 的上游必须继续指向真正的外部 DNS,而不是 127.0.0.1:7874、路由器 LAN:53 或任何会重新进入 OpenClash 的地址。

OpenClash 接收终端查询,需要真实解析时再向 AdGuard 请求结果。Fake-IP 查询可能直接返回虚拟地址;通过代理的域名也可能由远端解析,不能保证 AdGuard 过滤全部域名。AdGuard 日志中的客户端往往只剩路由器本机。

方向示意,不是可直接粘贴的端口模板
LAN client
  -> dnsmasq / OpenClash DNS hijack
  -> OpenClash DNS
  -> AdGuard Home 127.0.0.1:5335
  -> external upstream DNS

循环、端口占用与绕过过滤怎样区分?

日志反复出现同一域名,随后 SERVFAIL

常见原因:OpenClash 与 AdGuard 互相作为上游,形成查询循环

处理方法:按查询方向记录每个上游地址,删除把请求送回前一个服务的设置。

AdGuard 查询日志为空,但网页能打开

常见原因:查询可能被 OpenClash 或防火墙提前劫持 53,也可能由 Fake-IP、缓存或终端独立 DNS 处理

处理方法:若选择 AdGuard 在前,关闭冲突劫持并检查 NAT/nftables 规则顺序。

AdGuard 启动失败,提示 address already in use

常见原因:dnsmasq 或另一实例已占用相同地址与端口

处理方法:确定唯一的 53 监听者,再为内部转发选择不同本机端口。

电脑正常,手机偶尔绕过过滤

常见原因:IPv6 DNS、Android 私人 DNS 或浏览器 DoH 直接向外查询

处理方法:测试时统一关闭独立加密 DNS,并检查 DHCPv6/RDNSS 下发。

OpenClash 停止后全屋 DNS 失效

常见原因:唯一上游已指向停止监听的内核端口

处理方法:按修改前的记录恢复 dnsmasq 和 AdGuard 的上游,确认它们不再指向停用端口;从 LAN 终端查询未缓存域名,检查解析是否恢复。

缓存会遮住问题。调整服务顺序后重启相关服务,让测试终端清理 DNS 缓存或重新连接 Wi-Fi,再查询一个从未访问过的域名。反复打开已缓存的网站,只能证明旧答案还在。

验证过滤、分流与停用后的解析恢复

从一台测试电脑完成验收

  1. 确认终端 DNS

    nslookup 输出的 Server 应是计划中的路由器或 AdGuard 地址,不是意外的公网 DNS。

  2. 查询允许域名

    用未缓存域名测试,并确认查询是否实际转发到 AdGuard。需要真实解析时,AdGuard/OpenClash 应按选定方向处理;Fake-IP 答复本身不能证明两端都完成了查询。

  3. 查询过滤规则

    在 AdGuard 临时添加一条测试规则,只验证实际经过它的查询是否符合过滤设置,再删除该规则;这不能证明所有代理域名都被过滤。

  4. 观察代理规则

    访问需要代理的域名,OpenClash 连接记录应保留域名并命中预期策略。

  5. 分别重启服务

    按实际启动顺序重启 AdGuard、dnsmasq 与 OpenClash,监听和上游方向不应变化。

  6. 执行回退

    停用前记录并验证一套不依赖 OpenClash 的可达上游;停用后把 dnsmasq 和 AdGuard 的上游恢复到该设置,再从 LAN 终端查询未缓存域名。

从 LAN 终端做最基本的路径检查
nslookup example.com 192.168.1.1
nslookup www.iana.org 192.168.1.1

确认 53 只有一个预期入口,AdGuard 能按选定顺序看到查询,OpenClash 能取得域名并执行规则,新域名查询不会循环超时。关闭任一组件后,也应能按预案恢复解析。只看两个页面显示“运行中”,不能确认这些结果。

参考资料