你的 VPN 说你在法兰克福。你刚打开的那个网站却不买账,而且它根本不用猜。在你崭新的 IP 地址和你那台一切如旧的浏览器之间,某处藏着一个矛盾,而找出矛盾正是检测系统的全部工作。本页的面板此刻就在对你的浏览器运行同样的比对。
误会要从 VPN 实际做的事情说起。它加密你的流量,再从另一个地址把流量递给互联网。仅此而已。它不会改动你操作系统里的时钟、你的浏览器请求的语言、你 TCP 数据包的形状,也改变不了新地址属于一家出租服务器的公司这个事实。想知道真相的网站读的就是这些,而它们彼此吻合,唯独与那个 IP 对不上。
你的新 IP 自带标签
每一个公网 IP 地址都属于一个自治系统,即注册在某一个组织名下的一段地址,而这份注册信息是公开的。你的家庭宽带来自 Comcast、Vodafone 或 Ziggo 名下的网段;VPN 出口则来自 M247、DataCamp、Leaseweb,或随便哪家 VPN 服务商租用机柜的公司名下的网段。告诉网站你在哪个国家的那次查询,会在同一个响应里以 org 或 asn 字段把这件事一并告诉它。首页扫描会把这一行展示给你;它就是上方面板里的“网络运营商”一行。
这次查询没有任何高明之处。消费级 ISP 把地址分给人,托管公司把地址分给机器。第二类地址跑来逛网店、登录银行或追剧,还没等其他检查开始就已经显得不对劲了,而反欺诈引擎正是照此加权的。这与我们在为什么你总是遇到人机验证里描述的是同一个信号,因为发问的本来就是同一个引擎。
信誉列表早就认识那些 VPN 网段
在 ASN 之上还有第二层:商业 IP 信誉数据库。IPQualityScore、ipinfo 的隐私检测、IP2Proxy、Spur 以及另外十几家,会把每一个网段归类为住宅、企业、托管、代理、VPN 或 Tor,而这些列表并不难建。VPN 服务商会公开自己的服务器列表,好让自家的应用能连上。托管网段就躺在注册机构的记录里。滥用报告和纯粹的密度补齐剩下的部分:一个住宅地址背后是寥寥几个人,一个热门 VPN 出口背后同时挤着几百人,横跨每一个时区,单看流量就能看出这种模式。面板里的“IP 信誉列表”一行,就是拿你的地址去问了一个这样的数据库。
这正是各大流媒体平台如此擅长封锁 VPN 的原因。它们并不检测你的 VPN 应用,而是维护一份行为像 VPN 出口的地址清单,然后拒掉清单上的地址。这也解释了为什么今天还好用的 VPN 下个月就失灵了:那个网段上了列表。
- IP 网段的所有者 网络连接 现在写着“服务器”
- 信誉列表 网络连接 现在写着“服务器”
- TCP 指纹(MTU、TTL) 网络连接 现在写着“服务器”
- 你用的 DNS 解析器 网络连接 没变,仍指向家乡
- 时区 你的浏览器 没变,仍指向家乡
- 浏览器语言 你的浏览器 没变,仍指向家乡
- WebRTC 地址 你的浏览器 没变,仍指向家乡
- 浏览器指纹 你的浏览器 没变,仍指向家乡
浏览器一直在说实话
到目前为止说的都是地址。接下来说的是浏览器,而这是大多数 VPN 指南跳过不谈的部分,因为没有任何 VPN 修得了它。
时区。你的操作系统时钟写着 Europe/Amsterdam,JavaScript 一次调用就能读到,不弹任何授权提示。德国 IP 配一只荷兰时钟,是网站一毫秒就能查完的矛盾,我们专门写过一整篇为什么 VPN 修不了时区。
语言。你的浏览器发出的每一个请求都带着 Accept-Language 头,navigator.languages 又把同样的内容告诉脚本。这两处 VPN 都碰不着。从德国地址发出的 nl-NL,是同一个矛盾换了一栏;语言泄露一文讲了这件事,包括它只算弱信号的情形,比如一台只装了英语的浏览器出现在国外。
WebRTC。为了搭建通话,浏览器可以问 STUN 服务器“我的公网地址是什么?”,而某些 VPN 配置会让这个提问绕过隧道。答案就是你的真实地址,跟你的 VPN 地址并排躺在同一个页面上。这就是 WebRTC 泄露,上方的面板正在运行这项检查。
地理定位与 IPv6。如果你曾给某个网站授予过位置权限,浏览器的定位来自 GPS 或附近的 Wi-Fi,不会跟着 VPN 移动。而一个只隧道 IPv4 的 VPN,会把你家 ISP 分配的 IPv6 地址留在原处,任何拥有 IPv6 端点的网站都拿得到。
- IP 位置
- Frankfurt, DE 被 VPN 挪走
- 网络所有者
- M247 Europe (hosting) 是机柜,不是客厅
- 浏览器时区
- Europe/Amsterdam 与 IP 矛盾
- 浏览器语言
- nl-NL, en 与 IP 矛盾
这一切都不需要知道 VPN 是什么。检测器想的不是“VPN”,而是“这位访客的信号彼此打架”,而被打分的正是这种不一致。
任何网页都读不到的信号
还有两项检查发生在浏览器之下,它们之所以重要,是因为哪怕一台干净的浏览器挂在住宅出口上,也可能栽在这里。
TCP 指纹。VPN 隧道把你的数据包裹进自己的数据包里,于是抵达网站的数据包比普通连接的略小一点(最大分段大小被隧道的开销压缩了),TTL(生存时间)也多耗掉了一跳。p0f 一族的被动指纹工具会在你的第一个请求得到应答之前,直接从服务器网卡上读出这些字段,而“一个自称家用路由器的地址发来 MSS 1360”是一个众所周知的形状。
DNS。你的浏览器解析主机名时,总有某处的某个解析器会把查询发到网站的 DNS 服务器。如果那个解析器属于你家的 ISP,而你的网页流量却从另一个国家的 VPN 出口进来,网站手里又有了你的两个地址。泄露测试的做法是让你的浏览器解析一个独一无二的主机名,再看是哪个解析器现身;VPN 应用的“DNS 泄露保护”设置就是这么被检验的。
为什么混淆模式在这里帮不上忙
VPN 应用兜售“隐身”或“混淆”服务器,它们解决的确实是一个真实的问题:让 VPN 流量穿过封锁它的网络,办法是让隧道在半路的防火墙眼里看起来像普通的 HTTPS。那是一场与你的 ISP 或办公网络的较量。位于另一端的网站从头到尾看不见隧道。它看见的是出口地址和你的浏览器,两者都和从前一样一览无余。混淆和检测是两个不同的问题,营销文案却把它们搅在了一起。
到底该怎么办
- 先跑测试,再修掉它标记的东西。本页顶部的面板已经相当接近网站看到的景象;完整浏览器扫描还会在它周围补上指纹和泄露检查。自己先找到的破绽,就是你能修掉的破绽。
- 让浏览器与地址口径一致。把时区和语言改成与出口国家相符;或者,如果你要的是隐私而不是换地方,就干脆选一个本国出口。关掉 WebRTC,或者交给 VPN 应用处理。同样是数据中心 IP,一个前后一致的故事总比一个自相矛盾的得分更高。
- 如果你需要看起来像一个人,就用一个人的地址。数据中心网段上了列表就下不来;独享或住宅 IP 是摆脱那份列表的唯一途径。值不值得,取决于你在做什么。
- 如果你运营着多个身份,就把它们彻底分开。每个配置文件都需要自己的出口地址,以及一台时钟、语言和指纹都与该地址相符的浏览器,否则上面那些矛盾会在每个账号上重演一遍。这正是反检测浏览器的用武之地。Incogniton 给每个配置文件绑定一个代理,并把时区和语言设置成与之匹配,让浏览器和地址讲同一个故事,而不是各讲各的。
VPN 依然是干它本行的合适工具:在你不信任的网络上加密你的流量,以及挪走你的地址。挪走的是 IP 地址:你的 MAC 地址从一开始就不在网站的视野里。VPN 从来就不是为了让浏览器把谎撒圆而造的,而上面的大部分检测,不过是浏览器在说实话。