搜索 K
Appearance
先给结论,不想看长文的读者读完这一段就可以动手了。
当你的 Clash / Shadowrocket 突然更新订阅失败、节点列表变空、面板报出一串看不懂的错误码时,第一件要做的事不是骂机场,而是分清「谁挂了」。行业里一个被反复验证的经验值是:约九成的「机场崩了」投诉,最终定位到的是第三方订阅转换后端故障,而机场本身的节点通道完全正常。
原因很简单:你的客户端请求的从来不是机场的服务器,而是那个中间商——api.dler.io、sub.xeton.dev、某个自建 sub.xxx.com 之类的公共订阅转换服务。它一旦宕机、被 Cloudflare 限流、或者拉不到远程规则集,你手机上的整个世界就断了。而此时,只要你把订阅链接换成机场给的原生订阅地址,往往十秒钟就能恢复。
三条急救路径,按优先级排序:
Docker 起一个 Subconverter(第六节给命令);要排障,先得知道故障发生在哪一跳。一次「客户端更新订阅」实际上是下面这条链路的串行执行:
第 1 跳 · DNS 解析:客户端解析转换后端域名。公共后端普遍托管在 Cloudflare 或 Vercel 上,国内解析结果经常被污染或落到被 QoS 的 IP 段,表现为「解析成功但连不上」。
第 2 跳 · TLS 握手:与后端建立 TLS 连接。这里有两个高频坑:一是后端证书过期(很多个人维护的公共后端疏于续签);二是 SNI 阻断,表现为 TCP 能连、TLS 必然超时。
第 3 跳 · 后端回调拉取你的订阅:转换服务器拿着你 URL 里的 url= 参数(Base64 编码后的原始订阅地址)去请求机场 API。这一跳的后端 IP 往往是海外云厂商 IP 段,机场侧如果开了风控(限制数据中心 IP / 限制非客户端 UA),会直接返回 403,转换后端于是回吐 500 给你。
第 4 跳 · 拉取远程规则集:转换器要下载 ACL4SSR、GeoSite、GeoIP 等规则库。这些仓库大多托管在 GitHub Raw,海外后端拉取通常没问题,但一旦 GitHub 抖动或后端到 GitHub 的网络劣化,就会触发网关超时。这也是 502 / 504 最常见的来源。
第 5 跳 · 格式重写:把 V2Ray base64 的节点列表解析成对象数组,再按目标客户端语法(Clash YAML / sing-box JSON / Surge conf)重写。这一步是纯 CPU 操作,节点数超过 500 的机场在这里最容易把 512MB 内存的小鸡打爆——OOM 之后进程被 kill,你看到的就是转圈不返回。
第 6 跳 · 回传:生成的配置文件回传给你的客户端。体积通常在 200KB 到 2MB 之间,弱网环境下这条回包链路也经常断。
看清这 6 跳就能明白一件事:公共转换后端的可用性 = 6 个环节的乘积。任何一环崩掉,体验上都是「全崩」。而机场原生订阅只有 2 跳(DNS + TLS 到机场自己的 API),可用性天然高出一个数量级。
顺带说一个很多人忽略的隐私问题:当你把订阅链接交给公共转换后端时,等于把 token 明文交给了一个陌生人。这个 token 能换到你的全部节点信息、剩余流量、到期时间。行业里不是没出现过「公共后端偷偷收集订阅链接转卖」的案例。凡是做过合规审计的团队,都不会让生产环境的订阅地址经过第三方服务器——这也是我们一直建议商务场景只用原生订阅或自建后端的根本原因。
下表基于 2026 年 Q1 的实测与社区反馈整理,延迟数据为国内三网(电信/联通/移动)混合样本的中位数,仅供参考。
| 评估维度 | 公共在线转换 | 机场官方转换 | 自建 Subconverter | CF Worker 边缘转换 | 机场原生直连 | 客户端本地转换 |
|---|---|---|---|---|---|---|
| 典型首包延迟 P50 | 800–2500ms | 300–900ms | 150–500ms | 200–700ms | 80–300ms | 0ms(纯本地) |
| 服务可用性 SLA | 60%–85% | 依机场运维 | 99%(自控) | 99.9%(CF 托管) | 99.5%+ | 100% |
| Token 泄露风险 | 高 | 中(需信任机场) | 极低 | 低 | 无 | 无 |
| 部署时间成本 | 0 | 0 | 15–30 分钟 | 20–40 分钟 | 0 | 0 |
| 月度成本 | 免费 | 免费 | 5–10 美元 VPS | 免费额度内 0 元 | 含在套餐内 | 免费 |
| 保留流量/到期信息 | 不支持 | 部分支持 | 可配置 | 可配置 | 完整保留 | 完整保留 |
| 规则定制深度 | 低(受限于公共配置) | 低 | 极高 | 中 | 无 | 中 |
| 抗封锁 / 抗限流 | 差 | 中 | 好 | 好 | 极好 | 极好 |
| 崩溃后自愈能力 | 无 | 无 | 强(重启即恢复) | 强 | 强 | 强 |
| 适合人群 | 临时应急 | 轻度用户 | 多设备重度用户 | 有 CF 账号的技术用户 | 所有人群 | 桌面端进阶用户 |
一个反直觉的结论:「免费公共后端」是这张表里综合评分最低的一档,却是使用率最高的一档。 原因无他,就是懒。但当它崩的时候,你付出的时间成本远超自建那 20 分钟。
人群 A · 手机端轻度用户(1–3 台设备) 直接走原生订阅。iPhone 用 Shadowrocket / Stash,安卓用 ClashMetaForAndroid / FlClash,机场给的通用订阅链接粘进去选「自动识别类型」即可。完全不需要转换层。
人群 B · 多设备 + 复杂分流(家里路由 + 电脑 + 手机) 自建 Subconverter 价值最大。你可以统一维护一份规则模板,所有设备订阅同一个自建地址,改规则只需重启一次容器。
人群 C · 隐私敏感 / 商务办公 绝对不要用公共后端。用原生订阅,或者把 Subconverter 部署在你自己的境外 VPS 上,且只在内网或 WireGuard 隧道内访问,不要暴露公网。
人群 D · 节点数量超过 300 的大机场用户 公共后端大概率会因为内存或并发限制失败。自建时把 max_pending_requests 和容器内存(建议 1GB 起)调高。
人群 E · 纯应急 手边什么都没有、就想立刻恢复联网。先试原生订阅,不行就换一个公共后端域名(但务必网络环境干净,别在公共 WiFi 下操作)。
机场面板里通常同时提供多个入口,命名五花八门:「一键订阅」「Clash 订阅」「V2Ray 订阅」「通用订阅」「Shadowrocket 订阅」。它们的基础 URL 完全一致,区别只在尾部参数:
https://你的机场域名/api/v1/client/subscribe?token=xxxxxxxx在这个基础链接后面追加 flag 参数,绝大多数基于 v2board / sspanel 的面板都能直接吐对应格式:
&flag=clash → 返回 Clash YAML&flag=clashmeta → 返回 Mihomo / Clash.Meta YAML(推荐,支持 Hysteria2、VLESS Reality)&flag=singbox → 返回 sing-box JSON&flag=v2ray → 返回 base64 通用格式&flag=surge / &flag=loon / &flag=quantumultx → 对应客户端配置这就是「免转换直接导入」的核心技巧:不是所有机场都会在面板上把这些链接列全,但参数往往都支持。你只需要自己拼一下。
左侧「订阅」→ 新建 → 名称随意 → URL 粘贴带 &flag=clashmeta 的原生链接 → 类型选 Remote → 点击右上角刷新。如果提示解析失败,把 URL 里的 &flag=clashmeta 换成 &flag=clash 再试。
避坑点:Verge Rev 自带「订阅转换」开关,默认关闭。不要打开它——打开就意味着你的链接又过了一遍第三方。保持关闭就是原生直连。
订阅页 → 添加 → 直接粘贴原生链接,内置的 mihomo 内核本身就能解析 base64 通用订阅,不需要额外转换。若机场只给 base64,Mihomo 会自己转,这一步是本地完成的,不出网。
右上角 + → 类型选 Subscribe → URL 粘贴通用订阅链接 → 保存 → 左滑「更新」。Shadowrocket 内置解析器支持 base64 通用格式和 Clash YAML 两种输入。
注意:Shadowrocket 的「订阅转换」功能同样是把链接发给第三方服务器,除非你自建,否则不要用。
优先使用机场的 &flag=singbox 或 &flag=stash 参数。如果没有,就得走转换——此时自建 Subconverter 是唯一体面的方案���
第一步,起容器(任意 1 核 1G 的境外 VPS 即可):
docker run -d --name subconverter \
-p 127.0.0.1:25500:25500 \
--restart=always \
tindy2013/subconverter:latest注意 127.0.0.1:25500 这个绑定方式——只监听本地回环,避免把后端裸奔在公网上被人当免费转换器薅。
第二步,验证存活:
curl -sS http://127.0.0.1:25500/version返回版本号即正常。
第三步,本地测试一次真实转换(把 你的订阅 换成 Base64 编码后的原生链接,注意 URL 要 encode):
curl -sS -o /dev/null -w "http=%{http_code} ttfb=%{time_starttransfer}s total=%{time_total}s\n" \
"http://127.0.0.1:25500/sub?target=clash&url=你的订阅&insert=false&emoji=true&udp=true&tfo=false&scv=false&fdn=false&sort=false"http=200 且 total 在 0.5 秒以内,说明后端健康。
第四步,加一层 HTTPS 反代。用 Nginx + Let's Encrypt 把 sub.yourdomain.com 反代到 127.0.0.1:25500,并加上 Basic Auth,防止别人蹭你的带宽。同时在前端部署 sub-web 或 sub-web-modify 作为可视化界面,用起来就和公共转换站一样,但数据全在自己手里。
第五步,运维要点:
pref.toml 里把 max_pending_requests 调到 30 以上;refresh_ruleset 的定时任务,避免规则集过期