博客 / 产品更新 / 代理客户端为什么会 DNS 泄漏,怎么彻…
DNS泄漏DNS安全TUN模式隐私

代理客户端为什么会 DNS 泄漏,怎么彻底防止

开着代理,DNS 查询却走了国内。这不是玄学,是代理工作机制的必然结果。这篇文章解释原因,给出可操作的解决方案。

你开着代理,浏览器访问某个网站。流量走了代理节点,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.combrowserleaks.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 模式——一个设置,解决所有问题。

了解 TUN 模式配置 →

JL
江流
FOUNDING ENGINEER · 内核维护

负责 Terraka 内核与协议层。前 Tower 工程师。喜欢把规则引擎写到极致,也喜欢清晨的咖啡。

把 2.7 装上吧。

Hysteria2、新测速、更稳的节点抖动指标——所有平台同步推送,旧版本也会自动提示更新。

下载 Terraka 2.7 v2.7.0 · BUILD 11240 · 18.4 MB