DNS 泄露怎么自测?三条命令看真相

很多人以为「连上了就安全了」,其实流量加密只解决了一半问题。另一半是 DNS 解析——如果域名是谁帮你查的,运营商一清二楚,你访问了什么网站也就藏不住。

这就是 DNS 泄露。它不会让你断网,也不会报错,所以绝大多数人根本不知道自己在泄露。

泄露是怎么发生的

正常的代理链路是:你的请求 → 代理服务器 → 目标网站。DNS 解析也应该由代理解析,或者交给远端 DNS。

但系统里 DNS 的设置是独立的。代理软件改了路由,没改 DNS,系统仍然会把 example.com 交给本地运营商去查。结果就是:

  • 流量确实是加密的,内容看不到;
  • 但你访问了哪些域名,本地 DNS 服务器一清二楚。

更糟的是,某些情况下本地 DNS 返回的 IP 会被引导到错误节点,出现「连上了但打不开网页」。

三条命令,自己测

不用打开任何在线检测网站,本地就能测。

第一条:看系统当前用哪个 DNS

# Linux / macOS
cat /etc/resolv.conf

# macOS 更准的做法
scutil --dns | grep nameserver

# Windows
ipconfig /all | findstr /i "DNS"

如果这里出现的是 192.168.x.x(路由器)或者运营商 IP(114.114.114.114、223.5.5.5 这类),说明解析还在本地做。

第二条:看解析结果和真实出口是否匹配

# 查当前出口 IP
curl -s https://api.ipify.org

# 查某个域名解析到的 IP
dig +short example.com
# 或
nslookup example.com

如果出口 IP 显示你在境外,但 dig 递归查询走的是本地 DNS,两者就不一致。这种不一致本身就是泄露的信号。

第三条:看 DNS 请求到底发给了谁

# Linux 上抓 DNS(53 端口)的包
sudo tcpdump -i any -n port 53

# 然后在另一个窗口随便访问几个网站
curl -s https://www.baidu.com > /dev/null

如果抓到的包目标是 192.168.1.1 或者本地运营商 DNS,而不是代理的远端地址,就是明确的泄露。

💡 判断标准:只看两件事——解析请求发给了谁,以及解析结果和出口地区是否匹配。前者决定隐私,后者决定能不能正常访问。

为什么修了还是漏

常见的三种「修了没用」:

  1. 只改了浏览器设置。 浏览器开了「安全 DNS」或 DoH,绕过了系统 DNS,代理的 DNS 劫持对它无效,结果仍然是明文查询发到了第三方。
  2. 只开了系统代理,没开 TUN。 系统代理不接管 DNS,命令行工具和部分应用根本不走代理,DNS 自然也不走。
  3. 开了 TUN 但 DNS 没接管。 TUN 接管了路由,DNS 仍按系统设置走。这类最隐蔽,因为「能上网」,只是解析泄露了。

修复顺序

  1. 先确认代理软件是否开启了 DNS 转发 / DNS 劫持(不同产品叫法不同),这是最根本的一步。
  2. 如果代理不接管 DNS,就把系统 DNS 改成远端加密 DNS(DoH/DoT),至少保证查询不被本地看到。
  3. 浏览器里如果开了「安全 DNS」,要么关掉让代理接管,要么确保它指向和代理一致的上游,别一边走代理一边走另一家 DoH。
  4. 最后再验证一遍:抓包看 53 端口还有没有本地目标。

什么时候可以不用太担心

DNS 泄露的危害主要在「隐私」和「访问异常」两件事上。如果你只是想让网页打开更快、看视频不卡,泄露带来的影响有限;但如果你在意「谁在记录我访问了什么」,这一项必须处理。

延伸阅读:TUN 模式和系统代理的区别、连接失败怎么排查、连上了但打不开网页。