服务器看到的是 VPN 出口,而不是访客
VPN 会替换服务所观察到的源地址。地址段、延迟和网卡名称都是对 VPN 使用的推断,而不是谁连接过的证据。
访客通过商业 VPN 连接,你的应用记录下出口地址。这不是隐藏的身份:这就是 TCP 连接所拥有的唯一源地址。人们所谓的检测,其余部分都是叠加在这一个事实之上的推断。
一个请求实际携带了什么
应用看到连接的源地址和端口、已完成的握手,以及客户端选择发送的字节。在全局隧道下,那个源地址就是出口,被所有使用者共享。在分流隧道下,请求可能来自隧道,也可能来自本地连接,取决于目的地。如果客户端和服务器都在同一个 VPN 内,源地址就是客户端的内层隧道地址,它标识的是一个端点而不是一个位置。
普通请求中没有任何字段携带客户端在隧道之前的地址。转发头是客户端或代理的声明,可以被省略或伪造。
检测是分类,而分类是猜测
实际方法有已知 VPN 与托管地址段列表、与声称地区不符的延迟、traceroute 形态以及账户行为。每一种都给出一个概率。企业 VPN 可能位于看起来像住宅的地址上,住宅代理可能看起来像家庭线路,运营商 NAT 也可能看起来像托管地址段。
封锁一个共享出口,就等于封锁其背后每一个无关用户,这会把检测决策变成附带故障。置信度分数不是身份,也绝不应成为封禁或退款决策的唯一输入。
如果 VPN 是你自己的,你有一个与检测无关的可靠信号:分配一个专用地址池,并将观察到的源地址与之比对。这之所以有效,是因为你控制两端,也能记录该地址池。但它无法推广到你不管理的访客,而且一旦地址池与其他服务共享,它就不再可靠。
本地证据与服务器侧证明
在机器本身,隧道是可见的:虚拟网卡、指向隧道设备的默认路由、被改动的解析器。在那里运行的代码可以枚举网络接口,并寻找 PPP、TAP 或厂商驱动。
网页无法读取其中任何一项。常见的绕行做法是加载一个只从内网提供的资源,并把成功当作使用隧道的证据。它实际上测试的是可达性:分流隧道、过期的缓存文件或拦截代理在两种状态下都会给出相同结果。本地证据始终是本地证据。
选择能承受不确定性的访问控制
把访问控制建立在已验证的身份、设备健康状况和按资源的授权之上。这些谓词描述的是谁在请求、能到达什么,无论是否涉及隧道都仍然有意义。请求是否经由 VPN 到达,是一个弱信号,既会产生错误放行,也会造成附带封锁。把证据和决策放在不同字段里,让有争议的封锁有据可查。
IP 地理位置只是若干输入之一,浏览器的定位服务可能使用从不跟随隧道的 Wi-Fi 或 GPS。仍然显示访客所在城市的地图,是关于定位服务的证据,而不是隧道失败的证明。
记下每个决策由哪个信号驱动。当客户对某次封锁提出异议时,这份记录就是复核与争吵之间的差别。