一句话结论
DNS 泄漏指域名查询没有走代理隧道,而是从本地网卡明文发给运营商的解析器。后果是运营商拿到一份你查询过的域名清单,附带时间与频率,还能就地返回一个改过的结果。网页内容仍然在隧道里,看不到。
关键事实
- 运营商本来就知道你的真实 IP,你是他们的宽带客户,泄漏改变的是他们知不知道你访问了哪些域名。
- 泄漏的是域名清单加查询时间,不是网页内容,内容仍然在加密隧道里。
- 明文 DNS 走 53 端口,中途任何一跳都能改写返回结果,这是泄漏的第二重风险。
- Clash 系客户端的「DNS 覆写」默认关闭,接管解析通常要配合 TUN 模式一起开。
先说一个容易被搞反的地方。DNS 泄漏不会让运营商「看到你的真实 IP」,你的真实 IP 他们一直都知道,宽带是他们拉的,账号在他们手里。泄漏改变的是另一件事,他们从只知道你连了某个境外地址,变成知道你具体访问了哪些站点。
为什么打开网站之前要先问一次
浏览器拿到 youtube.com 这样的域名,本身没法直接连接,得先换成一个 IP 地址。负责回答这个问题的是 DNS 解析器,通常是你的路由器转给运营商的那台。
这一问一答默认走明文,端口 53,没有加密也没有身份验证。用代理的时候,正常情况是这一问也交给客户端,跟着网页流量一起进隧道,由节点那一端去解析。
泄漏发生时,多出来的那一条线
所谓泄漏,就是这一问没进隧道,从本地网卡直接发出去了。网页流量该走隧道还走隧道,只有域名查询跑到了外面。
常见的成因有几种。客户端只开了系统代理,而某个程序不认系统代理设置,自己去问 DNS。或者配置里根本没接管解析,客户端只负责转发流量。再或者系统层面写死了一个解析器地址,优先级比客户端高。这几种情况和某个软件不走代理是同一类问题的两种表现,前者漏的是流量,后者漏的是查询。
运营商能看到什么
把两个场景并排放,差别就集中在一行上。
| 项目 | 没有泄漏 | 发生泄漏 |
|---|---|---|
| 你的真实 IP 与宽带账号 | 知道 | 知道 |
| 你连到了某个境外 IP | 知道 | 知道 |
| 你在用代理 | 能推断出来 | 能推断出来 |
| 你访问了哪些域名 | 看不到 | 看得到,带时间与频率 |
| 网页里的具体内容 | 看不到 | 看不到 |
真正变化的只有第四行。前三行和泄漏无关,用不用代理都成立,把它们算进泄漏的后果里是不准确的。
只有域名听上去像是有限的信息,实际不然。域名本身就说明了用途,问过 mybank.com 说明你在处理钱,问过某个医疗站点说明你在关心什么。加上时间戳和频率,一份清单的信息量比多数人想的要大。
第二重风险是结果可以被改
明文 DNS 除了能被看见,还能被改写。你问 gmail.com 对应哪个 IP,理论上任何一跳都能返回一个不是 Google 的地址,你的浏览器不会觉得有什么不对,因为这一问一答里没有任何东西可以验证对方身份。
这就是 DNS 劫持。它比被记录更直接,被记录只是隐私问题,被改写是安全问题。HTTPS 在这里能拦住一部分,证书对不上浏览器会报警,但前提是你留意那个警告。
怎么自查
连上代理之后打开 dnsleaktest.com 或者 ipleak.net,看它报出来的解析器是谁。
判断标准不是解析器在哪个国家。有些机场的解析器就在国内,有些人会看到一个陌生的境外地址,这两种都不能直接下结论。要看的是它属不属于你本地的网络,出现自家宽带运营商的名字或者路由器的网关地址,那就是泄漏。
测一次不够。有些泄漏只在特定程序里出现,有些是切换 Wi-Fi 之后才冒出来,睡眠唤醒之后也常见。隔一段时间、换个网络环境再测一次更靠谱。
在客户端里怎么堵
Clash 系客户端有个专门管这件事的开关。Clash Verge Rev 与 Clash Verge 的设置页里,Clash 设置那一块有一项叫「DNS 覆写」,旁边跟着一个齿轮可以展开具体配置。这一项默认是关的,也就是说装完不动它,解析并不由客户端接管。
打开它通常还要配合 TUN 模式一起用。原因是系统代理只覆盖认这套设置的程序,系统代理与 TUN的区别就在这里,TUN 在网络层接管,不认系统代理的程序也躲不掉,DNS 一般也随之进隧道。代价是要管理员权限,出问题时排查范围更大。
安卓上情况稍好,客户端通过系统 VPN 接口接管流量,本来就是网络层。Surfboard 的仪表盘会直接把当前使用的 DNS 显示在首页卡片上,本文截图里那台显示的是 107.182.189.145,看一眼就知道解析走的是哪里。这种把解析器摆在明面上的设计不多见,值得夸一句。
还有一件事顺带说。机场给的配置文件里往往自带 DNS 段,Surfboard 导入配置后的卡片上写着「3 DNS」,就是这份配置带了三条 DNS 设置。你在客户端里手动改的东西,可能会被配置里的写法覆盖,改完记得再测一次。
不建议做的一件事
网上常见的建议是手动把 DNS 改成 8.8.8.8 或者 1.1.1.1。这在国内网络环境下解决不了问题。明文 DNS 到公共解析器这一路同样要经过运营商,能被看见,也常常拿不到正确结果。
想让解析这一步真正安全,方向是让它进隧道,而不是换一个更知名的明文解析器。
判断到哪一步为止
这篇讲的是机制和自查方法。哪家机场的配置默认接管了 DNS、接管得干不干净,需要逐家实测才能说,本站目前没有这项测试数据,所以不写结论。
顺带提一句边界。堵住 DNS 泄漏解决的是域名清单被谁看到的问题,它不改变运营商知道你在用代理这一事实,也不改变你连接的那个境外 IP 是可见的。想清楚自己要防的是哪一件事,再决定折腾到什么程度。
来源与说明
- 站长提供的问题背景与场景描述
提供了本文要回答的三个问题与两个场景的划分,其中关于真实 IP 的部分与实际机制不符,正文已按机制更正。
- 机场帮客户端教程记录的界面
DNS 覆写开关的位置来自 Clash Verge Rev 与 Clash Verge 的设置页截图,Surfboard 仪表盘的 DNS 显示来自安卓端截图,只覆盖这几款客户端。
常见问题
DNS 泄漏到底会泄漏什么?
泄漏的是域名查询本身。你的设备在打开网站前要先问「这个域名对应哪个 IP」,这个问题如果没进隧道,就以明文形式发给了运营商的解析器。运营商由此拿到一份你访问过的域名清单,还带着每次查询的时间和频率。网页里的具体内容仍然被 HTTPS 加密,也仍然走在隧道里,那部分看不到。
发生 DNS 泄漏,运营商是不是就知道我的真实 IP 了?
你的真实 IP 运营商本来就知道,宽带是他们给的,账号也在他们那里,这一点和有没有泄漏无关。泄漏改变的是另一件事,他们从「只知道你连了某个境外 IP」变成「知道你具体访问了哪些站点」。把泄漏说成暴露真实 IP 是一种常见误解,真正被泄漏的是访问清单。
怎么检测自己有没有 DNS 泄漏?
连上代理之后打开 dnsleaktest.com 或 ipleak.net 这类检测页,看它报出的解析器归属。判断标准不是解析器在哪个国家,而是它属不属于你本地的网络,出现自家宽带运营商或者路由器网关地址就是泄漏。反复测几次,有些泄漏只在特定程序或者切换网络之后才出现。
手动把 DNS 改成 8.8.8.8 能解决吗?
在国内网络环境下不建议这么做。明文 DNS 走 53 端口,到公共解析器这一路同样经过运营商,不仅可能被记录,还常常拿到被改写的结果。有效的做法是让查询进隧道,也就是在客户端里打开 DNS 接管并配合 TUN 模式,让解析发生在节点那一端。
开了 TUN 模式就一定不会泄漏吗?
概率大幅下降但不是绝对。TUN 在网络层接管流量,连不认系统代理的程序也会被拉进来,DNS 一般也随之进隧道。但配置里的 DNS 段怎么写、有没有例外规则、系统上有没有别的程序抢着解析,都会影响结果。开完仍然要用检测页实测一次。