贤者云 | xianzhey.shop

Mihomo DNS 配置怎么设置?从最小 YAML 到 TUN 排查

更新于 2026-11-05 · xianzhey.shop

简答:Mihomo DNS 配置通常写在当前运行实例加载的 YAML 的 dns: 段。最快路径是:先确认生效配置并备份,只加入 enable、listen、enhanced-mode、ipv6 和 nameserver;重载后分别验证端口监听、Mihomo DNS 查询和页面加载。TUN 的 dns-mode、dns-hijack、strict-route 必须写在 tun: 段,改坏后直接恢复备份。

定义:Mihomo DNS 配置,是通过 YAML 中的 dns: 节点设置内置 DNS 是否启用、监听地址、解析模式、上游 DNS 和按域名分流规则。

先照做的 3 步速查卡

第一步:确认当前生效的配置。图形客户端可能通过订阅生成、Merge、Script 或配置覆写形成最终运行配置,不能只凭文件名判断。命令行服务可先检查启动参数;官方 systemd 示例使用 /etc/mihomo 作为配置目录,并通过 -d /etc/mihomo 启动。参考Mihomo 服务启动文档。

第二步:备份后只加入最小 DNS 段。同一个最终配置中只保留一个需要生效的 dns: 节点,使用空格缩进,不要用 Tab。先监听本机高位端口,不要一开始监听公网地址。

第三步:分层验证。先看端口是否监听,再用 Mihomo API 的 /dns/query 验证内置 DNS 是否能查询,最后测试系统代理或 TUN 下的网页加载。一个域名能返回 IP,不代表代理连接和页面加载也一定成功。

下面这份配置只用于起步验证,DNS 上游地址是语法示例,不代表在所有网络、设备或地区都可达。

dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: redir-host
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query

官方文档确认 listen 支持 UDP 和 TCP,enhanced-mode 可选 fake-ip 或 redir-host,默认值为 redir-host。Mihomo DNS 配置文档

预期结果:配置重载没有 YAML 错误,端口处于监听状态,API 查询能返回 DNS 响应。若重载失败,先恢复备份,再只改一个字段。

配置文件在哪里:不要改错文件

如果使用命令行服务,启动参数通常能决定配置目录;官方 systemd 示例把配置复制到 /etc/mihomo/config.yaml,并用 mihomo -d /etc/mihomo 启动。若你使用的是桌面或移动客户端,界面可能不同,应在配置详情、运行配置、配置文件管理或日志页面确认当前加载对象。

如果客户端有订阅生成、Merge 或 Script,手写文件可能在重载或更新订阅后被覆盖。此时优先查看 Mihomo API 的运行配置接口:官方文档说明 GET /configs 会返回当前运行配置,包括端口、模式、IPv6 和 TUN 等字段;API 地址和密钥以你的 external-controller 配置为准。Mihomo API 文档

可以用下面的请求检查运行配置,其中 127.0.0.1:9090 和密钥只是占位符,不要直接照抄到未核实的环境:

curl -H "Authorization: Bearer YOUR_SECRET" http://127.0.0.1:9090/configs

如果返回内容中的 dns、tun 或监听端口与文件不一致,说明你查看的文件不是最终运行配置,或者存在客户端覆写。

核心字段怎么填:先理解解析链路

字段作用建议常见误区
enable启用 Mihomo 内置 DNS;设为 false 时使用系统 DNS。最小配置中可设为 true开启后不代表所有应用都已经把 DNS 请求交给 Mihomo。
listen设置 DNS 服务监听地址和端口,支持 UDP、TCP。先用 127.0.0.1:1053直接使用 0.0.0.0:53 可能遇到端口冲突,也会扩大服务暴露范围。
ipv6控制是否解析 IPv6;关闭时 AAAA 查询返回空解析。按实际 IPv6 网络决定关闭 IPv6 不能替代完整的 IPv6 路由排查。
enhanced-mode选择 fake-ip 或 redir-host。首次排错先用 redir-host切换到 Fake-IP 后,局域网和部分应用可能需要过滤。
default-nameserver用于解析 DNS 服务器域名等基础地址。只有需要时再加官方文档要求使用 IP,也可以使用加密 DNS。
nameserver常规域名查询使用的默认 DNS。最小配置中的主要字段上游能返回结果,不等于网页、代理和应用都可用。
fallback提供备用解析服务器。基础链路正常后再加不会自动保证更快,也不代表所有上游都可达。
nameserver-policy按域名或规则集指定解析服务器,优先于普通 nameserver/fallback 查询。有明确分流需求再加域名通配符、规则集和当前构建支持情况要逐项核对。
proxy-server-nameserver仅用于解析代理节点域名。节点域名解析失败时考虑不是普通域名解析的替代项。
direct-nameserver指定 direct 出口使用的 DNS。有直连分流需求再加是否遵循 nameserver-policy 还受 direct-nameserver-follow-policy 影响。

官方文档还说明,respect-rules 会让 DNS 连接遵守路由规则,并要求配置 proxy-server-nameserver;同时不建议与 prefer-h3 一起使用。Mihomo DNS 配置文档

Fake-IP 和 redir-host 怎么选

redir-host 返回实际解析结果,更适合先确认普通系统代理、域名解析和局域网访问是否正常。fake-ip 会为域名返回 Fake-IP 映射,适合需要更完整接管 DNS 与流量识别的场景,但局域网域名、设备发现或特定应用可能需要过滤。

切换时只改一个变量。先备份配置,将 enhanced-mode 设置为 redir-host,重载后测试普通网页和局域网;确认基础链路后,再按实际需求切换到 fake-ip。

dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter-mode: blacklist
fake-ip-filter:
- '*.lan'
- '*.local'
nameserver:
- system

官方文档确认 fake-ip-filter 支持域名通配符和导入域名集合,fake-ip-filter-mode 可选 blacklist、whitelist 或 rule。除非明确知道用途,不要修改 fake-ip-ttl。Mihomo DNS 配置文档

如果 Fake-IP 导致局域网设备异常,先切回 redir-host 做对照,再增加少量明确的过滤项,不要一次加入大批规则。

普通代理、TUN、局域网软路由怎么区分

场景先配置什么验证方式失败时回滚
普通系统代理dns.enable、dns.listen、dns.nameserver先查端口,再查 API DNS 查询,最后测试支持系统代理的应用恢复最小 DNS 配置,暂时关闭额外分流
TUNtun.enable、auto-route、dns-mode、dns-hijack,按系统考虑 strict-route 或 auto-redirect分别测试系统 DNS、TUN 下网页和局域网关闭 TUN,回到系统代理
局域网或软路由明确监听网卡、允许网段、防火墙和路由范围从局域网另一设备查询指定 DNS 地址恢复回环监听,撤销局域网开放

TUN 字段的正确层级

上一稿中最容易误导的是把 TUN 字段层级写错。当前官方示例把 dns-mode、dns-hijack 和 strict-route 放在 tun: 下,而不是放在 dns: 下:

tun:
enable: true
auto-route: true
auto-detect-interface: true
dns-mode: hijack
dns-hijack:
- any:53
- tcp://any:53
strict-route: true

官方文档定义:disabled 不设置系统 DNS,native 把 TUN 地址设为系统 DNS,hijack 在此基础上拦截其他接口发往 53 端口的流量。Windows 使用 hijack 时需要 strict-route,Linux 需要 auto-redirect。Mihomo TUN 配置文档

官方还明确提示:Windows 和 macOS 不能自动劫持发往局域网的 DNS 请求;Android 开启 Private DNS 时,DNS 请求也不能被自动劫持。因此 TUN 开启后仍可能出现局域网异常或 DNS 未接管,应该先关闭 TUN 做对照,而不是长期关闭系统安全功能。

系统级验证:端口、DNS、日志和 API

Windows:检查 1053 端口。适用 PowerShell。命令为 Get-NetTCPConnection -LocalPort 1053 -ErrorAction SilentlyContinue;如果没有返回,不能证明 UDP 一定没有监听,还要结合客户端日志或 API 查询。测试 TCP 端口可使用 Test-NetConnection 127.0.0.1 -Port 1053。若端口未监听,先检查 YAML、端口冲突和客户端实际加载的配置。

macOS:检查 UDP/TCP 监听。适用终端。命令为 lsof -nP -iUDP:1053 -iTCP:1053。没有结果时,检查客户端是否启动、配置是否重载,以及是否被其他进程占用。

Linux:检查监听和服务日志。适用 systemd 服务。命令为 ss -lntup | grep 1053,再执行 systemctl status mihomo 和 journalctl -u mihomo -o cat -e。官方服务文档提供了这些服务状态和日志检查路径。Mihomo 服务启动文档

跨系统:用 API 查询 Mihomo DNS。官方 API 提供 /dns/query,请求参数包括 name 和 type。示例为 curl -H "Authorization: Bearer YOUR_SECRET" "http://127.0.0.1:9090/dns/query?name=example.com&type=A"。返回 DNS 状态和 Answer,说明内置 DNS 模块至少完成了一次查询;这仍不等于系统流量已经被接管或代理节点可以连接。Mihomo API 文档

清理缓存后复测。API 文档提供 POST /cache/dns/flush 和 POST /cache/fakeip/flush。只有在确认 API 地址、密钥和当前配置后再使用,不要把控制器端口暴露到不可信网络。

nameserver、fallback 和分流的稳妥写法

可以把解析链路分成四层:default-nameserver 负责解析 DNS 服务器域名等基础地址;nameserver 负责一般域名查询;fallback 提供备用路径;nameserver-policy 对特定域名或规则集覆盖普通选择。

下面是扩展示例,仍然只展示字段关系,不代表上游一定适合你的网络:

dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: redir-host
default-nameserver:
- 1.1.1.1
nameserver:
- system
fallback:
- tls://1.1.1.1
nameserver-policy:
'+.lan':
- system
proxy-server-nameserver:
- system
direct-nameserver:
- system
direct-nameserver-follow-policy: false

如果你的网络无法访问某种 DNS 类型,不要只凭配置示例判断故障。官方文档列出了 UDP、TCP、DoT、DoH、DoQ、system 和 dhcp 等 DNS 类型;实际选择应结合网络可达性、应用兼容性和隐私要求逐项测试。Mihomo DNS 类型文档

respect-rules 不建议作为第一步就开启。它会让 DNS 连接遵守路由规则,并要求配置 proxy-server-nameserver,否则可能出现节点域名解析与代理连接互相等待的问题。

Mihomo DNS 不生效:按现象分流并回滚

现象最小检查下一步回滚方法
重载时报 YAML 错误缩进、冒号、引号、重复的 dns: 或 tun:恢复备份,只添加一个字段还原上一份配置后重载
端口没有监听进程是否运行、1053 是否被占用、是否加载了另一份配置改用回环高位端口,并查看日志恢复原监听地址
API DNS 查询失败控制器地址、密钥、上游可达性和 DNS 字段暂时只保留一个 nameserver,关闭复杂策略恢复最小配置
API 能查询但网页打不开系统代理、TUN、路由规则和节点连接分开测试代理连接与页面加载关闭 TUN,回到普通系统代理
节点域名无法解析proxy-server-nameserver 是否缺失或不可达单独为节点域名设置解析路径移除新增节点解析策略
TUN 开启后异常tun.dns-mode、dns-hijack、strict-route、权限和防火墙关闭 TUN 做对照,再逐项恢复关闭 TUN,保留普通代理配置
局域网设备失联Fake-IP 过滤、局域网网段、系统 DNS 和路由排除切换 redir-host,再增加少量过滤恢复 Fake-IP 前的备份

排查时要区分五个结果:DNS 服务是否监听、Mihomo 是否能查询上游、系统或应用流量是否被接管、代理节点是否连接成功、网页是否完成加载。只看到 DNS 返回 IP,不能直接判断后四项均正常。

常见问题 FAQ

Mihomo DNS 配置应该写在哪里?

写在当前运行实例实际加载的 YAML 的 dns: 段。图形客户端可能存在订阅生成、Merge 或 Script,因此应通过运行配置或 API 的 GET /configs 确认最终内容。

dns-mode 应该写在 dns: 还是 tun: 下面?

当前官方 TUN 文档将 dns-mode、dns-hijack 和 strict-route 放在 tun: 下。dns: 段负责内置 DNS 模块,不能把 TUN 字段随意放入其中。

Mihomo 应该用 Fake-IP 还是 redir-host?

首次排错建议先用 redir-host,因为返回实际解析结果,便于区分 DNS 和网页问题;需要更完整接管时再切换 Fake-IP,并逐步配置过滤项。

为什么 API 能查询 DNS,但系统还是打不开网页?

API 查询只证明 Mihomo 内置 DNS 完成了查询,不证明系统代理、TUN、路由规则或节点连接正常。应继续检查代理模式、节点域名解析和网页加载。

配置了 fallback 就一定更快吗?

不一定。fallback 是备用解析路径,结果取决于上游可达性、筛选条件和缓存。应记录 DNS 返回、代理连接和页面加载,不能只凭一次解析结果判断速度。

改完配置无法启动怎么办?

先停止继续修改,恢复备份并重新加载;然后每次只加入一个字段。重点检查 YAML 缩进、重复节点、端口冲突,以及客户端是否实际加载了另一份配置。

如何避免把 DNS 服务暴露到公网?

起步时使用 127.0.0.1:1053 等回环地址。只有确实需要局域网设备访问时,才改为明确的局域网地址,并同时配置防火墙、允许网段和路由范围,不要直接开放 0.0.0.0:53。

常见问题

Mihomo DNS 配置应该写在哪里?

写在当前运行实例实际加载的 YAML 的 dns: 段。图形客户端可能存在订阅生成、Merge 或 Script,应通过运行配置或 API 的 GET /configs 确认最终内容。

dns-mode 应该写在 dns: 还是 tun: 下面?

当前官方 TUN 文档将 dns-mode、dns-hijack 和 strict-route 放在 tun: 下;dns: 段负责内置 DNS 模块。

Mihomo 应该使用 Fake-IP 还是 redir-host?

首次排错可先使用 redir-host;需要更完整接管 DNS 和流量时,再切换 Fake-IP,并逐步增加必要的过滤项。

为什么 API 能查询 DNS,但网页仍然打不开?

API 查询只代表内置 DNS 完成了一次查询,还需继续检查系统代理、TUN、路由规则、节点解析、代理连接和页面加载。

改完配置无法启动怎么办?

恢复备份后重新加载,再一次只加入一个字段。重点检查 YAML 缩进、重复的 dns: 或 tun: 节点、端口冲突和实际加载文件。

如何避免 DNS 服务暴露到公网?

起步时使用 127.0.0.1:1053 等回环地址;需要局域网访问时再明确指定局域网地址,并配置防火墙和允许网段。

相关阅读

参考资料

  1. Mihomo Docs:DNS configuration
  2. Mihomo Docs:TUN configuration
  3. Mihomo Docs:DNS type
  4. Mihomo Docs:API
  5. Mihomo Docs:Create a running service