DNS 防泄漏硬核解析:Fake-IP 与 DoH/DoT 的协同工作原理

许多用户以为只要开启了 HTTPS 代理或 VPN,DNS 请求就自动安全了。然而,真实世界中 DNS 泄漏仍是最大的隐私盲区之一。本文将从协议底层出发,通过抓包分析展示 Clash Verge Rev 如何利用 Fake-IPDoH/DoT 构建双重防护,彻底杜绝 DNS 泄漏风险。无论你是普通用户还是网络安全爱好者,都能从中获得可落地的配置方案。

🔍 DNS 泄漏:你看不见的隐私漏洞

当你在浏览器中访问一个网站时,第一步通常是域名解析(DNS)。正常情况下,操作系统会将域名查询发送给路由器或运营商分配的 DNS 服务器。如果此时你的代理工具没有接管 DNS 请求,这些明文的查询就会绕过代理隧道直接暴露给本地网络。即使后续网页内容通过加密隧道传输,监控者仍然可以通过 DNS 记录知道你访问了哪些网站。

更隐蔽的是,一些浏览器或应用会绕过系统设置的 DNS,自行进行查询(如 Chrome 的异步 DNS 或 Firefox 的 DNS-over-HTTPS 独立设置),如果代理客户端没有在 IP 层或 TUN 层强制接管,泄漏就会悄然发生。

⚠️ 常见泄漏场景:
  • 系统代理模式下,仅接管了浏览器 HTTP 流量,DNS 查询依然走本地。
  • TUN 模式下未配置 dns-hijack,部分应用使用硬编码的 DNS 服务器。
  • IPv6 优先导致 DNS 查询走 IPv6 通道,绕过了仅配置 IPv4 的代理规则。
  • 浏览器开启了 DoH 但使用了国内 DNS 服务商,看似加密实则仍可被识别。

🧠 Fake-IP:从根源消除 DNS 泄漏

Fake-IP 模式是 Mihomo 内核(以及之前的 Clash 系列)提供的一种特殊 DNS 处理机制。它的核心思想是:本地完全不发起真实的 DNS 请求。当客户端发起 DNS 查询时,Fake-IP 模块会立即返回一个虚假的 IP 地址(默认段 198.18.0.0/16),并将域名与这个假 IP 的映射记录在内存中。随后,当 IP 数据包到达 TUN 接口时,Mihomo 内核通过目标 IP 反查出原始域名,再通过代理隧道前往远端 DNS 进行真实解析。

# Fake-IP 工作流程示意 1. 应用程序: DNS 查询 example.com 2. Fake-IP 模块: 返回 198.18.0.5 3. 应用程序: 发起 TLS 连接到 198.18.0.5 4. TUN 虚拟网卡: 捕获到目标为 198.18.0.5 的数据包 5. Mihomo 内核: 反查 198.18.0.5 → example.com 6. 远端 DNS (通过代理): 解析 example.com 得到真实 IP 1.2.3.4 7. 代理隧道: 将流量转发到真实服务器 1.2.3.4

由于本地从未向运营商 DNS 或任何第三方服务器发送真实域名,即使对本地网络进行抓包,也完全看不到域名信息。这就是 Fake-IP 最根本的防泄漏能力。

🔐 DoH/DoT:为远端解析增加加密层

Fake-IP 保证了本地不会发生泄漏,但真实 DNS 解析最终仍然需要在远端完成。如果远端 DNS 服务器使用传统的 UDP 53 端口明文协议,那么在你代理出口到 DNS 服务器之间的链路上,DNS 请求依然可能被监听或篡改。因此,我们需要为远端解析引入 DNS-over-HTTPS (DoH)DNS-over-TLS (DoT),将 DNS 查询封装在加密信道中。

方案本地 DNS 请求远端 DNS 请求防泄漏程度
传统 UDP (53) 无代理明文,直接泄漏明文,可能被监听极低
传统 DNS + 代理分流可能绕过分流规则明文,但走代理中等
Fake-IP + 传统 DNS完全无泄漏明文,在出口处可能被监听较高
Fake-IP + DoH/DoT完全无泄漏加密传输极高

Clash Verge Rev 的 DNS 配置中,你可以分别为国内和国外域名指定不同的 DNS 服务器:nameserver 用于国内直连域名(通常使用国内的 DoH 如 https://doh.pub/dns-query),fallback 用于代理域名(使用国外的 DoH 如 https://dns.google/dns-query 或 DoT tls://1.1.1.1:853)。配合 fallback-filter 的地理位置过滤,可以确保国内域名走国内 DNS 获得最优 CDN 解析,国外域名走国外加密 DNS 防止污染。

⚙️ 完整配置示例:Fake-IP + DoH/DoT 协同

下面是一份经过生产环境验证的 DNS 配置片段,可直接用于 Clash Verge Rev 的 config.yaml

# ========== DNS 防泄漏配置 ========== dns: enable: true enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 fake-ip-filter: # 排除不需要 Fake-IP 的域名 - '*.lan' - '*.localdomain' - ntp.* nameserver: # 国内 DNS,用于直连域名 - https://doh.pub/dns-query - 223.5.5.5 fallback: # 国外加密 DNS,用于代理域名 - https://dns.google/dns-query - tls://1.1.1.1:853 fallback-filter: geoip: true geoip-code: CN ipcidr: - 240.0.0.0/4

同时,TUN 模式下必须启用 DNS 劫持,以防止应用绕过系统 DNS:

# TUN 配置 tun: enable: true stack: mixed auto-route: true auto-detect-interface: true dns-hijack: - any:53

🛠️ 验证防泄漏是否生效

1. 在线检测网站

最直接的方式是访问 ipleak.netdnsleaktest.com。如果配置正确,页面显示的 DNS 服务器 IP 应与代理出口节点所在地理位置一致,且不应出现任何你本地运营商的 DNS 地址。

2. 命令行验证

在终端执行 nslookup twitter.comdig twitter.com,观察返回的 DNS 服务器地址。如果看到 198.18.x.x 的 IP(Fake-IP 返回),说明 DNS 已被 Clash 接管。

3. 抓包验证(进阶)

使用 Wireshark 监听本地网卡,过滤 dns 流量。在 Fake-IP 模式下,你应该看不到任何对真实域名的 DNS 查询包,只有应用程序向 198.18.x.x 发起的 TLS 连接。

💡 小技巧:如果检测到泄漏,首先检查 TUN 的 dns-hijack 是否正确配置,确保它劫持了所有出口的 53 端口请求(包括 IPv6)。此外,某些浏览器(如 Firefox)可能开启了自身的 DoH 设置,需要在浏览器中关闭或将其指向 Clash 的 DNS 监听地址。

🚫 常见误区与排查

⚠️ 特别注意:如果你的网络中使用了 IPv6,必须确保 Clash 的 DNS 劫持也覆盖了 IPv6 的 DNS 查询(通常为 ::1any:53 已包含)。否则部分系统可能通过 IPv6 默认路由将 DNS 发送到本地路由器,造成泄漏。

🏁 总结

DNS 防泄漏是网络隐私保护的基石。Clash Verge Rev 提供的 Fake-IP + DoH/DoT 组合拳,在本地和远端同时实现了 DNS 请求的零暴露。只需按照本文的配置模板进行设置,即可轻松达到极高的安全标准。建议定期使用在线工具验证,确保网络环境变化时防护依然有效。

安全是一场持久战,而每一次配置的正确落实,都是对自己隐私的尊重。如果你在配置过程中遇到任何问题,欢迎在 GitHub Issues 或讨论区与我们交流。