DNS 泄漏的预防与检测
很多用户以为开了代理就高枕无忧,实际上 DNS 泄漏可能让你的浏览记录全程暴露。本文教你彻底消除这个隐患。
DNS 基础回顾
在理解 DNS 泄漏之前,有必要快速回顾一下 DNS 的工作方式。DNS(Domain Name System,域名系统)是互联网的「电话簿」。当你在浏览器里输入 www.google.com 并按下回车时,你的设备并不直接知道这个域名对应哪台服务器的 IP 地址,它首先要向 DNS 服务器查询:「www.google.com 的 IP 是多少?」。DNS 服务器返回 IP 地址后,你的设备才开始真正的连接。
这个 DNS 查询请求,在传统配置下,是明文发送给你的互联网服务提供商(ISP,即运营商)指定的 DNS 服务器的。这意味着运营商(以及能监听你网络流量的任何人)可以完整记录你查询过哪些域名——即使你最终通过代理访问了那些网站,DNS 查询本身已经泄漏了你的访问意图。
DNS over HTTPS(DoH)和 DNS over TLS(DoT)是加密 DNS 查询的两种标准方案,能防止 ISP 在传输过程中监听 DNS 请求。但仅靠加密 DNS 还不够——在代理场景下,还需要确保 DNS 请求通过代理隧道发出,而不是绕过代理直接发给境外 DNS 服务器。
DNS 泄漏是什么
DNS 泄漏(DNS Leak)指的是:你已经开启了代理,网站内容通过代理隧道传输,但 DNS 查询请求没有经过代理,而是直接发送给了国内运营商的 DNS 服务器,甚至发送给了境外 DNS 服务器(如 8.8.8.8),导致你的域名查询记录暴露在代理保护之外。
在 Clash 的传统工作模式(Redir-Host 模式)中,DNS 泄漏是一个结构性问题:
当你访问 www.google.com 时,操作系统先向本地 DNS 服务器查询真实 IP,得到 IP 后,Clash 再根据 IP 判断该走直连还是代理。问题在于,这个 DNS 查询发生在 Clash 处理连接之前,并且使用的是系统默认的 DNS 服务器(通常是运营商的服务器),整个查询过程完全绕开了代理。即使你最终通过代理访问了 Google,你访问 Google 的这个事实已经被运营商 DNS 服务器记录。
更严重的情况发生在「全局代理」配置中:有些用户设置了境外 DNS(如 8.8.8.8)但没有通过代理访问,这个 DNS 请求裸奔发到境外,既被 GFW 看到,又被 Google DNS 记录,还增加了额外延迟,可谓一无是处。
泄漏的危害
隐私暴露:DNS 泄漏最直接的危害是隐私泄漏。即使连接内容经过加密,DNS 查询本身就已经告诉了第三方你访问了哪些网站。ISP、政府机构、咖啡厅的 Wi-Fi 管理员都可能记录这些信息。
准确性下降:当 DNS 查询不走代理时,境外 DNS 服务器(如 8.8.8.8)会根据你在国内的出口 IP 返回针对国内用户优化的解析结果,而不是针对代理出口所在地区的优化结果。这可能导致你访问某个网站时连接到的服务器地理位置不对,速度反而变慢。
审查风险:GFW 不仅封锁 IP,也会对 DNS 查询进行「DNS 污染」——当你查询被封锁的域名时,返回虚假 IP,导致连接失败。如果 DNS 请求没有通过代理,即使代理节点完全可用,也可能因为 DNS 被污染而无法正常访问境外网站。
Fake-IP 防泄漏原理
Clash 的 Fake-IP 模式是彻底解决 DNS 泄漏问题的最优方案,被 Mihomo 内核作为推荐配置广泛使用。
Fake-IP 的工作方式与传统 DNS 模式截然不同:当应用发起 DNS 查询时,Clash 的内置 DNS 服务器立即返回一个「假的」内部 IP 地址(来自保留地址段,如 198.18.0.0/15),不会真正发出 DNS 请求到任何外部服务器。应用拿到这个假 IP 开始建立 TCP/UDP 连接,Clash 在连接层面截获这个连接,从假 IP 反查出原始域名,再根据规则决定后续处理:
如果规则判断该域名需要代理,Clash 将「域名 + 端口」直接通过代理隧道发送给代理服务器,在代理服务器端完成真正的 DNS 解析——这样 DNS 查询发生在境外,不受 GFW 干扰。
如果规则判断该域名直连(国内域名),Clash 才会对该域名进行真正的 DNS 解析,使用配置文件中指定的国内 DNS 服务器(如 119.29.29.29,腾讯 DNS)进行查询,结果准确且速度快。
全程没有任何 DNS 查询泄漏到系统默认 DNS 服务器,也没有未加密的境外 DNS 请求——这是 Fake-IP 的根本优势。
Mihomo DNS 配置方案
以下是一份适用于大多数场景的 Mihomo DNS 配置,开启 Fake-IP 并妥善处理国内外分流:
dns:
enable: true
listen: 0.0.0.0:53 # 监听本机 53 端口
enhanced-mode: fake-ip # 开启 Fake-IP 模式
fake-ip-range: 198.18.0.1/16
# Fake-IP 过滤列表:这些域名不使用 Fake-IP,直接真实解析
# 确保 NTP、Apple 推送等系统服务不受影响
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localhost"
- "time.*.com"
- "time.*.gov"
- "ntp.*.com"
- "+.stun.*.*"
- "+.stun.*.*.*"
# 用于国内域名解析的 nameserver
# 优先使用 DoH/DoT 加密查询
nameserver:
- https://doh.pub/dns-query # 腾讯 DoH
- https://dns.alidns.com/dns-query # 阿里 DoH
- 119.29.29.29 # 腾讯 DNS(备用)
- 223.5.5.5 # 阿里 DNS(备用)
# 用于解析代理节点域名(代理服务器本身的域名需要直接解析)
proxy-server-nameserver:
- https://doh.pub/dns-query
- 119.29.29.29
这份配置的关键点在于:Fake-IP 过滤列表保留了常见系统服务域名的真实解析,避免 NTP 时间同步、mDNS 等本地服务被 Fake-IP 干扰;国内 nameserver 使用了 DoH 加密查询,防止 ISP 劫持 DNS 响应;代理节点域名专门使用可靠的国内 DNS 解析,避免代理服务器地址被 DNS 污染。
验证是否泄漏
配置完成后,用以下步骤验证 DNS 泄漏是否已被消除:
方法一:使用在线检测工具。访问 dnsleaktest.com 或 ipleak.net,点击「Extended test(扩展测试)」。测试完成后,页面会显示你的 DNS 查询是由哪些服务器处理的。如果列表中只出现你代理节点所在地区(如美国、香港)的 DNS 服务器,说明没有泄漏;如果出现了中国运营商的 DNS 服务器(中国联通、中国移动、中国电信等),说明存在泄漏,需要检查配置。
方法二:命令行验证。在终端执行以下命令,观察查询由哪台服务器响应:
# 查询一个境外域名,观察 SERVER 字段
nslookup google.com
# 或使用 dig(结果更详细)
dig google.com
如果 SERVER 显示的是 127.0.0.1#53(即 Clash 本地 DNS),说明系统 DNS 已经指向 Clash,Fake-IP 在正常工作。如果显示的是 192.168.x.x(路由器 DNS)或运营商 IP,说明系统 DNS 设置未能正确指向 Clash,需要检查 TUN 模式是否已开启或 DNS 监听是否正常。
nslookup 或 dig 直接查询的结果会是 198.18.x.x 这样的假 IP,这是正常现象,不代表 DNS 泄漏。关键是观察 SERVER 字段显示的是 Clash 本地地址还是外部 DNS 服务器。常见误区
误区一:「换成 8.8.8.8 就能防泄漏」。将系统 DNS 设置为 Google 的 8.8.8.8 或 Cloudflare 的 1.1.1.1 并不能防止 DNS 泄漏,反而可能更糟:这些境外 DNS 服务器的查询请求本身就是明文的,会裸奔发到境外,被 GFW 监测,延迟也更高。防泄漏的关键是让 DNS 查询经过 Clash 处理,而不是选择特定的 DNS 服务器。
误区二:「开了代理 DNS 就自动走代理」。传统系统代理模式下,DNS 查询完全独立于代理,不会自动走代理。只有在 Clash 开启了 DNS 监听(enable: true)并且系统的 DNS 被指向 Clash(通过 TUN 模式自动完成,或手动修改系统 DNS 为 127.0.0.1)时,DNS 才由 Clash 统一接管。
误区三:「Fake-IP 模式会让所有网站都走代理」。Fake-IP 只是 DNS 解析方式的改变,流量分流的决策仍然由规则集决定。配置了 GEOIP,CN,DIRECT 规则的情况下,即使使用 Fake-IP,国内流量仍然走直连,不影响国内网站速度。
总结:使用 Clash Plus,开启 TUN 模式,配置 Fake-IP DNS,是目前最完整的 DNS 泄漏防护方案。三者协同工作,让代理真正做到「无缝、安全、无泄漏」。