代理连上了、网站能开,但 DNS 查询还在裸奔——这就是 DNS 泄漏:你访问了什么域名,本地网络运营商看得一清二楚。这一篇讲清 Clash 的 DNS 机制和堵住泄漏的配置。
泄漏是怎么发生的
只开系统代理时,浏览器的 DNS 查询通常由代理服务器远端解析,问题不大。但 TUN 模式下如果 DNS 配置不当,或某些应用自行调用系统解析器,查询就会以明文 UDP 直奔运营商 DNS(端口 53)——流量走了隧道,「想去哪」却先广播了出去。
Clash 的解法:接管解析
Mihomo 内置 DNS 模块,两种工作模式:
- fake-ip(推荐):应用问「google.com 的 IP 是多少」,内核直接回一个保留段假地址(198.18.x.x),应用拿假 IP 发起连接,内核凭假 IP 反查域名、按域名规则分流。真正的解析在代理出口完成——本地网络全程只见假地址,无泄漏且省一次解析延迟。
- redir-host:返回真实 IP,兼容性更好,但解析路径难控,泄漏风险高。仅在个别应用与 fake-ip 冲突时降级使用。
推荐配置模板
写进 Merge(做法见增强配置),覆盖订阅自带的 DNS 段:
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "+.local"
- "+.msftconnecttest.com" # 系统联网检测走真实解析
nameserver:
- https://223.5.5.5/dns-query # 国内域名用加密 DNS
fallback:
- https://1.1.1.1/dns-query # 命中境外域名时使用
fallback-filter:
geoip: true
geoip-code: CN
要点:nameserver 和 fallback 都用 DoH(HTTPS 加密),即使这段查询没进隧道,内容也不是明文;fake-ip-filter 把局域网和系统探测域名排除在假 IP 之外,避免打印机、联网检测这类功能异常。
TUN 模式的最后一块拼图
开 TUN 时保持「DNS 劫持」为 any:53(默认值)。它把所有仍然头铁直连 53 端口的明文查询强行截进内核处理——不管应用多不配合,都逃不出去。TUN 配置本身见 TUN 教程。
怎么验证没泄漏
- 开着代理访问 dnsleaktest.com 或 browserleaks.com/dns,跑 Extended 测试;
- 结果里出现的解析服务器应该全部位于代理出口所在地区/或你配置的 DoH 提供商;
- 一旦出现本地运营商的 DNS 服务器,就是泄漏——回头检查 fake-ip 是否开启、DNS 劫持是否生效。
改完 DNS 配置记得清一次 fake-ip 缓存(重启内核即可),否则新旧映射混杂可能出现个别网站打不开的假象。