WebRTC泄露:浏览器候选地址代表什么
这里列出浏览器为连接收集到的地址和类型。列表告诉你这次收集了什么,不代表所有连接都走同一出口。
WebRTC 是浏览器的实时通信功能,网页脚本可以通过它向 STUN 服务器询问「你的公网地址是什么」,这个请求可能不走代理,从而暴露真实出口。点下面的按钮在你自己的浏览器里检测,结果只显示在本页,不会回传本站。
检测时你的浏览器会向公共 STUN 服务器 stun.l.google.com:19302 发一次询问(这是 WebRTC 标准做法,那是第三方服务器;本站不经手也不记录)。
浏览器为什么要找这些地址?
因为建立通信时,需要寻找能接通的路径。IP 是网络地址的编号。WebRTC 是让网页或应用采集、传送音视频等媒体的技术。
网页用 RTCPeerConnection 代表本机与另一端之间的连接。ICE 帮两端寻找通信路径,即使中间有 NAT 地址转换,也要尝试建立连接。
NAT 会把内部地址换成对外使用的地址。ICE 收集的连接候选,就是供连接尝试使用的地址和类型记录。
STUN 用来询问 NAT 分配的地址和端口。端口是连接使用的号码,和地址一起帮助你分清这条记录从哪里来。
点击检测会向哪里发请求?
会向 Google 的公共 STUN 服务地址 stun.l.google.com:19302 发1次请求,用来取得公网反射地址。反射地址指 NAT 分配给这端的公网侧地址。
页面先建立连接,再收集 ICE 候选,读取地址和类型来分类。除了上面这次 STUN 请求,IP工具箱 不保存候选地址,也不把它们上传。
这只说明本页怎样处理,不代表别的网页也这样做。也别拿它替所有浏览器作数据处理承诺。
列表怎样知道已经收集完了?
脚本看的是 icecandidate 事件,也就是浏览器发来的候选通知。每条通知会带来候选,供页面读取地址和类型。
相关字段叫 address 和 type,分别表示候选地址、候选类型。收集结束时,事件里的 candidate 值为 null。
null 是结束标记,不是另一种地址。阅读列表时,每条记录都要按自己的实际内容看。
host 等类型各是什么意思?
类型告诉你这条候选从哪里取得,不决定所有连接走哪条路。列表中的几种类型要分开看。
- host:取自本机某个网络接口绑定的 IP 和端口。它说的是主机侧地址,不等于网页访问的公网 IP,也不说明别的候选。
- srflx:服务器反射候选,记录 NAT 分给 ICE 这一端的地址和端口。STUN 会返回这些公网侧资料,但它不能代替别的通信路径。
- prflx:对等反射候选,来自向对端发 STUN 请求时 NAT 产生的地址和端口分配。它和 srflx 取得地址的情形不同,不能合成同一种记录。
- relay:从中继服务器取得的候选,例如 TURN 服务。中继就是由服务器居中转接;这里说候选来自中继,不说明网页请求或全部媒体都走它。
网页一定能看到本地 IP 吗?
不一定,要看本地策略允许交出哪些地址。本地策略就是浏览器所在环境采用的处理规则,RFC 8828 这份网络技术文档讨论了不同做法。
W3C 的 WebRTC 规范提醒,建立通信可能让网页知道网络环境,包括私有 IP。私有 IP 是内部网络使用的地址。
网页还可能从地址了解位置及联网方式,也会多一些指纹线索。指纹信息就是帮助网页区分浏览器特征的线索,不是页面已经确认你的身份。
一次候选列表只记录这次收集结果。别把它当成所有环境都会交出的固定地址清单。
.local 为什么不是一串 IP 数字?
因为浏览器可能用本地名称代替数字地址。本页把 .local 候选按这种名称展示,不能把名称当成已读到的真实 IP。
mDNS 是处理这类本地名称的机制。相关工作草案描述了动态名称替换 host 地址、由浏览器内部完成解析的做法,但这份草案已经过期。
这能解释机制,不证明某款浏览器现在默认启用了它。有没有出现名称,不能替所有浏览器判断默认行为。页面也没有因此得到名称背后的本地数字地址。
候选和网页 IP 为什么可能不同?
因为媒体连接与网页访问未必使用同一条路。RFC 8828 说,WebRTC 流量默认按常规 IP 路由传送,默认不经代理服务器。路由就是数据选择的传送路径。
代理服务器是代为转发连接的服务器。两种连接是否同一个出口,还要看路由、代理和本地策略,不能只凭有隧道就认定相同。
分流隧道是只让部分流量进入隧道的做法。在这种情况下,WebRTC 还可能发现运营商侧地址;出现不同候选不等于已经确认泄露。
这页最终会列出什么?
IP工具箱 按类型展示这次收集的 ICE 候选。你能看到候选地址、类型,以及本地名称和公网反射地址的解释。
常见问题
WebRTC 本来做什么用?
它让网页或应用采集并传送音视频等媒体。这页看的是建立连接时收集到的地址记录。
检测会给外面的服务发请求吗?
会向前面注明的 Google STUN 服务请求反射地址。除此之外,本页不留存或另行上传收集到的候选。
.local 就是我的数字 IP 吗?
不是,它是本地候选的名称写法。浏览器内部处理名称解析,页面没有拿到背后的数字 IP。
地址和网页 IP 不同,就算泄露吗?
仅有这个差别还不能定下来。你还得看路由选择和本地策略,两类连接不一定同路。
relay 表示所有流量都走中继吗?
不表示,它只说这条候选的来源。别的连接和全部流量走哪里,不能靠这一条确定。
本站只读取你这次访问时 Cloudflare 边缘给出的信息(IP、国家 / 城市、ASN),不调用第三方查询接口,也不保存访问日志。「是否出现在云厂商公开范围清单里」只比对 AWS、Google Cloud、Azure 三家官方公布的 IP 范围文件,不是机房 IP 判定,也不构成评分;没出现在清单里不能推断成住宅 IP。