我们经常接到用户询问关于各种 IP 地址泄露的相关问题,本文详细解释了涉及该话题的一些问题。
什么是 IP 地址泄露
我们先要明确 IP 地址泄露到底是什么意思,通常来讲,指的是使用浏览器,通过代理或者 VPN 访问一个网站,预期是目标网站只能看见访问者所使用的代理或 VPN 的出口 IP 地址,但目标网站却能获取到访问者的真正的网络 IP 地址。
请注意这里有几个限制条件
- 使用浏览器:如果是想防范 App 获取到真实的出口 IP 地址,那么还会涉及一些其他问题,如 App 可以强制绑定网卡绕过 Surge 进行访问以获取真实 IP 地址。(iOS 版本中可以靠 include-all-networks 参数阻止,但是会产生诸多副作用,除非有非常明确的需求,并不推荐使用。)
- 被目标网站获取:用户的 ISP 和代理与 VPN 提供商永远能知道用户的出口 IP,这不涉及泄露问题。
请注意,所有 IP 地址泄露问题,均指的是目标网站所有者使用技术手段穿透访问者的代理保护获取到了用户真实 IP,而非第三者。
泄露是怎样产生的
所有导致了出口 IP 泄露的情况,其实都是源于同一个原因:未通过代理服务器而直接请求了目标服务器,导致真正的出口 IP 被泄露。
一般最常被提到的是 WebRTC 和 DNS 导致的 IP 泄露。
WebRTC 泄露
WebRTC 导致 IP 泄露经常被提起的原因是,当仅在系统中配置代理服务器访问网站时,由于代理服务器不支持 UDP 转发(虽然 SOCKS5 代理协议本身支持,但是所有主流浏览器均不支持),所以一旦网页使用 WebRTC 功能就会以真实出口 IP 发出 UDP 数据包,导致 IP 泄露。
如果使用 Surge 且开启了增强模式,由于 UDP 数据包也会被代理所转发,所以并不会产生泄露。(除非对应请求匹配使用了 DIRECT 策略)
注:由于并非所有代理服务器都支持 UDP 转发,为了不影响用户正常使用,默认情况下若 UDP 流量使用了一个不支持 UDP 转发的代理策略,Surge 将回退至 DIRECT。可通过配置 udp-policy-not-supported-behaviour
参数调整该行为。
DNS 泄露
指的是由于 DNS 解析请求所产生的 IP 地址泄露,Surge 在规则匹配和使用 DIRECT 出站时均可能触发本地 DNS 查询,导致 IP 地址泄露。如果使用全局代理模式,或者规则中不存在会触发 DNS 的规则,那就不会产生本地 DNS 查询,也就不会泄露。
另外,DNS 查询产生泄露的原因,是因为 EDNS Client Subnet 机制导致 DNS 服务器发送了客户端的 IP 地址段所导致的泄露。
- 这种泄露对方所能获取到的 IP 地址并非准确的出口 IP 地址,仅为所在的地址段,一般仅可用于 ISP 和地区判断,意义不大。
- 可使用不支持 EDNS Client Subnet 的 DNS 以规避该问题,如 1.1.1.1。但这可能导致访问 CDN 资源时出现分配问题,不建议。
代理分流导致泄露
由于 Surge 支持通过规则系统进行分流,这使得只要网页向任意能匹配上 DIRECT 规则的地址发出请求,便可能导致 IP 地址泄露。任何存在分流设计的代理软件均存在该问题。
如在通过代理策略访问 https://a.com,但是 a.com 网页可能加载 b.com 的资源(或使用 JS、WebRTC 发出请求),只要 b.com 匹配的是 DIRECT 策略,那 a.com 的所有者就可以获取到用户的真实出口 IP 地址。
所以如果真的想要彻底阻止「IP 地址泄露」问题,唯一的办法是不使用规则分流机制,或在规则中避免使用 DIRECT,保证所有请求均通过代理转发。(以及开启增强模式避免 UDP 流量直接发出)
总的来说,对于一般用户,没有必要过度关心 IP 地址泄露问题。