DNS 泄露与 WebRTC 泄露
代理工具运行正常、节点也能连通,不代表你的真实 IP 和 DNS 请求没有泄漏出去。DNS 泄露和 WebRTC 泄露是两种最常见、最容易被忽视的隐私风险,也是排查「为什么代理开着但某些网站还是认出了我的位置」时必查的两项。
DNS 泄露
什么是 DNS 泄露,为什么要在意?
简单来说,每次你访问一个网址,浏览器都需要先问一个 DNS 服务器「这个域名对应哪个 IP?」,然后才能建立连接。
问题在于:你的 DNS 查询走的是哪个服务器?
如果你启用了代理,但 DNS 查询绕过代理、直接走了运营商的 DNS——你的运营商就能看到你在查询哪些域名,并据此推断你访问了哪些服务。这就是 DNS 泄露。
更麻烦的是,运营商 DNS 还可能返回被污染的结果,导致访问某些网站失败,或者被重定向到错误的 IP。
因此,代理工具不仅要代理流量,还要代理 DNS 查询。
如何检测 DNS 泄露?
推荐检测工具:
- ip.net.coffee/dns — 简易的 DNS 泄露分析
- ipleak.net — 同时检测 IP、DNS、WebRTC 泄露
如何判断结果:
- 如果检测结果中出现了你的运营商 DNS(如中国电信、联通、移动的服务器),说明存在 DNS 泄露
- 不应出现你本地宽带运营商、公司网络或路由器下发的 DNS
- 如果你使用公共 DoH / DoT,检测结果可能显示 Cloudflare、Google、Quad9 等公共解析器;这不一定等于泄露,关键是这些 DNS 查询是否由代理客户端接管并按你的分流策略发出
修复 DNS 泄露
代理工具配置(最根本的解决方式)
大多数 DNS 泄露问题来自代理工具的 DNS 配置不当。如果你用了代理客户端,应同时确认两件事:
- DNS 被客户端接管:系统或应用发往 53 端口的 DNS 查询被劫持到代理客户端,或系统 DNS 已指向客户端本地监听地址
- 代理流量的 DNS 不走本地运营商:境外域名或代理流量相关域名应通过代理出口或可信加密 DNS 解析
fake-ip / FakeDNS 能提升分流精度,但它本身不等同于“所有 DNS 都已被劫持”。是否防泄露,还取决于 TUN、DNS hijack、系统 DNS 和客户端路由规则是否配合正确。
Mihomo(Clash Meta):
dns:
enable: true
enhanced-mode: fake-ip # 或 redir-host,fake-ip 更彻底
fake-ip-range: 198.18.0.1/16
nameserver:
- https://1.1.1.1/dns-query # 境外 DNS,需配合规则/TUN 确保查询不走本地运营商
- https://8.8.8.8/dns-query
nameserver-policy:
"geosite:cn":
- https://doh.pub/dns-query # 国内域名走国内 DNS
- https://dns.alidns.com/dns-query
关键点:enhanced-mode: fake-ip 负责返回假 IP 并让连接回到代理客户端处理;真正防止系统 DNS 绕过的配置通常还需要 TUN 模式、dns-hijack 或系统 DNS 指向客户端监听地址。不同 GUI 客户端的开关名称可能不同,通常叫“DNS 劫持”“Fake-IP”“增强模式”或“TUN DNS”。
sing-box:
"dns": {
"servers": [
{
"tag": "remote",
"address": "https://1.1.1.1/dns-query",
"detour": "proxy" // 通过代理出口解析
},
{
"tag": "local",
"address": "https://doh.pub/dns-query",
"detour": "direct" // 国内域名直接解析
}
],
"rules": [
{ "rule_set": "geosite-cn", "server": "local" },
{ "outbound": "any", "server": "local" } // 避免 DNS 查询产生循环依赖
]
}
系统 DNS 设置
如果你使用的是全局 TUN 模式,代理工具会接管所有流量(包括 DNS),此时系统 DNS 设置通常不影响结果。
如果你使用的是系统代理模式(仅 HTTP/SOCKS),手动将系统 DNS 改为加密 DNS只能减少运营商明文 DNS 暴露,不能保证 DNS 查询一定经过代理出口。要彻底降低泄露风险,仍应优先使用支持 DNS 接管的 TUN / VPN 模式,或在代理客户端中配置本地 DNS 监听并让系统指向它。
Windows:
- 「设置」→「网络和 Internet」→「以太网/Wi-Fi」→「DNS 服务器分配」
- 选择「手动」,填入
1.1.1.1和8.8.8.8(或支持 DoH 的 DNS) - 在 Windows 11 中可以直接开启「DNS over HTTPS」
macOS:
- 「系统设置」→「网络」→ 选择当前网络 →「详细信息」→「DNS」
- 添加
1.1.1.1、8.8.8.8,删除原有的运营商 DNS
Linux(使用 systemd-resolved):
sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 8.8.8.8
DNSOverTLS=yes
sudo systemctl restart systemd-resolved
浏览器 DNS 设置
Chrome / Firefox / Edge 有独立的「安全 DNS」设置,可以与系统 DNS 分开:
Chrome / Edge: 「设置」→「隐私和安全」→「安全」→「使用安全 DNS」→ 开启并选择提供商(如 Cloudflare)
Firefox: 「设置」→「常规」→ 滚动到底部「网络设置」→「设置」→ 开启「基于 HTTPS 的 DNS」
浏览器的安全 DNS 设置是兜底手段。如果你的代理工具已经通过 TUN 模式接管了全部 DNS,浏览器设置的优先级更低,通常不需要额外配置。
WebRTC 泄露
什么是 WebRTC 泄露?
WebRTC 是浏览器内置的实时通信协议,用于视频通话、语音聊天等场景。它为了建立点对点连接,会收集 ICE 候选地址,其中可能包含本地网络地址、代理/VPN 出口地址,或通过 STUN 探测到的公网地址。
现代 Chrome、Edge、Firefox 等浏览器通常会用 mDNS 主机名隐藏局域网 IP,因此你不一定会直接看到 192.168.x.x 这类地址。但如果浏览器、扩展代理或系统代理没有正确限制 WebRTC 的网络路径,网站仍可能通过 WebRTC 看到真实公网 IP 或非预期的网络出口。
如何检测 WebRTC 泄露?
- browserleaks.com/webrtc — 专项 WebRTC 泄露检测
- ip.net.coffee/webrtc — 同时检测多种泄露
如何判断结果:
- 「Public IP」应该与你的代理出口 IP 一致
- 「Local IP」可能显示局域网地址(如
192.168.x.x)、.localmDNS 主机名,或不显示;现代浏览器隐藏本地 IP 是正常现象 - 如果「Public IP」显示的是你的真实宽带 IP(而非代理 IP),则存在 WebRTC 泄露
修复 WebRTC 泄露
方案一:使用 TUN 模式(最彻底)
代理工具的 TUN 模式会在系统层面接管大部分网络流量,WebRTC 的 STUN/UDP 探测通常也会被代理或按规则处理。Mihomo / sing-box 的 TUN 模式是最稳妥的方案之一,但仍要确认没有排除浏览器进程、IPv6 流量或局域网外的 UDP 流量。
方案二:浏览器扩展
安装以下扩展或使用浏览器原生设置,禁用或限制 WebRTC:
| 方式 | 浏览器 | 说明 |
|---|---|---|
| Firefox 原生设置 | Firefox | 可直接通过 about:config 禁用 WebRTC,见下方 |
| AdGuard 浏览器扩展 | Chrome / Firefox / Edge | “Block WebRTC” 是全局开关,会影响所有网站 |
| WebRTC Leak Prevent / WebRTC Control 类扩展 | Chrome / Edge | 通过浏览器隐私 API 调整 WebRTC IP 暴露策略,效果需实测 |
| uBlock Origin | 桌面 Chrome / Firefox / Edge | 旧版曾提供 WebRTC 本地 IP 防护;桌面版相关选项已移除,不应再作为主要方案 |
Firefox 直接禁用 WebRTC:
- 地址栏输入
about:config,搜索media.peerconnection.enabled - 双击将值改为
false
完全禁用 WebRTC 会导致基于 WebRTC 的视频通话(如 Google Meet、Discord、微信网页版)无法使用。如果你需要这些服务,建议选择「限制 IP 暴露」而非完全禁用,或者在代理工具开启 TUN 模式时无需禁用 WebRTC。
快速自查清单
完成代理配置后,建议按以下步骤验证:
| 检测项目 | 工具 | 预期结果 |
|---|---|---|
| 当前 IP 地址 | ipleak.net | 显示代理出口 IP,而非真实 IP |
| DNS 泄露 | dnsleaktest.com | 只显示代理出口地区的 DNS 服务器 |
| WebRTC 泄露 | browserleaks.com/webrtc | Public IP 与代理出口 IP 一致 |
| IPv6 泄露 | ipleak.net | 无 IPv6 地址,或 IPv6 也走代理 |
如果你的代理工具未处理 IPv6 流量,开启了 IPv6 的网络环境可能通过 IPv6 直连暴露真实位置。建议在路由器或系统层面关闭 IPv6,或确认代理工具的 TUN 配置中包含了 inet6_address(sing-box)或等效设置。
常见误判
看到 Cloudflare / Google DNS 是否一定泄露?
不一定。公共 DNS 出现在测试结果里很常见,关键是它是否由代理客户端按规则发出。如果你本地运营商 DNS 没出现,且当前 IP、WebRTC Public IP 都是代理出口,通常不是严重泄露。
浏览器显示 .local 是否异常?
通常不是。现代浏览器会用 mDNS 主机名隐藏局域网 IP,.local 反而说明本地地址被做了隐私处理。
只打开浏览器 DoH 是否足够?
不够。浏览器 DoH 只处理浏览器自身的 DNS,其他应用、系统服务、硬编码 DNS 和 WebRTC 流量仍可能绕过。更稳妥的方案是使用 TUN / VPN 模式统一接管。
延伸阅读
- 代理软件总览 — 了解各客户端的 DNS 和 TUN 配置能力
- 配置参考 — Mihomo / sing-box 的 DNS 配置模板
- 术语表 — TUN、DoH、FakeIP 等概念解释
- uBlock Origin Wiki:Prevent WebRTC from leaking local IP address
- MDN WebExtensions API:privacy.network
- Cloudflare Docs:Oblivious DNS over HTTPS