WebRTC 泄露:为什么挂了代理还能被看到真实 IP
WebRTC 是浏览器内置的实时通信组件,它可能在 JavaScript 拦不住的层面拿到你的网卡 IP。讲清楚泄露原理、浏览器差异和关闭方法。
如果说 DNS 泄露暴露的是"你访问了什么",那 WebRTC 泄露暴露的就是更直接的:你真实的网络出口 IP。
WebRTC 是什么
WebRTC(Web Real-Time Communication)是浏览器内置的实时通信框架,用于网页视频通话、在线会议、P2P 文件传输。Google Meet、Discord 网页版的语音视频都依赖它。
为了建立 P2P 连接,WebRTC 需要收集本机的网络候选地址——这本身就是它的设计目的。
泄露机制
WebRTC 收集候选地址的过程叫 ICE。它会枚举:
- 本地网卡的 IP(内网地址,如
192.168.1.100) - 公网映射地址(通过 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 指纹检测一跑便知。
检测你的网络环境:回到首页做一次完整检测,或试试 指纹检测。