DNS 问题 · 故障排查

DNS 泄露怎么检测与防护

作者:机场a 编辑部 更新: 阅读约 3 分钟

DNS 泄露最常见的原因是只开了系统代理、没有开 TUN,导致部分程序绕过客户端、直接用本地运营商 DNS 查询域名。最快的解决办法是:开启客户端内置 DNS 和 TUN 模式(含 DNS 劫持),同时关闭浏览器自带的安全 DNS,然后清缓存复测。

什么是 DNS 泄露,有什么影响

使用代理时,境外域名的解析理想情况下应由客户端接管,并通过代理或加密通道完成。DNS 泄露是指系统或某个程序在连接之前,把要访问的域名直接发给了本地默认 DNS(运营商 DNS 或路由器)。影响主要有三点:

  1. 访问记录暴露:本地运营商能看到你查询了哪些域名,即使后续流量是加密的;
  2. 解析结果被污染:本地 DNS 可能返回错误 IP,导致连接失败,表现就是《DNS 问题排查》中提到的解析异常;
  3. 分流和地区判断出错:部分网站会结合 DNS 出口判断地区,泄露可能让 AI、流媒体服务认为你身处国内,参见《AI 服务提示地区不支持》。

需要说明的是,检测结果中出现国内 DNS 并不一定是“严重问题”。如果你主要关心能否正常访问,而不是隐私,轻度泄露可以接受;如果在意隐私或地区判断,就需要按下文处理。

可能原因

原因 说明 对应解决方法
只用系统代理 系统代理只影响遵守代理设置的程序,DNS 查询仍走系统 开启 TUN 并劫持 DNS
客户端 DNS 未开启 dns.enable 为 false 时 mihomo 使用系统 DNS 开启客户端 DNS
浏览器安全 DNS 浏览器自己发 DoH 请求,不经过客户端 关闭或改为与客户端一致
DNS 连接不遵守规则 客户端向境外 DNS 的查询本身直连发出 开启 respect-rules
IPv6 绕行 系统通过 IPv6 DNS 查询,客户端未接管 关闭客户端 IPv6 解析或系统 IPv6

排查方法

  1. 打开检测网站:开启代理后访问 browserleaks.com/dns 或 dnsleaktest.com(后者可选 Extended Test),查看列出的 DNS 服务器;
  2. 判断结果:如果全部是境外 DNS(如 Cloudflare、Google 或节点所在地机房),说明没有明显泄露;如果出现中国电信、联通、移动等国内运营商 DNS,说明存在泄露;
  3. 区分来源:分别用浏览器和其他程序测试,或先关闭浏览器安全 DNS 再测,确认是浏览器还是系统层面的泄露;
  4. 查看客户端设置:确认当前是系统代理模式还是 TUN 模式,可参考《系统代理模式详解》。

解决步骤

  1. 开启客户端 DNS 并使用 fake-ip。fake-ip 模式下,客户端直接返回假地址,由代理节点按域名连接目标,境外域名不需要在本地发起真实查询。两种模式的取舍见《Fake-IP 与 Redir-Host 的区别》。

  2. 开启 TUN 模式。在客户端中开启 TUN,并保持 DNS 劫持开启,让所有 53 端口查询都进入客户端,详见《TUN 模式详解》。如果开启失败,可看《TUN 模式开启失败》。

  3. 让 DNS 查询遵守路由规则。mihomo 提供 respect-rules,开启后 DNS 连接按路由规则走代理;官方文档要求同时配置 proxy-server-nameserver,用于解析节点域名,并且不建议与 prefer-h3 一起使用。示例:

    dns:
      enable: true
      enhanced-mode: fake-ip
      fake-ip-range: 198.18.0.1/16
      respect-rules: true
      proxy-server-nameserver:
        - https://223.5.5.5/dns-query
      nameserver:
        - https://1.1.1.1/dns-query
        - https://8.8.8.8/dns-query
      nameserver-policy:
        'geosite:cn':
          - https://223.5.5.5/dns-query
          - https://doh.pub/dns-query
    tun:
      enable: true
      stack: mixed
      auto-route: true
      dns-hijack:
        - any:53

    以上写法让国内域名走国内 DNS、其他域名走境外加密 DNS,并通过代理发出。geosite:cn 依赖规则数据库,具体以你的配置为准。

  4. 关闭浏览器安全 DNS:Chrome 在「设置 → 隐私和安全 → 安全」中关闭「使用安全 DNS」;Firefox 在设置中搜索「DNS over HTTPS」并关闭。

  5. 清缓存后复测:Windows 执行 ipconfig /flushdns,PowerShell 执行 Clear-DnsClientCache,macOS 执行 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder,然后重启浏览器。

验证结果

  • 检测网站列出的 DNS 服务器不再包含国内运营商;
  • 国内网站访问速度正常(说明国内域名仍走国内 DNS);
  • 境外网站、AI 服务正常打开,地区判断与节点一致。

其他方案

  • 手机端:安卓客户端如《Clash Meta for Android》默认以 VPN 方式接管 DNS,泄露较少;iOS 上的《Quantumult X》等客户端可在 DNS 设置中指定服务器;
  • 路由器:在 OpenClash 等插件中开启 DNS 劫持,让全家设备的查询都经过代理;
  • 如果做完上述设置仍有大量国内 DNS 出现,可以检查是否有其他 VPN、安全软件在修改网络设置。

常见问题

检测出国内 DNS,但网页都能正常打开,要处理吗?

不是必须的。能正常访问说明解析结果可用,泄露主要影响隐私和地区判断。如果你在使用 AI 服务或流媒体时遇到地区问题,再按本文处理。

开了 fake-ip 还会泄露吗?

可能会。fake-ip 只对经过客户端的 DNS 查询生效,如果程序绕过客户端(例如浏览器安全 DNS、只开系统代理),仍会泄露,需要配合 TUN 使用。

检测网站显示的是 Cloudflare 或 Google,算泄露吗?

不算。这说明 DNS 查询从境外发出,是正常结果;关键是看有没有国内运营商的服务器。

关闭 IPv6 能解决泄露吗?

在部分网络环境中有帮助。如果客户端没有接管 IPv6 DNS,系统可能通过 IPv6 直接查询。可以在客户端中关闭 IPv6 解析后复测。

相关阅读

按 ⌘K / Ctrl+K 打开搜索