DNS 泄漏的判断边界:解析路径与连接出口
Clash 能打开网页,不等于所有 DNS 请求都经过预期路径。浏览器可以通过 HTTP 代理发送连接,也可能提前调用系统解析器;后台应用可能忽略系统代理;浏览器的安全 DNS 又可能自行建立 HTTPS 解析连接。排查时必须分开记录两件事:域名交给谁解析,以及解析请求通过哪条线路发出。
本文把“DNS 泄漏”限定为:本应进入指定解析链路的域名查询,实际交给了本地网络、运营商或其他非预期解析服务。主动为国内直连业务指定本地解析器,不应只因检测页显示国内地址就判为泄漏。判断依据是事先定义的分流目标,而不是结果里有没有某个国家名称。
| 观察结果 | 实际含义 | 下一步核对 |
|---|---|---|
| 网站出口已变化 | 当前网页连接走了代理 | 另查 DNS,不能据此推断解析出口 |
| 检测到运营商解析器 | 测试域名最终由该递归服务查询 | 检查系统 DNS、浏览器安全 DNS 与分流策略 |
| 检测到多个解析器 | 可能存在并行查询、转发或多个出口 | 对照 nameserver、fallback 及测试条件 |
| 查询得到 198.18 段地址 | 可能已命中 Fake-IP 映射 | 继续核对流量是否回到同一个内核 |
检测前准备:固定客户端、浏览器与网络条件
下面的配置以 mihomo 内核为对象。Clash Meta 是其历史名称;旧 Clash 原版及停更客户端不一定支持全部字段。先从客户端的“关于”或内核信息页记录内核名称、版本号,再导出当前配置。客户端版本与内核版本要分别记录,不能只写“Clash 最新版”。
- 保留回退入口。导出订阅配置与本地覆写;记下系统代理、TUN、浏览器安全 DNS 的原始开关状态。
- 固定测试样本。同一网络、同一节点、同一浏览器下比较,测试期间暂停其他 VPN 与代理工具。
- 先排除浏览器独立解析。Chrome 可在“设置”→“隐私和安全”→“安全”查找“使用安全 DNS”;Firefox 可在“设置”→“隐私与安全”中查找“基于 HTTPS 的 DNS”。菜单名称可能随版本调整。
- 确认配置生效位置。订阅原文件可能在更新时被替换。应通过客户端提供的本地覆写或合并入口持久化修改,并检查最终运行配置。
在线 DNS 泄漏检测:对照测试而非只看地理位置
可以打开 DNSLeakTest,先运行 Standard test,再运行 Extended test。检测站通过随机子域名观察递归解析器对权威服务器的查询,因此结果通常是解析服务的出口,不一定是系统设置里填写的服务器地址,也不是代理节点地址。
三组结果应如何记录
- 基线:关闭客户端代理接管后检测一次,记录解析器 IP、运营主体与当前网络。
- 系统代理:开启客户端系统代理,保持 TUN 关闭,再检测一次。若结果没变化,只说明这条测试路径仍可能使用原解析链路。
- TUN 接管:启用下文 DNS 与 TUN 配置后检测,记录同样字段,并在客户端连接面板中检查解析连接。
每组建议执行 2 次。结果不一致时,先检查缓存、浏览器安全 DNS 和多个上游并发,不要立即换节点。公共解析服务可能使用任播与分布式出口;检测页面标注的国家或城市可能不准确。应重点比较运营主体是否符合预期,以及关闭某条解析路径后结果是否随之变化。
在线检测仅覆盖浏览器触发的测试查询,不能证明系统中每个应用都已接管。还需执行本机查询,必要时观察物理网卡流量。不要把含订阅链接、访问域名或访问令牌的完整日志直接上传到公共讨论区。
fake-ip 基础配置:先让域名与连接对应
Fake-IP 模式先给应用返回一个虚拟地址,再由内核依据映射恢复域名并匹配规则。它能减少部分连接建立前的真实解析依赖,但不是加密协议,也不会自动拦截所有 DNS。若应用拿到虚拟地址后绕过内核连接,反而可能出现超时。
以下为合并片段,不是完整订阅;现有代理节点、策略组与规则需要保留。若运行配置已包含 dns:,请合并其子字段,不要在文件末尾重复添加同名顶层键。
dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
default-nameserver:
- 223.5.5.5
proxy-server-nameserver:
- https://223.5.5.5/dns-query
nameserver:
- https://1.1.1.1/dns-query
nameserver-policy:
"+.qq.com":
- https://dns.alidns.com/dns-query
listen将 DNS 服务限制在本机 1053 端口。系统 DNS 设置通常不能指定这个端口,不能只填入127.0.0.1就认为已经接管。default-nameserver用于解析 DNS 服务器自身的域名,也就是引导解析;它不是普通域名的常规主上游。proxy-server-nameserver为代理节点的域名提供解析路径,减少节点解析与代理建立之间的循环依赖。nameserver-policy中的+.qq.com匹配该域名及其子域名,并将其交给指定上游。其他域名使用nameserver,除非另有规则改变解析行为。fake-ip-filter让匹配域名返回真实解析结果,不等于把它们设为直连,也不保证局域网名称能被公共 DNS 解析。
示例暂时关闭 DNS 的 AAAA 返回,用于减少首次排查变量;这不等于关闭操作系统 IPv6,也不会阻止应用使用缓存的 IPv6 地址。需要 IPv6 的环境应恢复相应能力,并确认 IPv6 路由、DNS 与代理接管都完整,不能长期依靠单一开关掩盖路径问题。
fallback 过滤:选择答案,不是阻止查询外发
fallback 容易被误解成“主解析器超时后才访问备用服务器”。在常见配置中,主上游与 fallback 可能并行查询,再由过滤条件决定采用哪组答案。因此它可能让同一个域名被多组服务看到,不适合作为“只允许单一解析服务”的证明。
下面是偏向国内地址优先的独立配置示例。若采用此方案,应将这些字段合并到同一个 dns: 下;它与前面的单上游方案用途不同,建议先验证基础方案,再决定是否引入 fallback。
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
default-nameserver:
- 223.5.5.5
nameserver:
- https://dns.alidns.com/dns-query
fallback:
- https://1.1.1.1/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
此例会根据 GeoIP 条件判断主解析答案;不符合 CN 条件或命中所列地址范围的答案会触发采用 fallback 结果。实际行为依赖地理数据与内核实现,不能把 IP 地理分类当成域名可信度判断。跨国 CDN、企业服务与数据更新延迟都可能让选择结果偏离预期。
如果需求只是“几个明确域名用指定解析器”,优先使用 nameserver-policy,比扩大 fallback 条件更容易验证。对已命中专用解析策略的域名,也不要假定它仍会按默认主上游与 fallback 的组合处理,应查看当前版本文档和实际查询日志。
TUN 劫持 DNS:补齐系统代理覆盖不到的查询
系统代理主要服务于遵循代理设置的应用,并不等于系统 DNS 接管。TUN 通过虚拟网卡接收流量,再将匹配的 DNS 请求转交内核解析模块。下列片段可与前面的 DNS 基础配置合并,但能否创建虚拟网卡仍取决于系统权限、客户端服务与平台支持。
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
- tcp://any:53
any:53 用于匹配进入 TUN 的 UDP 53 请求,第二项补充 TCP 53。它们不是系统防火墙规则:只有实际进入内核接管路径的流量才有机会被处理。多网卡、虚拟机、容器、其他 VPN 与特定系统路由都可能改变这一前提。
53 端口之外的路径
- DoH:通常使用 HTTPS 的 443 端口,无法仅靠 DNS 53 劫持识别为传统查询。应管理应用安全 DNS 设置,或对其连接做明确路由。
- DoT:通常使用 TCP 853,移动设备的私人 DNS 可能采用此路径,需要单独检查。
- 局域网发现:mDNS 常用 UDP 5353,不属于这里的普通 DNS 劫持范围。打印机、投屏和本地域名发现应单独测试。
启用后若整机断网,先关闭 TUN 恢复网络,再检查管理员权限或服务模式、默认出口网卡与路由冲突。不要同时打开多个客户端的 TUN,也不要为解决端口冲突直接把 DNS 服务暴露到 0.0.0.0;监听地址调整还涉及局域网访问控制。
本机验证与验收:配置生效、流量接管、订阅更新
先验证 1053 监听与 Fake-IP 返回
在已安装 dig 的系统上运行以下命令。显式指定端口可以直接测试内核 DNS,不依赖操作系统是否已经切换解析器。未安装该工具时,可使用客户端 DNS 诊断功能;普通 nslookup 默认访问的是 53 端口。
dig @127.0.0.1 -p 1053 www.wikipedia.org A
dig @127.0.0.1 -p 1053 www.qq.com A
dig @1.1.1.1 www.wikipedia.org A
前两条直接检查内核 DNS。在示例 Fake-IP 配置下,未被过滤的 A 查询通常返回 198.18.0.0/16 范围内的映射地址;这不能证明实际采用了哪个真实上游。第三条在 TUN 开启且 53 劫持生效时,也可能被内核截获,此时即使工具显示服务器为 1.1.1.1,也不能据此认定请求真的到达该地址。
再观察物理网卡与实际连接
需要进一步确认时,可以在 Wireshark 中选择实际联网网卡,以 udp.port == 53 || tcp.port == 53 || tcp.port == 853 过滤。观察测试期间是否有非预期明文查询离开物理网卡。此过滤条件不覆盖 DoH,也不能单凭“未见 53 流量”证明所有查询都经代理;加密上游的连接出口仍要结合客户端日志和连接面板确认。
- 清理旧缓存。Windows 可运行
ipconfig /flushdns;采用 systemd-resolved 的 Linux 可运行resolvectl flush-caches。随后重启测试浏览器,避免旧连接干扰。 - 复跑在线测试。保持相同节点和浏览器设置,比较解析器运营主体与基线差异。
- 复测实际业务。检查国内网站、海外网站、企业内网与局域网设备,确认专用 DNS 策略没有破坏内部域名解析。
- 验证持久化。更新一次订阅并重启客户端,检查运行配置中的
dns、tun与策略字段仍然存在。