WebRTC隐私

WebRTC 泄露:为什么挂了代理还能被看到真实 IP

WebRTC 是浏览器内置的实时通信组件,它可能在 JavaScript 拦不住的层面拿到你的网卡 IP。讲清楚泄露原理、浏览器差异和关闭方法。

如果说 DNS 泄露暴露的是"你访问了什么",那 WebRTC 泄露暴露的就是更直接的:你真实的网络出口 IP

WebRTC 是什么

WebRTC(Web Real-Time Communication)是浏览器内置的实时通信框架,用于网页视频通话、在线会议、P2P 文件传输。Google Meet、Discord 网页版的语音视频都依赖它。

为了建立 P2P 连接,WebRTC 需要收集本机的网络候选地址——这本身就是它的设计目的。

泄露机制

WebRTC 收集候选地址的过程叫 ICE。它会枚举:

  1. 本地网卡的 IP(内网地址,如 192.168.1.100
  2. 公网映射地址(通过 STUN 服务器拿到的"我在互联网上长什么样")

问题出在第 2 步:STUN 请求是浏览器直接从 UDP socket 发出的,很多代理客户端默认不接管这类流量。哪怕你的 HTTP 流量全走代理,STUN 拿回来的仍然是真实出口的公网映射。

更麻烦的是,网页里的 JavaScript 可以通过 RTCPeerConnection API 读到这些候选地址。

结果:一个页面的脚本就能拿到:

  • 你的真实公网 IP(即使你挂着代理)
  • 你的内网 IP 段(可以推断你在公司、在家还是在公共 WiFi)

检测与浏览器差异

IPchase 指纹检测里,"WebRTC IP 暴露"是核心检查项之一。实现原理就是创建一个 RTCPeerConnection,看它吐出的候选地址里有没有和 HTTP 出口不一致的公网 IP。

各家浏览器的现状:

浏览器 默认行为
Chrome / Edge 默认开启,泄露取决于 mDNS 混淆是否生效
Firefox 默认开启,可配置禁用
Safari 较新版本默认对网页隐藏本地 IP

Chrome 从 2018 年起给候选地址加了 mDNS 混淆(对外显示 xxxx.local 而不是真实 IP),普通网页拿不到你的内网 IP 了。但公网 STUN 映射在部分场景仍可能暴露,取决于代理类型和配置。

怎么防

按需关闭(最简单)

不常用网页视频通话的话,直接关掉 WebRTC:

  • Firefox:地址栏输入 about:config → 找到 media.peerconnection.enabled → 设为 false
  • Chrome / Edge:浏览器本身没有开关,需要装禁用 WebRTC 的扩展(如 WebRTC Limiter)
  • iOS Safari:设置 → Safari → 高级 → 读取器、WebRTC 里选择"仅限链接"

代理侧接管(更优雅)

现代代理客户端的 TUN 模式会把 UDP 流量也接管,STUN 请求走代理出去,拿回来的就是代理侧的映射地址。开着 TUN 挂代理 + 网页视频通话需求,两不误。

顺带说明

WebRTC 关掉后,依赖它的网页功能会失效:视频会议、语音通话、部分在线游戏联机。按你的使用习惯权衡。

小结

WebRTC 泄露的本质:浏览器为了 P2P 通信收集你的网络地址,这个收集动作可以绕过普通代理的 HTTP 层。防范:不用就关,要用就让代理接管 UDP(TUN 模式)。

检测是否已经泄露,IPchase 指纹检测一跑便知。

检测你的网络环境:回到首页做一次完整检测,或试试 指纹检测