VPNCheap · 客户端契约
七个 App
终于会报自己的名字了
每次 App 找服务器要东西,都会先自报家门。名字统一了,服务器也开始按名字放行了。
01 · 这是什么
User-Agent=敲门时喊的那句话
它只有产品名和版本号,不带节点、不带协议、不带地址。就是一句「我是谁,我几版」。
02 · 改造前
七个人,三个同名,一个报系统默认
三个端都喊「vpncheap」,服务器分不出是 Windows 还是手机。iOS 喊了个写死的假版本。tvOS 没自己设,报的是苹果系统默认那串 —— 好在默认串里带着可执行文件名 VPNCheapTV。
03 · 对照表
改造前 → 改造后
| 端 | 以前 | 现在 | 状态 |
|---|---|---|---|
| Windows | vpncheap/{v} | vpncheap-windows/{v} | 已改 #64 |
| Flutter | vpncheap/{v} | vpncheap-flutter/{v} | 已改 #124 |
| iOS | vpncheap/1.0(写死) | vpncheap-ios/{v} (b{n}) | 已改 #81 |
| tvOS | VPNCheapTV/{n} CFNetwork/… Darwin/… | vpncheap-tvos/{v} | 已改 #21 |
| macOS | vpncheap-macos/{v} (b{n}) | vpncheap-macos/{v} (b{n}) | 本来就对 |
| Android | vpncheap-android/{v} | vpncheap-android/{v} | 本来就对 |
| Android TV | vpncheap-tv/{v} | vpncheap-tv/{v} | 本来就对 |
四个 PR 都在 9 月 1 日合了。规则一句话:vpncheap-{平台}/{真实版本},版本号不许写死。
04 · 为什么值得做
服务器已经开始按名字放行
9 月 2 日起,订阅接口只放行名字里含 vpncheap 的请求,其余回 403。七个端全部实测通过,包括没发版的老 tvOS。Shadowrocket、Clash 这类第三方客户端从此拉不到节点。
05 · 两条红线
动名字之前先记住这两件事
⛔
名字里必须留
vpncheap 这四个字服务器靠这个子串跟客户端谈订阅格式。丢了,订阅会退回旧格式,引擎直接解析失败。
⛔
不要放行
CFNetwork老 tvOS 的默认串是 VPNCheapTV/… CFNetwork/…,本来就含 vpncheap,已经能过。日志里带 CFNetwork 的请求基本全是 Shadowrocket,放行它这道门就白装了。
⛔
拒绝码别让官方端误判成登录过期安卓 TV 把 401/403 当成登录过期。现在七个端都带 vpncheap 所以碰不到这条;将来若某个端漏了 UA,403 会把真实用户踢下线,那时要改 406。
还有一条常识:名字是明文,谁都能伪造。它是软过滤,挡顺手党,不是安全边界。
06 · 现在到哪一步
门已经开了,尾巴还有三条
- ○四个 PR 全部合并(9 月 1 日)
- ○服务端白名单上线并实测(9 月 2 日):七端 200,第三方 403
- ☐各端出包发版 —— 只为统计准确,不影响能不能用
- ☐服务端补丁入库 —— 现在只在线上机器上,升级面板会丢
- ☐真机确认服务端看得到 tvOS 和 iOS 的新名字
受影响的只有第三方客户端的用户。这是已定的取舍。
VPNCheap · User-Agent 契约 v2 · 2026-09-02 更新:服务端门禁已上线