Clash 订阅格式详解:YAML 配置、Base64 链接与通用订阅互转方法
拿到的订阅链接客户端认不出?先分清 Clash YAML、Base64 节点列表与各协议专用格式的差异,再介绍订阅转换的工作原理、常用参数与隐私注意事项。
拿到的订阅链接客户端认不出?先分清 Clash YAML、Base64 节点列表与各协议专用格式的差异,再介绍订阅转换的工作原理、常用参数与隐私注意事项。
把一条订阅链接丢进浏览器打开,返回的内容形态并不统一。多数排障问题的起点,其实是没先分清返回的到底是哪种格式,就直接假设客户端"应该认得"。目前流通的订阅内容大致分三类,处理逻辑完全不同。
判断方法很直接:用浏览器或 curl 打开订阅链接,看返回内容第一行。如果是 port:、mixed-port:、proxies: 这类 YAML 键值对,就是 Clash 原生配置;如果是一长串没有换行、全是字母数字加等号结尾的字符,大概率是 Base64;如果每行都以协议名加 :// 开头,则是裸文本节点列表。
提示:很多面板同时提供多种格式的订阅地址,区别通常只在 URL 参数或路径后缀上(例如 ?clash=1 或 /clash),遇到无法识别的订阅前先检查面板后台是否已经提供了 Clash 专用链接,往往比手动转换更省事。
能被 Clash 内核直接使用的订阅,骨架大致如下:
port: 7890
socks-port: 7891
mode: rule
log-level: info
proxies:
- name: "hk-01"
type: ss
server: example.com
port: 443
cipher: aes-256-gcm
password: "your-password"
proxy-groups:
- name: "auto"
type: url-test
proxies:
- hk-01
url: "http://www.gstatic.com/generate_204"
interval: 300
rules:
- DOMAIN-SUFFIX,google.com,auto
- GEOIP,CN,DIRECT
- MATCH,auto
其中 proxies 描述节点本身的连接参数,proxy-groups 把节点组织成策略组(自动测速、手动选择、负载均衡等),rules 决定流量按什么条件分配到哪个策略组。三段缺一不可,如果订阅返回的 YAML 只有 proxies 而没有后两段,多数客户端会自动补一套默认策略组和规则,但具体行为因客户端而异,建议导入后打开配置查看器确认。
如果使用的是 Clash Meta(mihomo)内核,还可能出现 proxies 里带 tfo、smux、reality-opts 等扩展字段,这些是原版 Clash 不识别的新协议参数,导入原版内核会直接报错或跳过对应节点,这也是判断"要不要换内核"的一个直接信号。
Base64 格式的订阅本质上只是"把一堆分享链接打包成一段文本",方便客户端一次性拉取更新,它并不是加密,只是编码。解码之后,常见节点链接大致是这样的结构:
ss://[email protected]:443#hk-01
vmess://eyJ2IjoiMiIsInBzIjoiaGstMDIiLCJhZGQiOiJleGFtcGxlLmNvbSIsInBvcnQiOiI0NDMi...}
trojan://[email protected]:443?sni=example.com#hk-03
逐条转换的思路是固定的:
手动做这件事对单个节点没问题,但订阅通常包含几十上百个节点,逐条手改基本不现实,实际操作中几乎都依赖订阅转换服务完成批量转换,下一节具体说明。
把 Base64/裸文本订阅转换成 Clash 能识别的 YAML,常见做法分两类,各有取舍。
部分安卓客户端在"新建配置"或"导入订阅"环节内置了格式探测逻辑:粘贴链接后客户端先尝试按 Clash YAML 解析,失败则自动按 Base64 解码再逐条转换生成本地配置。这条路径不依赖第三方服务,数据全程在本机处理,是隐私角度最干净的方案,但转换能力取决于客户端本身对协议字段的支持程度,遇到较新的传输层参数(例如某些 hysteria2 混淆参数)可能转换不完整或直接丢弃对应节点。
另一种做法是把原始订阅链接交给一个转换服务,由服务端完成解码与格式重写,再把生成的 Clash YAML 链接交给客户端订阅。这类服务通常支持自定义参数,常见的有:
这条路径的优势是转换能力更强、模板可复用,适合需要统一多个订阅源命名规则、合并去重的场景;代价是原始订阅链接(包含账号身份信息)会经过第三方服务器,存在隐私暴露面,选择时要留意服务是否公开声明日志策略,更谨慎的做法是自建开源转换服务,把中转环节控制在自己手里。
注意:订阅链接里通常携带用户唯一标识(token 或用户名密码),一旦经第三方转换服务中转,等同于把账号凭证暴露给了该服务。不清楚转换服务背景时,优先选择客户端内置转换或本地部署的转换工具,避免把订阅原文交给不受控的第三方。
订阅转换成功导入,不代表节点一定能正常连接。以下几种情况在实际使用中出现频率较高。
转换后节点数量比原订阅少,通常是转换服务或客户端不支持某个协议字段导致整条节点被跳过,而不是报错中断。排查方法是先看原始 Base64 解码后的节点总数,再对比生成的 YAML 里 proxies 条目数,如果确实少了,检查缺失节点的协议类型是否偏冷门(例如某些实验性传输层组合),换一个转换模板或更新到支持该协议的最新内核版本往往能解决。
如果使用了远程规则模板(config 参数指定的模板),策略组的节点筛选条件是按节点名关键词匹配写死的,新节点名称如果不符合模板里的关键词规则(比如模板只筛"HK|SG|JP"开头的节点),就不会被自动归入对应策略组。这种情况需要检查模板里的筛选正则,或者干脆去掉远程模板,让转换服务用默认的"全部节点入一个自动测速组"策略。
部分协议(尤其是 Trojan 和 VMess 的 WebSocket+TLS 组合)对 SNI 和 skip-cert-verify 字段比较敏感,转换服务如果没有正确解析原始链接里的 sni 或 allowInsecure 参数,生成的节点会连接超时或握手失败。这种情况建议手动打开生成的 YAML,对照原始分享链接的参数,补全或修正 servername 与 skip-cert-verify 字段。
转换生成的订阅链接本质上是"实时代理请求",每次客户端刷新订阅时,转换服务都会重新拉取原始订阅并重新转换一遍。如果原始订阅本身设有更新频率限制(常见的是几小时一次),客户端刷新过于频繁会被原始面板判定异常请求而拒绝响应,进而导致转换服务返回空节点列表。客户端里的订阅刷新间隔建议设置在 6~12 小时,避免手动频繁点击刷新。
订阅格式的转换看起来是个格式转换的小问题,但背后牵涉的是节点信息在多方之间的流转路径。弄清楚每一步数据经过了谁的服务器、以什么形式暴露,比单纯让"链接能用"更值得花时间确认。