VPNCheap · 客户端契约

七个 App
终于会报自己的名字了

每次 App 找服务器要东西,都会先自报家门。名字统一了,服务器也开始按名字放行了。

📱 🛎️ 服务器 「我是 vpncheap-ios/2.0.11」

01 · 这是什么

User-Agent=敲门时喊的那句话

它只有产品名和版本号,不带节点、不带协议、不带地址。就是一句「我是谁,我几版」。

vpncheap-ios / 2.0.11 (b268) 哪个端 真实版本 构建号(可选)

02 · 改造前

七个人,三个同名,一个报系统默认

三个端都喊「vpncheap」,服务器分不出是 Windows 还是手机。iOS 喊了个写死的假版本。tvOS 没自己设,报的是苹果系统默认那串 —— 好在默认串里带着可执行文件名 VPNCheapTV。

vpncheap/2.0.44 分不清是谁 vpncheap/2.0.44 分不清是谁 vpncheap/1.0 版本是假的 VPNCheapTV/50 CFNetwork/… 系统默认,没自己设

03 · 对照表

改造前 → 改造后

以前现在状态
Windowsvpncheap/{v}vpncheap-windows/{v}已改 #64
Fluttervpncheap/{v}vpncheap-flutter/{v}已改 #124
iOSvpncheap/1.0(写死)vpncheap-ios/{v} (b{n})已改 #81
tvOSVPNCheapTV/{n} CFNetwork/… Darwin/…vpncheap-tvos/{v}已改 #21
macOSvpncheap-macos/{v} (b{n})vpncheap-macos/{v} (b{n})本来就对
Androidvpncheap-android/{v}vpncheap-android/{v}本来就对
Android TVvpncheap-tv/{v}vpncheap-tv/{v}本来就对

四个 PR 都在 9 月 1 日合了。规则一句话:vpncheap-{平台}/{真实版本},版本号不许写死。

04 · 为什么值得做

服务器已经开始按名字放行

以前 🌫️ 一团「vpncheap」 现在 🚪 含 vpncheap 放行,其余 403

9 月 2 日起,订阅接口只放行名字里含 vpncheap 的请求,其余回 403。七个端全部实测通过,包括没发版的老 tvOS。Shadowrocket、Clash 这类第三方客户端从此拉不到节点。

05 · 两条红线

动名字之前先记住这两件事

名字里必须留 vpncheap 这四个字服务器靠这个子串跟客户端谈订阅格式。丢了,订阅会退回旧格式,引擎直接解析失败。
不要放行 CFNetwork老 tvOS 的默认串是 VPNCheapTV/… CFNetwork/…,本来就含 vpncheap,已经能过。日志里带 CFNetwork 的请求基本全是 Shadowrocket,放行它这道门就白装了。
拒绝码别让官方端误判成登录过期安卓 TV 把 401/403 当成登录过期。现在七个端都带 vpncheap 所以碰不到这条;将来若某个端漏了 UA,403 会把真实用户踢下线,那时要改 406。

还有一条常识:名字是明文,谁都能伪造。它是软过滤,挡顺手党,不是安全边界。

06 · 现在到哪一步

门已经开了,尾巴还有三条

受影响的只有第三方客户端的用户。这是已定的取舍。

VPNCheap · User-Agent 契约 v2 · 2026-09-02 更新:服务端门禁已上线