使用 Clash 时,代理连接正常、出口 IP 符合预期,只能说明部分网络请求已经经过代理。DNS 查询是否沿着预期路径发送,还需要单独确认。
这也是 DNS 防泄漏配置的重点:明确哪些查询由客户端处理,哪些交给远端节点解析,以及查询经过什么连接抵达解析服务。
本文面向采用 **Mihomo 内核的桌面客户端**,从解析路径出发,介绍一套可检查、可验证的配置方法。使用配置示例前,先确认客户端所用内核支持相应字段。
01 识别两条不同的路径
DNS 泄漏通常发生在流量路径分离的地方。 应用访问网站前,可能先通过系统 DNS 查询域名。如果网页连接进入代理,而查询仍发送给本地路由器或运营商,两类请求就走了不同的路径。
图 1 · 网页走代理,查询可能走另一条路
应用发起请求
→
Mihomo接管网页连接
→
代理节点连接目标网站
另一路:应用 → 系统 DNS → 路由器 / 运营商
如果 DNS 查询没有按预期接管,网页出口正常仍可能伴随解析绕行。
普通 DNS 查询通常以明文传输,沿途网络可以观察其中的域名。这类查询主要暴露“访问了哪个域名”,通常不包含 HTTPS 网页的完整路径和正文。[Cloudflare:DNS 加密说明](https://developers.cloudflare.com/1.1.1.1/encryption/)
是否构成泄漏,还取决于预期策略。例如,明确安排公司内网域名由内部 DNS 解析,是正常的分流设计;要求经过代理的查询意外发送给运营商,才是需要处理的问题。
02 接管、加密和出口分别负责什么
完整的 DNS 策略需要同时考虑接管、加密和出口。
| 配置层面 | 需要解决的问题 |
|---|---|
| DNS 接管 | 应用发出的查询是否进入 Mihomo |
| 查询加密 | Mihomo 与上游 DNS 之间是否使用 DoH 或 DoT |
| 出口选择 | 上游 DNS 连接通过代理还是直接连接 |
只填写 `1.1.1.1` 这样的地址,通常只是更换 DNS 服务商。使用 DoH 或 DoT 才涉及传输加密,而加密连接本身仍有直连和代理两种路径。[Cloudflare:加密 DNS](https://developers.cloudflare.com/1.1.1.1/encryption/)
因此,配置时应当明确指定解析服务和出口,并检查应用有没有绕过这套设置。
03 建立可检查的解析路径
可以先建立一条简单、明确的解析路径,再逐步增加分流。 以下示例使用 TUN 接管流量,将普通 DNS 查询交给 Mihomo,并让本机需要发出的上游查询经过指定代理组。
代理节点自身的域名使用独立解析服务处理。这样,在代理尚未建立时,客户端就能取得节点地址,避免解析过程反过来依赖尚未连通的代理。
图 2 · 查询与引导解析分开处理
应用查询系统 DNS / TUN
→
Mihomo DNS需要真实地址时
→
代理组必须选中代理
→
加密 DNS处理本机上游查询
独立引导:节点域名 → 引导 DNS(直连)→ 节点 IP → 建立代理
图示为本机上游查询路径;部分连接会将域名交由远端节点解析。
如果还不清楚 TUN 与系统代理分别接管什么,可以先看[系统代理与 TUN 的区别](/a/system-proxy-vs-tun.html#tun),再调整下面的配置。
实际操作前,先备份当前配置。下面只包含 TUN 与 DNS 部分,需要通过客户端提供的配置编辑或覆写功能整合到现有配置中。
这是合并片段,不是完整配置
先备份,确认内核支持字段及代理组名称,再使用客户端的覆写或合并功能。不要覆盖节点和分流规则。
```yaml
tun:
enable: true
auto-route: true
auto-detect-interface: true
# 需要支持该字段的近期 Mihomo 内核
dns-mode: native
dns-hijack:
- any:53
- tcp://any:53
strict-route: true
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
# 解析 DNS 服务自身的域名
default-nameserver:
- tls://223.5.5.5
# 独立解析代理节点域名
proxy-server-nameserver:
- "tls://223.5.5.5#DIRECT"
# 替换为配置中真实存在的代理组名称
nameserver:
- "https://cloudflare-dns.com/dns-query#节点选择"
```
示例中的 `#节点选择` 指定上游 DNS 连接使用该代理组。应用前,需要将它替换成实际名称,并确认该组最终选中代理节点,也不会在失败时回退到 `DIRECT`。Mihomo 支持在 DNS 地址后指定代理或接口;通过代理查询时,应同时配置独立的节点域名解析服务。[Mihomo DNS 配置](https://wiki.metacubex.one/config/dns/)
这里选用阿里 DNS 的 DoT 地址作为引导解析示例,该地址也出现在 Mihomo 的官方配置中。它是否适合当前网络,仍需实际验证。[Mihomo 配置示例](https://wiki.metacubex.one/example/conf/)
引导解析直接连接指定服务,意味着该服务可以看到节点域名等引导查询。这是一项明确的信任选择,应当与网站域名的解析路径分别理解。
`dns-mode: native` 用于将系统 DNS 指向 TUN;`dns-hijack` 则将匹配的 DNS 连接导入内置解析模块。系统 DNS 仍指向局域网路由器时,单靠劫持配置存在平台限制。如果内核不支持 `dns-mode`,应先核对客户端对应的系统 DNS 接管功能。[Mihomo TUN 配置](https://wiki.metacubex.one/config/inbound/tun/)