打个比方:你把信装进了保险箱送出去,但寄之前先大声问了一句「张三家住哪」,整条街都听见了。
DNS 泄露就是这个意思:你的流量已经走了代理或 VPN 隧道,但「域名解析」这一步没进隧道,而是直接问了本地运营商的 DNS (互联网的电话簿:域名换地址) 服务器。结果就是:网站内容他们看不见,但你打开了哪些域名、什么时候打开的,运营商和你所在的网络一清二楚。对机场和 VLESS 用户来说,这是最常见也最容易漏掉的一种泄露。连接图标一切正常,速度也正常,你不专门去测根本发现不了。
好消息是它完全可以修好,而且大多数情况下只是客户端里的一两个设置。
| 泄露的是什么 | |
|---|---|
| 你打开了哪些域名 | ✓ 会泄露 |
| 页面内容 | ✗ |
| 你的聊天记录 | ✗ |
| 你的真实 IP | ✗ |
DNS 泄露到底泄露了什么
浏览器打开一个网站之前,要先问一句「这个域名对应哪个 IP」。这句话就叫 DNS 查询,默认发给你所在网络分配的服务器,也就是运营商、公司或者酒店的机器。这句问话本身通常不加密,内容就是域名本身。还是刚才那个比方,你在街上喊出了地址。
如果这个查询没有进隧道,那么:
- 运营商能记下你解析过的所有域名,等于给你列了一份浏览清单;
- 你所在网络的管理员(公司、学校、酒店)也能看到同一份清单;
- 网站那边看到的是代理服务器的 IP,可你的解析请求来自真实网络,两边一对就能把你对上号。
内容本身有 HTTPS 挡着,还是加密的。泄露的是「你去了哪里」,不是「你看了什么」。
| 泄露的是什么 | 是否泄露 |
|---|---|
| 你打开过哪些域名 | 泄露 |
| 访问时间 | 泄露 |
| 页面内容 | 不泄露 |
地址换了,网站清单没换。
为什么开了机场或节点还会泄露
先看根子上:原因几乎都出在「哪些流量走代理」这个判断上。常见的有五种。
- 分流规则把 DNS 放行了。 很多规则集默认「国内域名直连」。可为了判断一个域名是不是国内的,客户端得先用本地 DNS 查一次,就这一查,你就漏了。
- 系统 DNS 没接管过来。 在「系统代理」模式下,客户端只管得住浏览器的 HTTP/SOCKS 流量,系统自己发出的 DNS 查询照样直连。只有 TUN 模式(虚拟网卡)才接得住全部流量。
- IPv6 走了另一条路。 你的隧道只处理 IPv4,可你的网络支持 IPv6,于是系统优先拿 IPv6 直接解析、直接连。这就不只是 DNS 的事了,整条连接都绕开了隧道。
- 浏览器自己的 DoH。 Chrome、Firefox 和 Edge 可以把 DNS 查询加密后发给指定服务商(DNS over HTTPS)。这样运营商看不到,但查询仍然带着你的真实 IP 发出去,服务商知道你是谁。
- 客户端崩溃或重连的那几秒。 隧道一断,系统立刻退回默认 DNS,中间那几秒你是裸奔的。这就得靠 Kill Switch (隧道断了,网也断) 一类的功能兜底。
| 为什么隧道开着还泄露 | 原因 |
|---|---|
| 系统解析器被手动指定 | 手动设置 |
| 安卓的「私人 DNS」开着 | 系统设置 |
| IPv6 解析器在隧道外 | 双栈 |
| 分流规则把浏览器排除了 | 分流 |
| 客户端没有自带解析 | 客户端 |
DNS 泄露怎么检测:三种方法
方法一:在线检测站。 用浏览器打开 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)或者节点侧的地址,说明已经接管住了。
| 检测结果 | 含义 |
|---|---|
| 只有隧道的解析器 | 干净 |
| 出现运营商的解析器 | 在泄露 |
| 两者都有 | 部分泄露 |
DNS 泄露怎么解决:按客户端来
Clash / Mihomo / Clash Verge。 在配置里开启 DNS 模块,把 enhanced-mode 设为 fake-ip,nameserver 填写会经代理发出的加密 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 部分,但自己改过规则或换过客户端之后,重新测一次。机场、节点和客户端之间的关系,可以看机场是什么这篇。
检测结果看不明白,就把看到的东西连同你的环境一起交给 AI。
帮我看懂泄露检测的结果。
检测显示:出口地址(哪个)、国家(哪个)、
DNS 服务器(把显示的都列出来)、
WebRTC(某个地址 / 什么都没有)。
隧道:已连接。客户端:(名称)。浏览器:(哪个)。
告诉我哪些是泄露、哪些是正常表现,先修哪一个。
如果凭这些判断不了,说明还要看什么。
检查清单
- 在线检测站只显示节点所在国家的 DNS 服务器;
- 本站 IPv6 泄露检测没有发现本地 IPv6;
- WebRTC 泄露检测显示的是节点 IP;
- 客户端处于 TUN 模式或等效的全局接管模式;
- DNS 指向加密解析器,并且经代理发出;
- 浏览器的「安全 DNS」与客户端不冲突;
- Kill Switch 已开启。
七条全部通过,DNS 这一环就堵住了。改过配置、换过客户端或更新过订阅之后,重新跑一遍,五分钟的事。
404 VPN 的客户端目前提供 Android 和 macOS 版本,其余平台开发中(见下载页);客户端内置 DNS 泄露防护,DNS 查询默认在 VLESS 隧道内解析;Android 版带有 Kill Switch,隧道断开时不会退回本地 DNS。想了解连接是怎么建立的,可以看工作原理;开始使用请到首页。