Clash 订阅格式科普:base64、YAML 与通用格式的区别及相互转换
对比 Clash YAML 订阅、base64 分享链接与通用订阅格式的结构差异,说明各客户端的兼容情况,以及用转换工具在格式之间迁移时需要注意的字段丢失问题。
先分清编码、链接与配置文件
“Clash 订阅”不是单一格式。服务端返回的内容可能是一整份 Clash YAML,也可能是多条分享链接组成的文本,再套一层 base64 编码。三者看起来都能通过一个 URL 导入,但客户端拿到响应后,走的是不同解析路径。
最容易混淆的是 base64。它只是把字节转换成可打印字符的编码方式,不定义节点有哪些字段,也不决定客户端支持什么协议。把一组 ss://、trojan:// 或 vmess:// 链接逐行排列,再对整段文本做 base64 编码,通常就被称为“base64 订阅”。解码以后,真正有意义的仍是每一条分享链接。
Clash YAML 则是一份有层级的配置。除了节点,它还能携带策略组、分流规则、DNS、监听端口、规则集合与 TUN 参数。通用订阅通常只负责传递节点,策略怎么组合、流量怎么分,交给客户端模板或转换器补齐。
| 形式 | 典型开头或结构 | 能表达的内容 | 主要用途 |
|---|---|---|---|
| Clash YAML | proxies:、proxy-groups: |
节点、策略组、规则、DNS、TUN 等 | 直接作为 Clash 或 mihomo 配置 |
| 明文分享链接 | ss://、trojan:// |
单个节点的连接参数 | 跨客户端复制节点 |
| base64 订阅 | 连续字母、数字及编码符号 | 通常是编码后的多条分享链接 | 以一个订阅地址分发节点集合 |
| 提供商专用 JSON | { 或客户端定义字段 |
取决于服务端和目标应用 | 特定客户端或 API 对接 |
Clash YAML 为什么不只是节点列表
一份可直接运行的 Clash YAML 通常至少涉及 proxies、proxy-groups 和 rules 三部分。前者保存节点参数,中间一段定义手动选择、自动测速或故障转移等策略,最后一段决定连接进入哪个策略组。
mixed-port: 7890
allow-lan: false
mode: rule
proxies:
- name: HK-Trojan-01
type: trojan
server: edge.example.net
port: 443
password: example-password
sni: cdn.example.net
proxy-groups:
- name: PROXY
type: select
proxies:
- HK-Trojan-01
- DIRECT
rules:
- DOMAIN-SUFFIX,github.com,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY
这段配置把混合代理端口设为 7890,并建立一个名为 PROXY 的手动选择组。实际订阅中还可能出现 rule-providers、proxy-providers、dns、sniffer、tun 与持久化缓存设置。它们都超出了单条分享链接的表达范围。
完整配置与代理提供者不是一回事
mihomo 配置支持通过 proxy-providers 引用远端节点集合。主配置保留 DNS、规则和策略组,远端地址只更新节点。这个结构适合把“本地分流逻辑”与“远端节点来源”拆开管理。
proxy-providers:
airport-a:
type: http
url: https://sub.example.net/token
path: ./providers/airport-a.yaml
interval: 3600
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 600
这里的远端内容通常是 provider YAML,顶层可能只有 proxies:,并不是一份能独立启动内核的完整配置。如果把 provider 文件直接导入只接受完整 Profile 的客户端,常见结果是缺少端口、策略组或规则,客户端会报告配置校验失败。
YAML 对缩进和数据类型敏感
- 使用空格缩进,不要用 Tab 字符混排。
- 端口
443通常是数字,密码、名称和服务器地址通常是字符串。 - 名称包含冒号、井号或前后空格时,建议使用引号。
true与字符串"true"含义不同,不能随意互换。- 同名节点进入策略组后可能产生歧义,转换时应先做名称去重。
base64 订阅与通用分享链接怎么组织
通用订阅的常见原始内容是一行一个 URI。每种协议自行规定 URI 中的服务器、端口、认证信息和扩展参数。比如 Shadowsocks 常见 ss://,Trojan 使用 trojan://,VMess 常见 vmess://,VLESS 使用 vless://。mihomo 还支持更多协议类型,但旧版 Clash 内核和不同图形客户端的支持范围并不一致。
ss://[email protected]:8388#SS-01
trojan://[email protected]:443?sni=cdn.example.net#Trojan-01
vless://[email protected]:443?type=ws&security=tls&host=cdn.example.net#VLESS-01
链接末尾的片段通常用作节点名称,查询参数则可能保存 TLS、SNI、WebSocket 路径、Host、传输方式或指纹参数。不同实现对参数命名和默认值的处理存在差异。一个客户端能识别 URI 前缀,不代表它一定完整理解其中每个扩展字段。
base64 解码后可能还有第二层编码
整份订阅解码以后,VMess 链接内部还可能包含一段 base64 编码的 JSON;Shadowsocks 的用户信息也存在多种 URI 表达方式。排查时要按层次处理:先解码订阅正文,再逐行识别协议,最后交给对应协议解析器。直接对整段内容反复解码,容易破坏原始链接。
- 获取订阅响应,保留原始文本副本。
- 检查开头是否已经出现
proxies:、协议 URI 或 JSON 结构。 - 只有在内容确实符合 base64 字符特征时才尝试解码。
- 解码后按换行拆分,过滤空行,再逐条识别协议。
- 检查节点数量、名称、端口与 TLS 参数是否完整。
客户端兼容性取决于内核与导入入口
同一订阅在两个客户端中表现不同,通常不是订阅地址失效,而是内核协议支持、客户端预处理逻辑和导入入口不同。Clash for Windows 0.20.39 已停止维护,其 Profiles 页面主要面向 Clash 配置;mihomo 系客户端通常能解析更广的协议字段,但图形界面是否接受原始通用订阅,仍取决于客户端自己的订阅模块。
完整 YAML 的导入路径
以 Clash for Windows 0.20.39 为例,常见路径是「Profiles」→ 在顶部输入订阅 URL →「Download」。导入后应先看配置卡片是否出现,再切到「Proxies」确认策略组和节点。若只看到节点却没有预期规则,服务端可能返回了经客户端模板处理的节点集合,而不是原始完整 YAML。
在采用 mihomo 内核的 2.x 图形客户端中,入口常见为「订阅」→「新建」→「URL」。名称会随客户端变化,但检查逻辑一致:更新日志是否返回 HTTP 200、配置校验是否通过、策略组数量是否符合预期、内核是否成功重载。
端口号不属于订阅节点本身
7890、7891 和 9090 经常出现在 Clash 配置里,但作用不同。7890常用于 HTTP 与 SOCKS 混合入口,7891在部分旧配置中用于 SOCKS,9090常用于外部控制接口。通用分享链接描述的是远端代理节点,不会替本地客户端决定监听端口。
因此,把通用订阅转换成 YAML 时,转换器往往要额外注入 mixed-port、策略组和规则。两次转换结果即使节点完全相同,也可能因为模板不同而表现出不同的分流行为。
格式转换实际做了哪些事
所谓“订阅转换”通常包含四步:识别输入、解析节点、映射字段、套用输出模板。输入可以是完整 YAML、provider YAML、base64 链接集合或明文 URI;输出则可能是 Clash YAML、mihomo YAML,或者另一种客户端能读取的订阅文本。
通用订阅转 Clash YAML
这条路径最常见。转换器把每条分享链接解析为 proxies 项,再根据模板创建策略组与规则。最低限度要确认以下字段:
- 协议类型、服务器地址、端口与认证信息。
- TLS 是否启用,SNI 或
servername是否保留。 - WebSocket、gRPC 等传输方式及路径参数。
- UDP 开关、跳过证书验证设置及客户端指纹参数。
- 节点名称编码是否正常,重名是否自动增加后缀。
- 生成目标是旧 Clash 语法还是 mihomo 扩展语法。
Clash YAML 转通用订阅
反向转换一定会丢掉配置层信息。分享链接能带走节点连接参数,却带不走 proxy-groups、rules、rule-providers、DNS、TUN、嗅探与监听端口。再次导入其他客户端后,看到节点数量一致,也不能据此判断两份配置等价。
完整 YAML 转 provider YAML
这一步通常只抽取 proxies,输出一个供 proxy-providers引用的文件。原配置中的分流规则和策略组不会自动进入主配置。主配置里还需要通过 use:把 provider 放进指定策略组,否则节点虽已下载,界面中仍可能没有可选项。
proxy-groups:
- name: AUTO
type: url-test
use:
- airport-a
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 80
字段丢失通常发生在这六处
一、协议扩展字段没有对应目标
源格式可能包含客户端指纹、Reality 公钥、短 ID、ECH、拥塞控制或特定传输参数,而目标格式没有等价字段。转换器可能忽略它们,也可能写入目标客户端不认识的扩展键。结果通常不是立即报错,而是节点能显示、连接却超时。
二、规则与策略组被模板覆盖
从完整 YAML 转换时,如果工具先抽取节点再套模板,原来的 DIRECT、REJECT、故障转移组和规则顺序会被替换。Clash 规则按从上到下匹配,顺序变化本身就会改变结果。例如把 GEOIP,CN,DIRECT放在特定域名代理规则之前,可能让目标连接提前直连。
三、节点名称参与了筛选
不少模板用正则按名称建立“香港”“日本”“低倍率”等策略组。转换后若名称中的旗帜、空格或地区缩写改变,筛选结果可能从 30 个节点降为 0 个。迁移前后应比较策略组实际成员,而不只比较订阅总数。
四、布尔值和默认值发生变化
源链接没有写某个参数时,两个客户端可能采用不同默认值。例如 UDP、TLS 验证、SNI 推导与传输 Host 都可能依赖默认行为。转换器显式写入一个值后,连接行为反而会和原客户端不同。
五、DNS 与 TUN 完全留在旧配置
节点迁移成功不等于系统代理路径迁移成功。Fake-IP 地址池、DNS 上游、域名嗅探、路由排除项、TUN 自动路由都属于本地配置。通用订阅不承载这些字段。切换客户端后,应重新检查「设置」→「系统代理」、「设置」→「TUN 模式」及 DNS 配置,而不是沿用旧客户端的状态判断。
六、订阅更新机制不同
完整 YAML 可以直接携带固定节点;provider 则有独立的 interval和缓存路径;图形客户端还可能维护自己的更新时间。示例中的 interval: 3600表示每 3600 秒请求一次,而健康检查的 interval: 600表示每 600 秒测试一次,两者不是同一任务。
一套可复查的迁移流程
格式转换最稳的做法不是“一键导入后直接接管流量”,而是保留旧配置并分阶段核对。下面这套流程适用于从通用订阅迁移到 mihomo YAML,也适用于两个 Clash 图形客户端之间换配置。
- 记录基线。记下原客户端节点总数、常用策略组、系统代理端口、DNS 模式和 TUN 状态。
- 判断输入。确认返回的是完整 YAML、provider YAML、明文 URI 还是 base64 文本。
- 选择目标。明确目标内核是旧 Clash 还是 mihomo,避免生成目标内核不支持的字段。
- 先转节点。核对服务器、端口、协议、TLS、SNI、传输层与名称,不急着覆盖规则。
- 再套模板。加入策略组、规则、DNS 与监听端口,检查引用名称是否一致。
- 执行配置校验。在客户端重载前查看解析错误,重点检查 YAML 缩进、重复键和不存在的策略组。
- 小流量验证。先关闭 TUN,只启用系统代理;确认浏览器路径后,再测试 DNS 和 TUN。
- 比较实际行为。分别测试直连域名、代理域名、被拒绝域名和 UDP 场景,确认规则命中符合预期。
如果转换后节点显示正常但全部超时,先抽取一个节点对照源链接,检查端口、SNI、TLS 与传输路径。如果只有部分网站异常,重点看规则顺序和 DNS。如果系统应用不走代理,则检查系统代理或 TUN,而不是继续修改订阅格式。
选格式时直接按使用目标判断
- 需要完整复现分流:优先使用与目标内核兼容的完整 YAML,并保留规则、策略组和 DNS。
- 只想跨客户端搬节点:使用通用分享链接或 base64 订阅,目标客户端重新负责策略。
- 想长期维护本地规则:主配置固定,节点通过
proxy-providers远程更新。 - 需要兼容 mihomo 扩展协议:转换目标明确选择 mihomo,避免退回旧 Clash 字段集合。
- 来源格式不确定:先查看响应正文,再决定是否解码或转换,不要连续套多个转换器。
归根结底,base64 解决的是文本传输,分享链接描述的是单个节点,Clash YAML 管的是整套代理行为。转换可以搬运字段,却不能凭空保留目标格式表达不了的信息。迁移前先分清这三层,节点“导入成功但不能用”、规则消失和 DNS 行为突变的问题会少很多。
安装客户端并验证订阅
先选择对应平台,再按教程导入订阅、检查策略组、系统代理与 DNS。