OpenWrt 上同时装 AdGuard Home、dnsmasq、Mihomo 时,最容易出事的不是过滤规则,而是 53 端口归属。DNS 服务启动失败、内网主机名消失、Mihomo 规则域名不命中,三种现象经常混在一起。
先别改一堆上游。拿到路由器 shell,先看 53、54、1053 三个端口。
netstat -lntup | grep -E ':53|:54|:1053'
logread -e AdGuardHome
logread -e dnsmasq
53、54、1053 分别给谁?
| 端口 | 建议归属 | 作用 | 先看哪里 |
|---|---|---|---|
| 53 | AdGuard Home | 局域网 DNS 主入口、过滤和查询记录 | AdGuardHome.yaml 的 dns.port |
| 54 | dnsmasq | DHCP、本地域名、PTR/rDNS | /etc/config/dhcp 的 dnsmasq.port |
| 1053 | Mihomo | 客户端内部 DNS 或规则解析 | Mihomo YAML 的 dns.listen |
OpenWrt 文档给出的思路很直接:AdGuard Home 做入口,dnsmasq 保留本地网络能力。Mihomo 如果也要处理 DNS,就放在内部端口,不要再对 LAN 监听 53。
dnsmasq 为什么要移到 54?
在 OpenWrt 上,dnsmasq 不只是 DNS。它还管 DHCP 租约、本地域名和反查。直接停掉它,会让 router.lan、主机名和客户端列表都变难看。
可以先做最小改动:
uci set dhcp.@dnsmasq[0].port='54'
uci set dhcp.@dnsmasq[0].domain='lan'
uci set dhcp.@dnsmasq[0].local='/lan/'
uci set dhcp.@dnsmasq[0].expandhosts='1'
uci set dhcp.@dnsmasq[0].noresolv='1'
uci commit dhcp
service dnsmasq restart
如果你照 OpenWrt 官方脚本改 DHCP option 6,让客户端拿到路由器 IP 作为 DNS,也要记得只会影响 LAN 接口。访客网、IoT 网段或自定义接口要单独处理。
AdGuard Home 哪些字段最容易写错?
AdGuard Home 的主配置通常是 /etc/adguardhome/adguardhome.yaml。官方 wiki 提醒过,手工改配置前要先停服务,否则运行中的进程可能把改动覆盖掉。
关键字段是这些:
dns:
bind_hosts:
- 0.0.0.0
port: 53
upstream_dns:
- https://dns.cloudflare.com/dns-query
local_ptr_upstreams:
- 127.0.0.1:54
use_private_ptr_resolvers: true
Web UI 不要和 LuCI 抢 80/443。OpenWrt 文档的首次设置示例是 http://192.168.1.1:3000/,配置完成后把管理界面放到 192.168.1.1:8080 这类端口。
本地域名转发在 AdGuard Home 里这样写:
[/lan/]127.0.0.1:54
[//]127.0.0.1:54
[//] 是未带点的短主机名。文档也提醒过,它可能影响个别应用的解析行为;如果遇到奇怪的 App 问题,先只保留 [/lan/]127.0.0.1:54 测一次。
Mihomo DNS 为什么只听 127.0.0.1:1053?
Mihomo DNS 文档里的 listen 是 DNS 服务监听地址。它支持 UDP 和 TCP,示例可以写成 0.0.0.0:1053。放在路由器共用环境里,更稳妥的是只监听本机:
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- https://dns.cloudflare.com/dns-query
fake-ip-filter:
- '*.lan'
- router.lan
enhanced-mode 只有 fake-ip 和 redir-host 两类。排错时先固定一种,不要同时改 Fake-IP、上游和路由规则。fake-ip-filter 里放内网域名,能减少本地设备被分到 Fake-IP 的情况。
怎么确认真的修好了?
第一步,看端口:
netstat -lntup | grep -E ':53|:54|:1053'
第二步,看本地域名:
nslookup router.lan 192.168.1.1
nslookup 1.1.168.192.in-addr.arpa 192.168.1.1
第三步,看外部域名是否进入预期链路:
nslookup example.com 192.168.1.1
logread -e AdGuardHome
如果 53 端口已经被占,日志里常见的是 bind: address already in use。如果上游写回了自己,AdGuard Home 查询记录里会出现反复转发,Mihomo 侧也可能只有 DNS 超时,看不到规则命中。
什么时候该停手回滚?
下面几种情况先回滚到上一个能启动的配置:
netstat显示两个进程都在尝试监听 53。- AdGuard Home 上游写了
127.0.0.1:53,而它自己也监听 53。 - dnsmasq 被停掉后 DHCP 租约和本地域名一起失效。
- Mihomo 的
dns.listen暴露到 LAN,但你并不打算让它做局域网 DNS 入口。
DNS 链路修好后,再去看规则分流和客户端策略组。入口没稳时,测速结果没有参考价值。
相关阅读
FAQ
AdGuard Home 和 dnsmasq 谁应该监听 53?
OpenWrt 官方指南采用 AdGuard Home 监听 53、dnsmasq 移到 54 的方案。这样客户端 DNS 先进入 AdGuard Home,本地域名和 PTR 再转回 dnsmasq。
Mihomo DNS 还要不要开?
可以开,但别让它抢局域网 53。把 dns.listen 写成 127.0.0.1:1053 或由客户端内部调用,再用规则决定哪些域名交给 Mihomo。
为什么改完后 router.lan 解析不到?
多半是 AdGuard Home 没把 lan 或 unqualified names 转给 dnsmasq。检查上游里是否有 [/lan/]127.0.0.1:54 和私有反查服务器。
看到 bind: address already in use 先查什么?
先查端口占用,不要先改过滤规则。netstat -lntup 或 ss -lntup 能直接看到 53 被 AdGuard Home、dnsmasq 还是其它进程占用。