在群里问一句订阅为什么更新失败,顺手把报错截图发出去,这是很常见的求助方式。麻烦在于客户端的报错信息里往往带着完整的订阅网址,群里几百个人,每一个都能照着截图把它敲进自己的客户端。
这条网址里没有登录这一步
订阅链接是机场交给你的那条网址,客户端靠它下载节点列表。我翻了开源面板 Xboard 的路由文件,它支持新旧两种写法。
https://example.com/s/0123456789abcdef0123456789abcdef
https://example.com/api/v1/client/subscribe?token=0123456789abcdef0123456789abcdef
两种写法里起作用的都是那段 32 位的 token。服务器收到请求,拿 token 查出是哪个账号,就把这个账号的节点列表吐出来,中间没有输入密码的环节,也不看请求来自哪台设备。各家机场用的面板我没有逐家核实,下面说到源码的地方都以 Xboard 为准,别的面板思路相近,细节可能不同。
拿到这条网址的人能做三件事。下载你的全部节点,用你的流量上网,还能看到你的套餐状态。Xboard 有个开关,打开后会在节点列表最前面插几行说明,写的是剩余流量、距离下次重置的天数和套餐到期日,这几行对任何持有链接的人都一样可见。
重置时面板换掉的是两样东西
Xboard 处理重置订阅的那个函数叫 resetSecurity,一共做了两个动作,给账号生成一个新的 UUID,再生成一个新的 token,最后把新的订阅网址返回给你。
token 管的是订阅链接,换掉以后旧网址就打不开了。UUID 管的是节点,它是你连每一台服务器时用的身份。只换 token 不够,因为别人可能早就把节点列表下载到了本地,手里的节点照样能连。两样一起换,旧链接和旧节点同时作废。
代价是你自己的设备也全部掉线。手机、电脑、路由器上存的都是旧 UUID,得用新链接一台一台重新导入。
链接是从哪些地方漏出去的
OWASP 有一页专门讲网址里带敏感参数的问题,列出这类网址会留痕的地方,包括 Referer 请求头、服务器访问日志、多人共用的系统、浏览器历史和缓存,还有被人从背后看到屏幕。它特别说明,用了 HTTPS 也解决不了,因为这些地方记下的都是完整网址。
放到机场订阅上,最常见的是下面几种。
第一种是截图。客户端的订阅管理页、更新失败的报错、浏览器地址栏,都可能露出完整链接。求助时把 token 那一段涂掉再发。
第二种是在线订阅转换。机场给的订阅格式和客户端对不上时,很多人会找一个网页版的转换工具。这类工具多数基于开源项目 subconverter,它的 README 里给的调用方式是这样的。
http://127.0.0.1:25500/sub?target=clash&url=https%3A%2F%2Fexample.com%2Fs%2F0123456789abcdef
订阅网址被整个当成参数,传给了转换服务器。例子里的 127.0.0.1 是你自己的电脑,换成别人搭的网站,对方的访问日志里就躺着你的完整链接,这正是 OWASP 清单里的服务器日志那一项。subconverter 提供 Docker 部署,想用可以在本机跑一份。
第三种是配置文件。Mihomo 的 proxy-providers 有个 path 字段,节点列表下载后会按这个路径存成本地文件,里面是每个节点的地址和你的 UUID。把整个配置目录打包发给别人排查问题,等于把节点直接送了出去。
公开分享的所谓免费订阅里,有多少是这样漏出去的付费链接,我没有办法统计。免费节点的代价那篇里谈了这类来源不明的节点。
怎么发现有人在用你的流量
机场回应订阅请求时,会在响应头里带上 Subscription-Userinfo,写着已用上传、已用下载和总流量,Stash 的文档和 Xboard 的源码里都能看到这个格式。Clash Verge Rev 这类客户端会把它显示在订阅卡片上。
留意的办法很朴素。记一下每天大概用多少,哪天没怎么上网,已用流量却涨了好几个 G,就该警觉。流量到底怎么累计,见机场流量怎么算。
别指望靠被挤下线来发现。本站资料里,微风、飞为、灵动云都自述不限设备,多一个人用,你这边不会有任何提示。
泄露之后按这个顺序处理
先登录机场官网,在用户中心找到重置订阅的按钮,名字各家略有不同。面板里找不到就发工单让客服处理。
再把每台设备上的旧订阅删掉,用新链接重新导入。只点更新是不行的,客户端里存的还是旧网址。
如果发出去的截图或文件里还带着登录邮箱,顺手把账号密码也改了。订阅 token 和登录密码是两套东西,重置订阅不会动密码。
过一两天回来看已用流量,确认没有再异常上涨。