跳到正文
查个机

泄露检测

DNS 检测

首发 查于 第 1 版阅读约 5 分钟

要点

先用系统命令看本机配了哪台 DNS、实际是谁在答,再让同一个域名分别问本地 DNS 和加密 DNS,两份答案对不上就是被改了。全程只用终端,不用装软件。

问:本机现在把查询交给了哪台 DNS?

短答:系统设置只告诉你「配了谁」,要知道「实际谁在答」,得让解析器自己报出来。

先看配置。Windows 上一台电脑往往有好几块网卡(有线、无线、虚拟网卡),每块各配各的 DNS,要逐块看:

Get-DnsClientServerAddress -AddressFamily IPv4
ipconfig /all
# macOS
scutil --dns | grep nameserver
# Linux(用 systemd-resolved 的发行版)
resolvectl status

再问「实际是谁」。下面两个域名是专门用来自报的:Google 那个会在 TXT 记录里写出来问它的解析器地址,Akamai 那个直接把解析器地址当作 A 记录返回。

nslookup -type=txt o-o.myaddr.l.google.com
nslookup whoami.akamai.net
dig +short TXT o-o.myaddr.l.google.com
dig +short whoami.akamai.net

问:自报出来的地址怎么读?

短答:看它属于谁,是本地运营商、国内公共 DNS、境外机房,还是代理客户端编的假地址。

自报出来的地址 读法
本地电信、联通、移动的网段 系统在问本地运营商的 DNS,开着代理时就是 DNS 泄露
198.18 开头 代理客户端开了 TUN 的 fake-ip,查询被客户端接住了,这是它的正常设计
境外机房或节点所在地的地址 查询经代理从节点那端出去了
阿里、腾讯一类国内公共 DNS 的出口 系统或客户端把上游设成了国内公共 DNS
命令超时、没有回答 本机的 53 端口查询被拦,或客户端只接管了浏览器流量

把地址拿去任一检测站查归属即可分辨;网页那条路是否同样如此,用 DNS 泄露检测 在浏览器里再测一次对照。

问:DNS 污染检测怎么做?

短答:同一个域名,问一次本地 DNS,再问一次走 HTTPS 的加密 DNS,比较两份答案。

  1. 用本地 DNS 查一次,把返回的地址记下来(example.com 改为你要查的域名):

    nslookup example.com
  2. 用加密 DNS 再查一次。下面是 Cloudflare 的 JSON 查询接口,走 HTTPS,路上的设备改不了答案:

    curl -s -H "accept: application/dns-json" "https://cloudflare-dns.com/dns-query?name=example.com&type=A"

    Windows PowerShell 5.1 里要写 curl.exe,因为 curl 在那里是 Invoke-WebRequest 的别名。

  3. 进阶:向一个没有 DNS 服务的地址发查询,正常情况下只会超时。如果居然收到了回答,说明答案是路上抢先塞回来的:

    nslookup example.com 192.0.2.1

    192.0.2.0/24 是保留给文档示例用的地址段,上面不会有真实的 DNS 服务器。

  4. 对照下表下结论。

本地 DNS 的答案 加密 DNS 的答案 读法
与加密 DNS 相同 — 没被改
不同,但两个地址都能打开网站 — 正常:CDN 按解析器位置给了不同的就近节点
0.0.0.0、127.0.0.1,或与该网站毫无关系的地址 正常地址 被改了
超时 有答案 本地查询被丢弃
向 192.0.2.1 查询也收到了回答 — 路上有设备在抢答

问:Windows、macOS、Linux 的命令有什么差别?

短答:查配置和清缓存的命令各不相同,nslookup 三个系统都有,dig 只在 macOS 和多数 Linux 上自带。

用途 Windows macOS Linux
看配置的 DNS Get-DnsClientServerAddress、ipconfig /all scutil –dns resolvectl status
自报解析器 nslookup dig 或 nslookup dig(部分发行版要装 dnsutils 或 bind-utils)
清系统缓存 ipconfig /flushdns sudo dscacheutil -flushcache 后接 sudo killall -HUP mDNSResponder resolvectl flush-caches
发 HTTPS 查询 curl.exe curl curl

问:检测出问题,接下来改哪里?

短答:查询去了本地运营商就改设置,答案被改了就换加密 DNS,两样都正常却连不上就不是 DNS 的事。

  • 配置或自报结果指向本地运营商:按 安全 DNS 一页,先改代理客户端的 DNS,再看系统和浏览器。
  • 答案被改:同样改用加密 DNS,或让客户端接管查询,由节点那一端去解析。
  • 答案正常、git 之类的工具仍然连不上:问题多半在连接这一层,git 的情况对照 Recv failure: Connection was reset,浏览器的情况对照 err_connection_reset。

常见问题

nslookup 和浏览器里检测站显示的 DNS 服务器不一样,信哪个?

两个都对,只是测的路径不同。nslookup 走系统解析,检测站测的是浏览器那条路;浏览器开了安全 DNS、或者走了代理由节点那端解析,两边就会不同。要查网页的情况,以检测站读数为主。

DNS 检测时看到 198.18 开头的地址,是被污染了吗?

不是。198.18.0.0/15 是留给网络测试用的地址段,代理客户端在 TUN 的 fake-ip 模式下会先回这一段的假地址,真正的解析交给节点那一端完成。

清了系统的 DNS 缓存,还要重启浏览器吗?

Chrome 和 Edge 有自己的一份缓存。在地址栏打开 chrome://net-internals/#dns(Edge 把开头改为 edge://),按 Clear host cache 清掉即可,不必重启;Firefox 在 about:networking 的 DNS 页里清。

本页第 (1)
  • :首发

网站地图 · 机场推荐