一句话结论

DNS 泄漏指域名查询没有走代理隧道,而是从本地网卡明文发给运营商的解析器。后果是运营商拿到一份你查询过的域名清单,附带时间与频率,还能就地返回一个改过的结果。网页内容仍然在隧道里,看不到。

关键事实

  • 运营商本来就知道你的真实 IP,你是他们的宽带客户,泄漏改变的是他们知不知道你访问了哪些域名。
  • 泄漏的是域名清单加查询时间,不是网页内容,内容仍然在加密隧道里。
  • 明文 DNS 走 53 端口,中途任何一跳都能改写返回结果,这是泄漏的第二重风险。
  • Clash 系客户端的「DNS 覆写」默认关闭,接管解析通常要配合 TUN 模式一起开。

先说一个容易被搞反的地方。DNS 泄漏不会让运营商「看到你的真实 IP」,你的真实 IP 他们一直都知道,宽带是他们拉的,账号在他们手里。泄漏改变的是另一件事,他们从只知道你连了某个境外地址,变成知道你具体访问了哪些站点。

为什么打开网站之前要先问一次

浏览器拿到 youtube.com 这样的域名,本身没法直接连接,得先换成一个 IP 地址。负责回答这个问题的是 DNS 解析器,通常是你的路由器转给运营商的那台。

这一问一答默认走明文,端口 53,没有加密也没有身份验证。用代理的时候,正常情况是这一问也交给客户端,跟着网页流量一起进隧道,由节点那一端去解析。

没有 DNS 泄漏时的数据流架构图,域名查询与网页流量一起进入加密隧道,由机场节点解析
没有泄漏时,域名查询和网页流量走同一条隧道。运营商这一段只看到你连到了某个境外 IP,以及连了多久、传了多少。

泄漏发生时,多出来的那一条线

所谓泄漏,就是这一问没进隧道,从本地网卡直接发出去了。网页流量该走隧道还走隧道,只有域名查询跑到了外面。

发生 DNS 泄漏时的数据流架构图,网页流量仍走隧道,域名查询绕开隧道明文发给运营商 DNS
泄漏时多出橙色那条线。网页内容还在隧道里,但你要访问哪里,已经在这条线上说清楚了。

常见的成因有几种。客户端只开了系统代理,而某个程序不认系统代理设置,自己去问 DNS。或者配置里根本没接管解析,客户端只负责转发流量。再或者系统层面写死了一个解析器地址,优先级比客户端高。这几种情况和某个软件不走代理是同一类问题的两种表现,前者漏的是流量,后者漏的是查询。

运营商能看到什么

把两个场景并排放,差别就集中在一行上。

项目 没有泄漏 发生泄漏
你的真实 IP 与宽带账号 知道 知道
你连到了某个境外 IP 知道 知道
你在用代理 能推断出来 能推断出来
你访问了哪些域名 看不到 看得到,带时间与频率
网页里的具体内容 看不到 看不到

真正变化的只有第四行。前三行和泄漏无关,用不用代理都成立,把它们算进泄漏的后果里是不准确的。

只有域名听上去像是有限的信息,实际不然。域名本身就说明了用途,问过 mybank.com 说明你在处理钱,问过某个医疗站点说明你在关心什么。加上时间戳和频率,一份清单的信息量比多数人想的要大。

第二重风险是结果可以被改

明文 DNS 除了能被看见,还能被改写。你问 gmail.com 对应哪个 IP,理论上任何一跳都能返回一个不是 Google 的地址,你的浏览器不会觉得有什么不对,因为这一问一答里没有任何东西可以验证对方身份。

这就是 DNS 劫持。它比被记录更直接,被记录只是隐私问题,被改写是安全问题。HTTPS 在这里能拦住一部分,证书对不上浏览器会报警,但前提是你留意那个警告。

怎么自查

连上代理之后打开 dnsleaktest.com 或者 ipleak.net,看它报出来的解析器是谁。

判断标准不是解析器在哪个国家。有些机场的解析器就在国内,有些人会看到一个陌生的境外地址,这两种都不能直接下结论。要看的是它属不属于你本地的网络,出现自家宽带运营商的名字或者路由器的网关地址,那就是泄漏。

测一次不够。有些泄漏只在特定程序里出现,有些是切换 Wi-Fi 之后才冒出来,睡眠唤醒之后也常见。隔一段时间、换个网络环境再测一次更靠谱。

在客户端里怎么堵

Clash 系客户端有个专门管这件事的开关。Clash Verge RevClash 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 是可见的。想清楚自己要防的是哪一件事,再决定折腾到什么程度。

来源与说明

  1. 站长提供的问题背景与场景描述

    提供了本文要回答的三个问题与两个场景的划分,其中关于真实 IP 的部分与实际机制不符,正文已按机制更正。

  2. 机场帮客户端教程记录的界面

    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 段怎么写、有没有例外规则、系统上有没有别的程序抢着解析,都会影响结果。开完仍然要用检测页实测一次。

网络方向编辑头像

网络方向编辑

负责线路、协议、延迟与丢包这类网络基础内容的整理。写作原则是尽量给可以自己验证的描述,涉及具体数值时会写明测量方式与前提条件,不使用无法复现的绝对说法。

  • 网络基础概念
  • 线路与延迟
  • 连通性测量方法