你开着代理,浏览器访问某个网站。流量走了代理节点,IP 地址看起来是海外。但是——DNS 查询是另一回事。你的设备在问”这个域名是什么 IP”的时候,可能问的是国内的 DNS 服务器,而不是通过代理问。这就是 DNS 泄漏。
01 什么是 DNS 泄漏
每次你访问一个网址,设备要先把域名解析成 IP 地址,这个过程叫 DNS 解析。在没有代理的情况下,这个查询发给运营商分配的 DNS 服务器(通常是 114.114.114.114 或路由器地址)。
开了代理之后,HTTP/HTTPS 流量确实走了节点。但 DNS 查询是 UDP 53 端口的流量,普通系统代理(HTTP 代理模式)不会劫持 UDP 流量。结果就是:DNS 查询仍然发给国内 DNS,IP 流量走代理,两条路分开走。
这意味着什么?你访问的域名,被国内 DNS 服务器记录了。从隐私角度,这是一条明显的信息泄漏。从功能角度,如果 DNS 服务器对某些域名返回被污染的结果(比如返回错误的 IP),即使流量走了代理也可能无法正常访问。
02 为什么会发生
这是系统代理工作机制的必然结果,不是哪个客户端的 bug。
系统代理(HTTP/HTTPS 代理)工作在应用层。浏览器发出的请求,先到代理客户端,再转发到节点。但 DNS 查询在大多数系统上是单独的系统调用,不经过这个代理通道。
更复杂的是,有些应用根本不走系统代理。命令行工具(git、curl、wget)、很多系统服务、基于 Electron 的应用,默认都不遵循系统代理设置。这类流量的 DNS 查询同样不会被代理截获。
03 怎么检测
最简单的方法:访问 dnsleaktest.com 或 browserleaks.com/dns,点击”Extended test”。
如果结果里的 DNS 服务器出现了国内运营商(电信、联通、移动)或者 114.114.114.114,说明存在 DNS 泄漏。预期结果应该是你的代理节点所在地区的 DNS 服务器。
测试时先确保代理已开启且节点已连接。如果节点本身不工作,测试结果没有参考价值。
04 系统代理模式下的修复
在系统代理(非 TUN)模式下,可以通过以下方式缓解 DNS 泄漏:
在 Clash 配置里设置 DNS 模块。
dns:
enable: true
listen: 0.0.0.0:53
default-nameserver:
- 223.5.5.5 # 阿里 DNS,用于解析国内域名
- 119.29.29.29 # 腾讯 DNS
nameserver:
- https://1.1.1.1/dns-over-https # Cloudflare DoH,走代理
- https://8.8.8.8/dns-over-https # Google DoH,走代理
enhanced-mode: fake-ip # 或 redir-host
fake-ip-range: 198.18.0.0/15
启用 Clash 内置 DNS 模块后,所有经过 Clash 处理的请求,域名解析会交给 Clash 而不是系统 DNS。nameserver 里的 DoH 服务器会通过代理发出查询,从而避免泄漏。
这个方法的局限是:不经过系统代理的流量(命令行工具、系统服务等)依然绕过,DNS 查询还是走系统设置。
05 TUN 模式:釜底抽薪
彻底解决 DNS 泄漏的方案是开启 TUN 模式。
TUN 模式在系统网络栈层面创建一个虚拟网卡,把所有进出流量(包括 UDP 53)拦截下来交给 Clash 处理。DNS 查询无法绕过,不管是浏览器、命令行工具还是系统服务,一律经过 Clash 的 DNS 模块。
开启 TUN 模式后,DNS 泄漏问题从根本上消失,因为连操作系统都没有机会把 DNS 查询发出去。
TUN 模式使用 sing-box 的网络栈实现,支持 IPv4/IPv6 双栈劫持,DNS 查询在内核层面被接管,不依赖应用层配置。
— Terraka 内核文档
Terraka 在 macOS 和 Windows 上支持 TUN 模式,开启方式参见桌面端 TUN 配置指南。
06 DNS 配置建议
无论使用哪种模式,DNS 配置上有几个通用建议:
使用加密 DNS(DoH 或 DoT)。 明文 DNS 查询可以被运营商截获和篡改。DNS over HTTPS(https://)或 DNS over TLS(tls://)可以防止这类中间人攻击。
区分国内外 DNS。 国内域名用国内 DNS 服务器解析更快(CDN 会根据解析节点就近分配),海外域名用海外 DoH 解析更准确。
dns:
nameserver:
- https://1.1.1.1/dns-over-https
- https://8.8.8.8/dns-over-https
nameserver-policy:
"geosite:cn":
- https://doh.pub/dns-query # 腾讯 DNSPod DoH
- https://dns.alidns.com/dns-query # 阿里 DoH
不要使用 8.8.8.8 作为明文 DNS。 国内网络对 8.8.8.8 的访问不稳定,且没有加密。如果要用 Google DNS,通过 DoH 方式使用:https://8.8.8.8/dns-over-https。
DNS 泄漏是代理使用中容易被忽视的问题。如果你在意隐私,或者在使用对 DNS 解析结果敏感的服务,值得花时间检测并修复。最简单的方法是开启 TUN 模式——一个设置,解决所有问题。