Wildberries、Ozon 和 Sber 已开始屏蔽 VPN 用户:应用程序如何检测您是否启用了 VPN。
我在之前的文章中讨论了电信运营商如何通过深度包检测 (DPI) 和终端服务检测 (TSPU) 来检测 VPN。但过去一周,情况发生了巨大变化:现在不仅运营商会检测到 VPN,就连 VPN 应用本身——例如 Wildberries、Ozon、VkusVill、Shokoladnitsa 等——也会检测到 VPN。
Wildberries 显示一条消息:“您是否启用了 VPN?最好将其禁用。” Ozon 显示“网络连接出现问题”。产品卡片无法加载,照片消失,也无法下单。禁用 VPN 后,一切恢复正常。
这并非偶然的漏洞。3月底,数字发展部与20多家公司(包括Yandex、Sber、VK、Ozon、Wildberries、Avito、X5、HeadHunter、CIAN等)举行了闭门会议,并发布了限制VPN用户访问权限的指导方针,截止日期为4月15日。不遵守规定的公司可能会被从“白名单”中移除。
我们来看看手机上的应用程序是如何从技术层面检测到 VPN 已启用的。这与运营商端的深度包检测 (DPI) 是不同的层面。
过去与现在:谁来定义 VPN?
直到2026年4月,一切都是这样运作的:运营商端的TSPU分析流量并屏蔽VPN协议。应用程序对此毫不知情。
现在,又增加了一层保护:该应用会自动检测 VPN 并限制其功能。即使 VPN 允许你的流量通过,该应用也能自行检测到。
这从根本上改变了情况。DPI 可以通过混淆协议来绕过。而手机上的应用程序则更难绕过,因为它是在内部运行的。
方法一:检查网络接口(Android)
ConnectivityManager 最简单也最常用的方法。在安卓系统上,任何应用都可以通过以下方式检查 VPN 接口是否处于活动状态NetworkInterface :
// Способ через ConnectivityManager
val cm = getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
val activeNetwork = cm.activeNetwork
val caps = cm.getNetworkCapabilities(activeNetwork)
val isVpn = caps?.hasTransport(
NetworkCapabilities.TRANSPORT_VPN
) == true
// Способ через NetworkInterface
val interfaces = NetworkInterface.getNetworkInterfaces()
while (interfaces.hasMoreElements()) {
val iface = interfaces.nextElement()
if (iface.name.startsWith("tun") ||
iface.name.startsWith("ppp")) {
// VPN обнаружен
}
}
VPN 应用会创建一个虚拟网络接口——通常是 .NET Framework tun0 。它的存在是 VPN 连接的明显标志。无需 root 权限或特殊权限。任何应用都可以验证这一点。
Messenger Max(以前称为 VK Messenger)已经使用了这种方法,据专家称,它会传输有关 VPN 连接的信息,用于阻止 VPN 服务器的 IP 地址。
方法二:通过服务器端检查 IP 地址
该应用程序在每次请求时都会将客户端的 IP 地址发送到其服务器。服务器会将该地址与 VPN/代理 IP 数据库(例如 MaxMind、IP2Proxy 等)进行比对。
这与Netflix和其他流媒体服务使用的方法相同。但现在俄罗斯的电商平台也开始采用这种方法。
对开发者而言,优点是:无需修改应用代码,只需在后端添加一个检查即可。缺点是:如果 VPN 服务器使用的是“干净的”住宅 IP 地址,则该检查将失效。
方法三:DNS泄漏和数据不同步
该应用程序可以比较来自多个来源的用户地理位置信息:
- IP地址→识别一个国家
- GPS → 确定另一个
- SIM卡(MCC/MNC)→ 定义第三个
- 系统语言、时区 → 第四和第五信号
如果 IP 地址显示“荷兰”,SIM 卡显示“俄罗斯”,GPS 显示“莫斯科”,系统语言为俄语,那么结论很明显:VPN。
每个信号单独来看都不可靠,但它们协同工作却很可靠。这就是为什么即使 VPN 服务器数据库中没有该 IP 地址,某些应用程序也能检测到 VPN 的原因。
方法四:路由分析(iOS - 更复杂)
在 iOS 系统中,苹果限制了应用程序对网络接口的访问。tun0 这一点无法直接验证。数字发展部也承认,在 iPhone 上检测 VPN 的难度更大。
但有一些变通方法:通过getifaddrs() (Swift 可访问的 C 函数)进行检查、分析响应时间(VPN 会增加延迟)以及检查 DNS 解析。虽然不如在 Android 上可靠,但确实有效。
方法五:白名单和数字发展部的“方法论”
最有趣的是“白名单”。这份名单列出了超过120项俄罗斯服务(政府服务、银行、市场、媒体、在线影院等),这些服务不受TSPU(俄罗斯联邦公共部门网络)的影响。访问这些服务的流量不会被过滤或限速。
要被列入白名单,服务必须限制 VPN 用户。否则,可能会被从白名单中移除。从白名单中移除意味着要受到 TSPU 的常规过滤,包括速度降低、服务中断和用户投诉。
换句话说,数字发展部创造了一种经济激励:如果你希望你的服务可靠运行,那就帮我们打击 VPN。
这对开发者意味着什么?
如果您正在开发一款面向俄罗斯市场的应用,并且该应用已被列入白名单,则必须实现 VPN 检测。这不是建议,而是确保应用稳定运行的必要条件。
从技术角度来说,实现起来很简单——安卓系统只需要10行代码,iOS系统稍微复杂一些。但问题更多在于伦理层面:你是否希望你的应用检测用户的VPN并传输这些信息?
用户应该怎么做?
如果您同时使用 VPN 和俄罗斯服务,以下是您的选择:
分流隧道。 配置您的 VPN,使流向俄罗斯服务的流量直接通过 VPN,而只有您需要的流量才通过 VPN。大多数 VPN 客户端都支持此功能(某些应用程序或域名可能存在例外)。
两个配置文件。 在安卓系统上,您可以使用工作配置文件或 Island/Shelter 配置文件来隔离应用程序。一个配置文件包含 VPN 和所有必要的基于 VPN 的内容。另一个配置文件包含不带 VPN 的俄罗斯应用程序。
登录前禁用。 这是最简单的选择,也是应用程序本身建议的做法。
接下来会发生什么?
最后期限是4月15日。之后,所有120多个列入白名单的服务商都必须限制VPN用户。5月1日起,运营商将对超过15GB的国际流量收取费用。
39%的俄罗斯人使用VPN——比2026年初增加了8个百分点。Yandex上“VPN”的搜索量达到每周300万次,与2022年春季的水平持平。
这种悖论与TSPU的情况如出一辙:打击VPN的力度越大,使用VPN的人就越多。只不过现在,不仅运营商加入了这场斗争,连VPN应用本身也加入了进来。