DNS 泄露最常见的原因是只开了系统代理、没有开 TUN,导致部分程序绕过客户端、直接用本地运营商 DNS 查询域名。最快的解决办法是:开启客户端内置 DNS 和 TUN 模式(含 DNS 劫持),同时关闭浏览器自带的安全 DNS,然后清缓存复测。
什么是 DNS 泄露,有什么影响
使用代理时,境外域名的解析理想情况下应由客户端接管,并通过代理或加密通道完成。DNS 泄露是指系统或某个程序在连接之前,把要访问的域名直接发给了本地默认 DNS(运营商 DNS 或路由器)。影响主要有三点:
- 访问记录暴露:本地运营商能看到你查询了哪些域名,即使后续流量是加密的;
- 解析结果被污染:本地 DNS 可能返回错误 IP,导致连接失败,表现就是《DNS 问题排查》中提到的解析异常;
- 分流和地区判断出错:部分网站会结合 DNS 出口判断地区,泄露可能让 AI、流媒体服务认为你身处国内,参见《AI 服务提示地区不支持》。
需要说明的是,检测结果中出现国内 DNS 并不一定是“严重问题”。如果你主要关心能否正常访问,而不是隐私,轻度泄露可以接受;如果在意隐私或地区判断,就需要按下文处理。
可能原因
| 原因 | 说明 | 对应解决方法 |
|---|---|---|
| 只用系统代理 | 系统代理只影响遵守代理设置的程序,DNS 查询仍走系统 | 开启 TUN 并劫持 DNS |
| 客户端 DNS 未开启 | dns.enable 为 false 时 mihomo 使用系统 DNS |
开启客户端 DNS |
| 浏览器安全 DNS | 浏览器自己发 DoH 请求,不经过客户端 | 关闭或改为与客户端一致 |
| DNS 连接不遵守规则 | 客户端向境外 DNS 的查询本身直连发出 | 开启 respect-rules |
| IPv6 绕行 | 系统通过 IPv6 DNS 查询,客户端未接管 | 关闭客户端 IPv6 解析或系统 IPv6 |
排查方法
- 打开检测网站:开启代理后访问
browserleaks.com/dns或dnsleaktest.com(后者可选 Extended Test),查看列出的 DNS 服务器; - 判断结果:如果全部是境外 DNS(如 Cloudflare、Google 或节点所在地机房),说明没有明显泄露;如果出现中国电信、联通、移动等国内运营商 DNS,说明存在泄露;
- 区分来源:分别用浏览器和其他程序测试,或先关闭浏览器安全 DNS 再测,确认是浏览器还是系统层面的泄露;
- 查看客户端设置:确认当前是系统代理模式还是 TUN 模式,可参考《系统代理模式详解》。
解决步骤
-
开启客户端 DNS 并使用 fake-ip。fake-ip 模式下,客户端直接返回假地址,由代理节点按域名连接目标,境外域名不需要在本地发起真实查询。两种模式的取舍见《Fake-IP 与 Redir-Host 的区别》。
-
开启 TUN 模式。在客户端中开启 TUN,并保持 DNS 劫持开启,让所有 53 端口查询都进入客户端,详见《TUN 模式详解》。如果开启失败,可看《TUN 模式开启失败》。
-
让 DNS 查询遵守路由规则。mihomo 提供
respect-rules,开启后 DNS 连接按路由规则走代理;官方文档要求同时配置proxy-server-nameserver,用于解析节点域名,并且不建议与prefer-h3一起使用。示例:dns: enable: true enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 respect-rules: true proxy-server-nameserver: - https://223.5.5.5/dns-query nameserver: - https://1.1.1.1/dns-query - https://8.8.8.8/dns-query nameserver-policy: 'geosite:cn': - https://223.5.5.5/dns-query - https://doh.pub/dns-query tun: enable: true stack: mixed auto-route: true dns-hijack: - any:53以上写法让国内域名走国内 DNS、其他域名走境外加密 DNS,并通过代理发出。
geosite:cn依赖规则数据库,具体以你的配置为准。 -
关闭浏览器安全 DNS:Chrome 在「设置 → 隐私和安全 → 安全」中关闭「使用安全 DNS」;Firefox 在设置中搜索「DNS over HTTPS」并关闭。
-
清缓存后复测:Windows 执行
ipconfig /flushdns,PowerShell 执行Clear-DnsClientCache,macOS 执行sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder,然后重启浏览器。
验证结果
- 检测网站列出的 DNS 服务器不再包含国内运营商;
- 国内网站访问速度正常(说明国内域名仍走国内 DNS);
- 境外网站、AI 服务正常打开,地区判断与节点一致。
其他方案
- 手机端:安卓客户端如《Clash Meta for Android》默认以 VPN 方式接管 DNS,泄露较少;iOS 上的《Quantumult X》等客户端可在 DNS 设置中指定服务器;
- 路由器:在 OpenClash 等插件中开启 DNS 劫持,让全家设备的查询都经过代理;
- 如果做完上述设置仍有大量国内 DNS 出现,可以检查是否有其他 VPN、安全软件在修改网络设置。
常见问题
检测出国内 DNS,但网页都能正常打开,要处理吗?
不是必须的。能正常访问说明解析结果可用,泄露主要影响隐私和地区判断。如果你在使用 AI 服务或流媒体时遇到地区问题,再按本文处理。
开了 fake-ip 还会泄露吗?
可能会。fake-ip 只对经过客户端的 DNS 查询生效,如果程序绕过客户端(例如浏览器安全 DNS、只开系统代理),仍会泄露,需要配合 TUN 使用。
检测网站显示的是 Cloudflare 或 Google,算泄露吗?
不算。这说明 DNS 查询从境外发出,是正常结果;关键是看有没有国内运营商的服务器。
关闭 IPv6 能解决泄露吗?
在部分网络环境中有帮助。如果客户端没有接管 IPv6 DNS,系统可能通过 IPv6 直接查询。可以在客户端中关闭 IPv6 解析后复测。