先辨认内容:订阅地址不等于订阅格式
Clash 订阅导入失败,先看服务器返回了什么,再决定是否转换。一条以 https:// 开头的订阅地址只是获取入口,返回内容可能是完整 YAML、节点列表的 Base64 文本,也可能是登录页或错误提示。文件叫 clash.yaml 并不能证明它是有效配置,客户端显示“订阅”也不意味着它接受所有节点格式。
本文主要面向使用 mihomo 内核的 Clash 客户端。mihomo 是 Clash Meta 后续使用的项目名称;历史 Clash 内核和不同图形客户端支持的协议、导入入口并不完全相同。应分别确认“内核能否运行该节点”和“界面能否解析该分享链接”,不能只凭客户端名字判断。
| 内容类型 | 识别线索 | 包含的信息 | 导入方式 |
|---|---|---|---|
| 完整 Clash YAML | proxies:、proxy-groups:、rules: 等字段 | 节点、策略组、分流规则及运行设置 | 作为配置文件或远程配置导入 |
| 节点提供者 YAML | 通常只有顶层 proxies: | 节点列表,通常不包含策略组和规则 | 由主配置的 proxy-providers 引用 |
| Base64 通用订阅 | 一段编码文本,解码后常是多行分享链接 | 各节点的连接参数 | 使用支持该格式的导入器或转换工具 |
| 单条分享链接 | ss://、vmess://、trojan:// | 一个节点的协议参数及备注 | 粘贴到节点导入入口,或转换为 YAML 节点 |
Clash YAML:节点与分流配置放在同一份文档中
YAML 是结构化文本,不是节点协议。proxies 定义节点,proxy-groups 将节点组织成策略组,rules 决定连接交给哪个策略。完整配置还能设置 mixed-port、dns 和 tun。从节点链接生成 YAML 时,后面这些设置需要由转换模板或本地配置补上。
完整结构示例:一个 Shadowsocks 节点
下面是完整配置结构示例,不是可直接联网的订阅。proxy.example.com 是文档示例域名,密码也是演示值;实际使用必须改为服务商提供的地址、端口、加密方法和密码。它没有启用 TUN,也没有定义专用 DNS 配置。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
proxies:
- name: SS 示例
type: ss
server: proxy.example.com
port: 8388
cipher: aes-128-gcm
password: "password"
udp: true
proxy-groups:
- name: 手动选择
type: select
proxies:
- SS 示例
- DIRECT
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,手动选择
7890是本机 HTTP/SOCKS 混合代理入口;8388是远端节点端口,两者不能互换。SS 示例在节点定义和策略组引用中必须完全一致,包括空格。MATCH是兜底规则,应排在具体规则后面。这里仅演示顺序,不是完整的大陆与境外分流方案。- 缩进使用空格,不使用 Tab。密码建议加引号,避免特殊字符被 YAML 当作语法。
只有节点列表时,优先考虑 proxy-providers
长期维护自己的分流规则时,可以让主配置固定,只更新节点提供者。这能减少每次订阅更新对本地规则的影响。下面是配置片段,需合并进已有主配置;对应的本地文件 ./providers/nodes.yaml 应包含顶层 proxies: 和节点列表。
proxy-providers:
本地节点:
type: file
path: ./providers/nodes.yaml
proxy-groups:
- name: 订阅选择
type: select
use:
- 本地节点
文件路径由内核运行目录和客户端管理方式决定,不一定是下载文件夹。还需要让主配置的规则指向 订阅选择。不要把仅含节点的文件当成已经配好分流规则的完整配置。
Base64 订阅:编码包装,不是加密
常见通用订阅会把多行分享链接合在一起,再对整段文本进行 Base64 编码。解码得到的是节点链接列表,而不是自动生成的 Clash YAML。某些服务也直接返回明文链接,因此识别时应先看内容,不要对所有订阅机械地执行解码。
解码后通常是什么
以下是两行演示链接。它们使用示例域名和演示密码,不能用于连接。第一条的用户信息解码后是 aes-128-gcm:password;第二条的 sni 指定 TLS 使用的服务器名称。
ss://[email protected]:8388#SS-demo
trojan://[email protected]:443?sni=proxy.example.com#Trojan-demo
- 在本地读取订阅文本,先检查是否已经是 YAML 或明文分享链接。
- 确认是 Base64 后再解码。常见变体包括 URL-safe 字母表和省略末尾填充符的形式,导入器需要处理这些差异。
- 逐行识别协议,再将服务器、凭据、传输方式等参数映射成 YAML 节点。
- 添加策略组和规则,检查目标内核是否支持所有字段,最后才导入客户端。
解码失败也可能是拿到了 HTML 页面。例如请求被重定向到登录页,或服务端返回限流提示。此时应检查订阅是否过期、响应状态及返回内容,而不是继续叠加解码操作。修改扩展名和反复编码都不能修复服务器端的授权问题。
ss、vmess、trojan:转换时必须保留哪些字段
分享链接不是完全统一的标准容器。同一协议可能存在多种链接写法,转换器对查询参数的支持也不同。转换成功的含义应是“连接语义保留”,而不只是“输出了一份没有语法错误的 YAML”。
| 协议 | 核心 YAML 字段 | 容易遗漏的参数 |
|---|---|---|
| Shadowsocks | type: ss、server、port、cipher、password | 插件类型与 plugin-opts;新加密方法的内核支持情况 |
| VMess | type: vmess、uuid、alterId、cipher | network、tls、servername、WebSocket 路径及 Host |
| Trojan | type: trojan、server、port、password | sni、alpn、传输方式及证书校验设置 |
Shadowsocks:两种编码层级不要混淆
常见 SIP002 链接在 @ 前对用户信息编码,旧式分享链接可能对更长的一段内容编码。通用订阅还可能在外面再包一层 Base64。应区分“整个订阅的编码”和“单条链接内部的编码”。如果链接携带插件参数,不能只复制地址与密码,否则可能丢掉建立连接所需的传输设置。
VMess:解码 JSON 后仍需字段映射
常见 vmess:// 链接承载 Base64 编码的 JSON。其中 add 通常对应服务器,id 对应 UUID,aid 对应 alterId,net 对应传输方式。现代 VMess AEAD 配置通常使用 alterId: 0,但不能把任意历史配置强行改为这个值。
如果源节点使用 WebSocket,需检查 ws-opts.path 与 ws-opts.headers.Host。TLS 的服务器名称与 WebSocket 的 Host 是不同用途,不能因为值偶尔相同就合并。使用 gRPC 时还要核对 grpc-opts.grpc-service-name;转换工具是否保留它比节点备注是否好看更重要。
Trojan:URI 参数需要正确解码
密码或备注包含特殊字符时,分享链接可能采用百分号编码。导入器应先按 URI 规则解析,不能简单以冒号或井号切开所有文本。转换后检查密码、SNI 和 ALPN 是否保留。遇到证书错误时,先核对系统时间与服务器名称,不要将 skip-cert-verify: true 当作默认修复方案。
互相转换:节点能导出,规则不一定能还原
“Base64 订阅转 Clash”通常是先提取节点,再套用配置模板。“Clash 转通用订阅”通常只导出可表达为分享链接的节点。两者不是完整的可逆变换:策略组、规则顺序、DNS、TUN 设置以及部分内核专有参数,通常没有对应的通用分享链接字段。
选择转换方式的顺序
- 优先原生格式:在服务商订阅管理页选择目标内核支持的 Clash/mihomo 格式,避免额外转换环节。
- 少量节点手动录入:对照协议字段逐项填写,适合一至几个节点,也便于核对 TLS 与传输参数。
- 批量使用本地转换:确认工具支持源协议和目标内核,转换后检查节点数量、字段及警告。
- 在线转换慎交凭据:确认服务运营方及其数据处理方式。不要把含令牌的订阅地址嵌入公开文档或公开配置仓库。
- 输入有 12 个节点而输出只有 9 个时,先查被忽略的协议、重复名称处理和筛选条件,不要直接覆盖旧配置。
- 将所有节点改成同一个名字,可能导致策略组引用混乱。需要重命名时,同步检查组内引用。
- 使用远程
proxy-providers的配置,导出时未必自动展开提供者里的节点。应确认工具实际读取了哪些数据。 - 更换转换模板会改变规则和策略组。保留转换前的本地副本,便于对比和恢复。
如果目标是“保留自己的规则,只更新服务商节点”,应考虑节点提供者或客户端支持的覆写机制,而不是每次把完整配置往返转换。客户端直接编辑远程配置的方式也需要确认:有些修改会被下一次订阅更新覆盖。
导入与排错:先查格式,再查连接
以 Clash Verge Rev 常见界面为例,完整远程配置通常在「订阅」→「新建」中填写订阅 URL,保存后更新并选中配置;本地 YAML 可通过该页的文件导入入口处理。具体按钮文案随版本变化,应以当前界面为准。其他客户端可能将对应页面称为「配置」或「Profiles」,单节点导入入口与完整配置入口不能混用。
导入后按四步验收
- 确认配置已启用:在订阅或配置页确认当前选中的配置。仅下载成功不等于内核已经加载它。
- 检查解析结果:打开「代理」页核对策略组和节点数量,选中需要的节点;空组通常提示节点引用或提供者加载异常。
- 检查本地入口:在设置中核对实际混合端口。本文示例是
127.0.0.1:7890,实际客户端可能使用其他端口,不应照抄覆盖。 - 检查日志:先处理 YAML 解析、未知代理名称和提供者读取错误,再处理认证失败、TLS 错误或连接超时。
| 现象 | 优先检查 | 处理方向 |
|---|---|---|
| 提示 YAML 解析失败 | 下载内容是否为 HTML、缩进是否混入 Tab | 重新获取正确格式,按错误行号修正结构 |
| 提示代理不存在 | 策略组或规则引用的名字 | 对照节点、策略组及提供者名称逐字核对 |
| 能导入但节点全部失败 | 密码、UUID、TLS 名称与传输参数 | 与源链接逐项比较,不先改分流规则 |
| 订阅更新后自定义规则消失 | 是否直接修改了远程配置正文 | 使用客户端覆写或本地主配置管理规则 |
| 部分节点被转换器跳过 | 源协议支持、输出日志及筛选条件 | 更换支持该协议的转换方式或手动录入 |
常见问题:改后缀、二维码与订阅更新
把 Base64 文本改名为 .yaml 能直接导入吗?
不能仅靠改名完成转换。扩展名不改变内容结构;必须先解码并解析节点,再生成符合目标内核要求的 YAML。若客户端内置通用订阅解析功能,可以由客户端执行这一步,但它是客户端的附加能力,不是 YAML 解析器天然接受分享链接。
二维码和分享链接有什么关系?
二维码通常只是把分享链接作为文本存进去,也可能存放订阅 URL。扫码后先确认得到的是单节点链接还是远程订阅地址,再选导入入口。二维码图片同样可能泄露密码或令牌,公开展示前应与文本凭据一样处理。
转成一个本地文件后,还会自动更新节点吗?
单次生成的本地 YAML 不会自动知道源订阅已经变化。需要重新转换导入,或使用支持定期获取的远程配置、HTTP 节点提供者。自动更新能否继续工作取决于客户端保存的更新地址与调度方式,不取决于文件中是否出现“订阅”字样。
如何选择最终保存的格式?
需要节点、策略组和分流一起使用,保存完整 Clash/mihomo YAML;需要自己的规则长期稳定,保存主配置并单独维护节点提供者;只在兼容客户端之间搬运节点,使用分享链接或通用订阅。选择依据是要保留哪些信息,而不是哪一种编码看起来更复杂。