DNS泄漏检测:怎么查、怎么修,与代理DNS设置入门
DNS泄漏检测要回答的问题很简单:开着代理的时候,你访问的域名有没有被本地网络先解析、先看见。结论先给:开了代理不等于不泄漏,检测一次只要几分钟;发现问题,按“代理 DNS、fake-ip、TUN”三个思路修;检测页只是旁证,要和你的规则一起看。这篇给出六步查法、三类修法和常见误区。
示例以 Clash 系客户端(Mihomo 内核)为准,配置全部是示意,地址是占位。字段含义以 Mihomo 官方仓库 的说明为准。界面一律写成“类似……”,请按含义找。
什么是 DNS 泄漏,它泄漏的到底是什么
访问一个网站前,设备要先问 DNS:这个域名对应哪个地址。这个“问”本身是一个网络请求。如果它没有经过代理,而是直接发给了本地网络的解析服务器,那么本地网络就能看到你想访问哪些域名。这就是 DNS 泄漏。
要分清它泄漏了什么、没泄漏什么:
- 会暴露:你查询过的域名清单,以及查询发生的时间;
- 不会暴露:HTTPS 网站里的具体页面内容,那部分由加密连接保护。
和它容易混淆的还有另外两类,合起来是 IP泄漏检测 要覆盖的范围:
| 类型 | 暴露的是什么 | 常见原因 |
|---|---|---|
| DNS 泄漏 | 你解析了哪些域名 | 查询没走代理,发给了本地 DNS |
| WebRTC 泄漏 | 浏览器可能对外透露的本机或真实公网地址 | 浏览器的实时通信功能不走代理 |
| IPv6 泄漏 | 你的真实 IPv6 地址 | 节点不支持 IPv6,流量却走了本地 IPv6 |
有一点别搞反:规则模式下,国内站点本来就是直连,由本地解析是设计如此,不算泄漏。判断标准是“该走代理的域名,有没有被本地解析”。这个问题的隐私背景,见 机场安全吗。
DNS泄漏检测:六步查一遍
检测页的原理通常是这样:让你的浏览器去解析一批独一无二的随机子域名,页面的服务器记录是哪些解析服务器来问的,再把它们的归属列给你。挑检测页时,看三点:说明了检测原理、使用 https、不要求你填任何个人信息。机场牛不推荐具体页面,也不引用任何页面的数据。
-
记录基线
- 做法:先关闭代理,或临时切到直连模式,打开一个 DNS 检测页,运行测试。
- 预期:列出的解析服务器归属,是你所在地的运营商或你自己设置的 DNS。记下来。
-
打开代理并确认出口
- 做法:回到规则模式,选一个海外节点,再打开“查询我的出口 IP”类页面。
- 预期:出口 IP 的归属地变成节点所在地区。
-
再测一次
- 做法:同一个检测页,刷新后重新运行测试。
- 预期:列表发生变化。
-
读结果
- 对照下面的表格判断。
-
换全局模式再测
- 做法:把模式切到全局,再测一次。模式含义见 全局模式与规则模式。
- 预期:如果规则模式有问题、全局正常,问题多半出在规则上。
-
排除浏览器自己的干扰
- 做法:浏览器的安全 DNS 功能开着时,查询会直接发给它指定的解析服务,不走你的 DNS 设置。关掉它,或让它跟随系统,再测。
- 预期:结果更稳定、更容易解释。
结果怎么读:
| 看到的情况 | 含义 | 要不要处理 |
|---|---|---|
| 解析服务器与你的本地运营商无关,且和出口地区或代理侧一致 | 查询大概率没有发给本地运营商 | 不用处理 |
| 列出的全是本地运营商的解析服务器 | 该走代理的域名被本地解析了 | 要处理,看下一节 |
| 本地和海外两类同时出现 | 一部分查询走了本地,一部分走了代理 | 检查 DNS 配置里的主备顺序 |
| 规则模式有、全局模式没有 | 规则命中了直连,或触发了本地解析 | 检查规则,见 分流规则怎么设 |
| 每次刷新结果都不一样 | 多个解析服务器轮换 | 一般正常,多测几次看整体 |
IP泄漏检测:WebRTC 与 IPv6 也要看
WebRTC:浏览器的实时通信功能,在某些设置下可能向网页透露本机的网络地址,这个行为不一定遵守系统代理。检测方法是打开一个 WebRTC 检测页,看它显示的地址里有没有你的真实公网地址。修复通常靠浏览器自己的设置或扩展,具体选项以浏览器官方说明为准。开启 TUN 模式后,UDP 流量也能被虚拟网卡接管,情况会好一些,见 TUN模式设置。
IPv6:你的网络有 IPv6,而代理节点只处理 IPv4 的话,部分流量可能绕过代理直接走本地 IPv6。检测方法是在出口 IP 页面里看有没有显示一个你本地的 IPv6 地址。修复思路有两条:让客户端的 DNS 不返回 IPv6 地址,或者确认节点和客户端都完整支持 IPv6 再开启。
DNS设置怎么修:代理 DNS、fake-ip、TUN 三个思路
| 思路 | 原理 | 注意 |
|---|---|---|
| 代理 DNS | 把域名交给代理侧解析,本地不查 | 系统代理下,浏览器通常会把域名交给代理,但其他软件不一定 |
| fake-ip | 先给软件一个虚拟地址,真正解析由代理侧完成 | 命令行查域名会看到虚拟地址,个别软件需要加入过滤列表 |
| TUN 加 DNS 接管 | 虚拟网卡接管所有流量,包括 DNS 查询 | 需要权限,必须同时配置 DNS 接管,否则只管了一半 |
还有一个容易漏掉的点:规则里的 GEOIP、IP-CIDR 这类按地址匹配的条目,需要先把域名解析成地址才能判断,通常要加上 no-resolve 之类的选项,才能避免触发本地解析。
下面是一份 DNS 部分的示意配置,只用来说明结构:
dns: # 示意配置,地址均为占位
enable: true
ipv6: false # 确认节点和网络都支持 IPv6 后再考虑开启
enhanced-mode: fake-ip # 先返回虚拟地址,真正解析交给代理侧
fake-ip-range: 198.18.0.1/16 # 虚拟地址段
fake-ip-filter: # 不使用虚拟地址的域名
- "*.lan"
default-nameserver: # 只用来解析下面 DoH 地址里的域名,写普通 IP
- 192.0.2.53
nameserver: # 日常解析使用的服务器,示意用 DoH
- https://dns.example.com/dns-query
proxy-server-nameserver: # 解析节点自身域名时使用
- https://dns.example.com/dns-query
照着做的话,大致这样走:
- 在客户端设置里,找类似“DNS 设置”或“DNS 覆写”的页面,打开内置 DNS;
- 模式选 fake-ip,解析服务器按你信任的选择填写;
- 用了 TUN 的话,确认 DNS 接管项也开着;
- 保存后重载配置,并在连接页面里关掉旧连接;
- 回到上一节,重新检测一遍。
改 DNS 地址只是改变了谁能看到查询,没有让查询凭空消失。用什么解析服务,等于信任谁,这一点要自己权衡。DoH(DNS over HTTPS)是把查询加密后发给解析服务,本地网络读不到内容,但解析服务本身仍能看到。
容易踩的五个误区
- 开了代理就不会泄漏:代理接管的是数据连接,解析是否走代理要看配置;
- 只要换 DNS 地址就修好了:这只是换了一个能看到你的人;
- 开了 TUN 就万事大吉:没配好 DNS 接管,TUN 同样会漏;
- 检测页显示本地 DNS 就是泄漏:要看被检测的域名该不该走代理,国内直连的域名由本地解析是正常的;
- 一次检测就能下结论:DNS泄漏检测 的结果会受模式、节点和浏览器设置影响,换时间、换模式、换节点多测几次,再下判断。
小 H 做 DNS泄漏检测:从怀疑泄漏到定位原因的完整过程(虚构案例)
下面的人物由机场牛虚构,不对应任何真实用户,不含任何检测数据,只演示一次检测里“先对照、后下结论”的思路。
小 H 用的是 Clash 系客户端,日常在规则模式下使用。他想确认自己有没有泄漏,于是挑了一个说明了原理、使用 https、不要求填个人信息的检测页,按下面几步走:
- 先记基线。 关掉代理,测一次。列出的是他所在地运营商的解析服务器,这是正常的,先记下来。
- 打开代理再测。 选了海外节点,规则模式,再测一次。结果里仍然全是本地运营商的解析服务器。他的第一反应是:有泄漏。
- 没急着下结论,换全局模式对照。 切到全局再测,列表变了,不再是本地运营商。这说明问题出在规则模式这一层,而不是节点或网络本身。
- 检查规则。 他看了一下规则顺序,发现一条按 IP 匹配的规则放在域名规则前面,并且没有加 no-resolve,域名可能因为它先被拿去本地解析。他把域名类规则前移,给 IP 类规则补上了 no-resolve。
- 排除浏览器的干扰。 他又看了一眼浏览器的安全 DNS 功能,发现它是开着的,查询直接发给了浏览器指定的服务,不走客户端的 DNS 设置。他让它跟随系统。
- 重载并重测。 改完之后,重载配置,关掉旧连接,再测一遍,结果变成了代理侧的解析。
小 H 的结论写得很克制:“当前配置下,这一次检测没有看到该走代理的域名被本地解析。” 他在笔记里记下日期、模式和节点,隔几天又换了个节点复测一次。
这个案例有两点值得学。第一,一个检测页的一次结果不能直接当结论,模式、节点、浏览器设置都会改变它,所以要对照着测。第二,每次只改一个地方,改完重载、关旧连接再测,才知道是哪一步起了作用。想把规则顺序和 no-resolve 弄清楚,回头看 分流规则怎么设 里的进阶部分。
改完 DNS 设置之后,逐项勾选这 10 条
每次改了 DNS 或 TUN 的相关设置,都建议把下面这份清单走一遍,结果才有可比性。
- 检测页说明了原理,使用 https,不要求填写任何个人信息。
- 先在关闭代理或直连的状态下,记录了一次基线结果。
- 打开代理后,出口 IP 的归属地已经变成节点所在地区。
- 规则模式和全局模式各测过一次,并且对照过两次结果。
- 浏览器的安全 DNS 功能,已经确认是关闭或跟随系统之后再测的。
- 做过 WebRTC 检测,页面显示的地址里没有我的真实公网地址。
- 在出口 IP 页面检查过 IPv6,没有出现我本地的 IPv6 地址。
- 改完配置之后重载了,并在连接页面关掉了旧连接,再重新检测。
- 换了时间或换了节点,至少再测过一次。
- 用一行笔记记下了检测日期、使用的模式和结论。
读 DNS 文档时常碰到的 6 个词,一句话对照
DNS 的文档里术语密度很高,下面这几个词反复出现,先搞懂含义,读起来会轻松很多。
- DNS:把域名换成地址的“查号台”,访问任何网站之前都要先问它一次。
- DoH:DNS over HTTPS,把查询加密后发给解析服务,本地网络读不到内容,但解析服务本身仍能看到。
- fake-ip:先给软件返回一个虚拟地址,真正的解析交给代理侧完成,所以命令行里查到的是虚拟地址,不是故障。
- 出口 IP:目标网站看到的你的地址,通常是 落地节点 的 IP,用它可以确认代理有没有生效。
- TUN模式:用虚拟网卡接管整台设备的流量,配合 DNS 接管,才能把查询一并管住。
- 全局模式与规则模式:检测时切换这两种模式对照,是定位问题出在规则还是节点的常用办法。
常见现象对照
| 现象 | 常见原因 | 怎么办 |
|---|---|---|
| 修改配置后结果没变 | 配置没重载,或旧连接还在 | 重载配置,关掉旧连接 |
| 某个网站打不开,其他正常 | fake-ip 与该软件不兼容 | 把它的域名加入过滤列表 |
| 开启后国内网站变慢 | 国内域名也走了代理侧解析 | 检查规则和 DNS 的分流设置 |
| 已连接但打不开网页 | 解析失败或规则命中了错误去向 | 见 已连接但无法上网怎么办 |
| 局域网设备找不到 | 内网域名被 fake-ip 处理 | 把内网后缀加入过滤列表 |
今天就做:三步确认你有没有泄漏
- 开代理,选海外节点,用 DNS 检测页按六步查一遍,把结论记下来;
- 同时跑一遍 WebRTC 和 IPv6 检测,分别判断;
- 有问题,先改 DNS 设置,再决定要不要开 TUN;订阅和客户端还没配好的,先走 Clash Verge导入订阅教程,想对比有哪些机场提供资料,可以看 机场推荐排行榜。
软件界面、配置字段和检测页的表现会随版本变化,以项目官方说明和软件实际显示为准。使用代理服务请遵守所在地法律法规,机场牛不提供法律意见。
DNS泄漏检测常见问题
开了代理为什么还会发生 DNS 泄漏?
因为域名解析和上网流量是两条独立的路径。代理接管了数据连接,但软件仍可能先向系统里设置的本地 DNS 问一遍地址,查询就发给了本地运营商。规则里按 IP 匹配的条目、不遵守系统代理的软件、浏览器自带的安全 DNS,都可能造成这种情况。
检测页显示的是本地运营商的 DNS,就一定是泄漏吗?
不一定,要看这个域名本来该不该走代理。国内网站在规则模式下本来就直连,由本地解析是正常的。判断标准是:该走代理的域名,是否被本地解析了。检测页的域名属于海外站点,理应走代理,所以它能反映问题。
用公共 DNS 是不是就不会泄漏了?
不是。换成公共 DNS 只是改变了谁能看到你的查询,从本地运营商换成了公共 DNS 的运营方,并没有消除可见性。要避免本地网络看到,关键是让查询经过代理或加密通道,而不是单纯换一个地址,同时要考虑你是否信任这个解析服务。
fake-ip 模式下用命令行查域名,结果是 198.18 开头的地址,是出问题了吗?
不是故障。fake-ip 的做法是先给软件返回一个虚拟地址,客户端再根据虚拟地址反查域名,把真正的解析交给代理侧完成。所以在这个模式下,命令行查到的是虚拟地址。如果某个软件和虚拟地址不兼容,可以把它的域名加入过滤列表。
WebRTC 泄漏和 DNS 泄漏是一回事吗?
不是。DNS 泄漏暴露的是你访问了哪些域名,WebRTC 泄漏暴露的是浏览器可能对外透露的本机或真实公网地址。两者原因不同,修复办法也不同,前者主要靠配置 DNS 和 TUN,后者主要靠浏览器设置或扩展,建议分别检测。