DNS 泄露的意思是:你的流量已经走了代理或 VPN 隧道,但「域名解析」这一步没有走隧道,而是直接发给了本地运营商的 DNS 服务器。结果是网站内容看不见,但你打开了哪些域名、什么时候打开的,运营商和所在网络一清二楚。对机场和 VLESS 用户来说,这是最常见、也最容易被忽视的一种泄露,因为连接图标一切正常,速度也正常,只有专门去测才会发现。

好消息是它完全可以修好,而且大多数情况下只是客户端里的一两个设置。

DNS 泄露到底泄露了什么

浏览器打开一个网站之前,要先问一句「这个域名对应哪个 IP」。这句话叫 DNS 查询,默认发给你所在网络分配的 DNS 服务器,也就是运营商、公司或酒店的服务器。查询本身通常不加密,内容就是域名本身。

如果这个查询没有进隧道,那么:

  • 运营商能记录你解析过的所有域名,等于一份浏览记录清单;
  • 所在网络的管理员(公司、学校、酒店)也能看到同样的清单;
  • 网站那边看到的是代理服务器的 IP,但解析请求来自你的真实网络,两边一对照就能关联。

内容本身因为 HTTPS 仍然是加密的。泄露的是「去了哪里」,而不是「看了什么」。

为什么开了机场或节点还会泄露

原因几乎都出在「哪些流量走代理」这个判断上。常见的有五种:

  1. 分流规则把 DNS 放行了。 很多规则集默认「国内域名直连」,为了判断一个域名是不是国内的,客户端先用本地 DNS 去查一次,这一查就泄露了。
  2. 系统 DNS 没被接管。 在「系统代理」模式下,客户端只接管了浏览器的 HTTP/SOCKS 流量,系统自己发出的 DNS 查询照常直连。只有 TUN 模式(虚拟网卡)才能接管所有流量。
  3. IPv6 走了另一条路。 隧道只处理了 IPv4,而你的网络支持 IPv6,于是系统优先用 IPv6 直接解析和连接。这不只是 DNS 问题,整条连接都会绕过隧道。
  4. 浏览器自己的 DoH。 Chrome、Firefox 和 Edge 可以把 DNS 查询加密后发给指定服务商(DNS over HTTPS)。这样运营商看不到,但查询仍然带着你的真实 IP 发出去,服务商知道你是谁。
  5. 客户端崩溃或重连的间隙。 隧道断开的几秒钟里,系统会立刻退回默认 DNS。需要 Kill Switch 一类的功能兜底。

三种检测方法

方法一:在线检测站。 用浏览器打开 dnsleaktest.com 或 ipleak.net 这类页面,点「扩展测试」。页面会让你的浏览器解析几十个随机域名,然后列出是哪些 DNS 服务器来查的。如果列表里出现你所在运营商的服务器(名字里常带运营商或城市名),就是泄露了;只出现代理节点所在国家的服务器,就是正常的。

方法二:本站工具。 先打开我的 IP 是什么,确认显示的是节点 IP 而不是本地 IP;再打开 IPv6 泄露检测,如果检测到本地 IPv6 地址,说明 IPv6 绕过了隧道,DNS 多半也跟着绕过了;最后跑一次 WebRTC 泄露检测,浏览器可能通过 WebRTC 直接暴露真实 IP,这与 DNS 无关,但同样要堵。

方法三:命令行。 在终端执行 nslookup example.com(Windows/macOS 都可以),第一行会显示回答查询的服务器地址。如果是 192.168.x.x 或运营商网段,说明查询走的是本地;如果是代理客户端的虚拟地址(例如 fake-ip 段的 198.18.x.x)或节点侧的地址,说明已经接管。

怎么解决:按客户端来

Clash / Mihomo / Clash Verge。 在配置里开启 DNS 模块,把 enhanced-mode 设为 fake-ipnameserver 填写会经代理发出的加密 DNS(DoH 或 DoT 地址)。同时开启 TUN 模式,让系统层的查询也被接管。规则集里如果有「国内直连」,确认它用的是 nameserver-policy 里指定的直连解析器,只解析真正的国内域名。

Xray / V2Ray 内核(v2rayN、v2rayNG、NekoBox)。 在 DNS 设置里指定远程解析器,并在路由规则里把 DNS 出站指向代理(dns-out 走 proxy)。如果用的是 VLESS + Reality 节点,协议本身不处理 DNS,全靠这里的配置;开启「使用内核 DNS」或类似选项,而不是「系统 DNS」。

Shadowrocket / Streisand / V2Box(iOS)。 在「设置」里找到 DNS 覆写,填一个加密 DNS 地址;把路由模式设为「代理」或「配置」而非「直连」。iOS 客户端默认以 TUN 方式工作,所以只要 DNS 覆写生效,泄露一般就消失了。

系统层面。 Windows 在网卡属性里关闭「Internet 协议版本 6」,或者确认客户端启用了 IPv6 转发;macOS 在网络设置里把 IPv6 设为「仅本地链路」。浏览器里检查「安全 DNS」选项:要么关闭,让客户端统一接管;要么确认浏览器的 DoH 请求也走了代理。

兜底。 打开客户端的 Kill Switch(有的叫「断线保护」或「阻止非隧道流量」),隧道断开时直接断网,而不是退回本地 DNS。

VLESS + Reality 会不会泄露 DNS

VLESS 只是传输协议,Reality 只是伪装层。它们决定「隧道长什么样」,不决定「哪些流量进隧道」。所以同一个 VLESS 节点,在 A 客户端里不泄露,在 B 客户端里泄露,是完全正常的现象,问题永远在客户端配置而不在节点。如果你用的是订阅链接,机场的默认配置通常已经写好了 DNS 部分,但自己改过规则或换过客户端之后,重新测一次。机场、节点和客户端之间的关系,可以看机场是什么这篇。

检查清单

  • 在线检测站只显示节点所在国家的 DNS 服务器;
  • 本站 IPv6 泄露检测没有发现本地 IPv6;
  • WebRTC 泄露检测显示的是节点 IP;
  • 客户端处于 TUN 模式或等效的全局接管模式;
  • DNS 指向加密解析器,并且经代理发出;
  • 浏览器的「安全 DNS」与客户端不冲突;
  • Kill Switch 已开启。

七条全部通过,DNS 这一环就堵住了。改过配置、换过客户端或更新过订阅之后,重新跑一遍,五分钟的事。

404 VPN 的客户端(iOS、Android、Windows、macOS)内置 DNS 泄露防护,DNS 查询默认在 VLESS 或 WireGuard 隧道内解析,并带有 Kill Switch,隧道断开时不会退回本地 DNS。想了解连接是怎么建立的,可以看工作原理;开始使用请到首页