泄露检测
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,比较两份答案。
-
用本地 DNS 查一次,把返回的地址记下来(example.com 改为你要查的域名):
nslookup example.com -
用加密 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 的别名。
-
进阶:向一个没有 DNS 服务的地址发查询,正常情况下只会超时。如果居然收到了回答,说明答案是路上抢先塞回来的:
nslookup example.com 192.0.2.1192.0.2.0/24 是保留给文档示例用的地址段,上面不会有真实的 DNS 服务器。
-
对照下表下结论。
| 本地 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。