先判断故障发生在哪一层
Clash 客户端更新订阅时,通常要依次完成域名解析、建立 TCP 与 TLS 连接、发送 HTTP 请求、接收响应、识别订阅格式、解析 YAML 或节点 URI,最后把结果交给 mihomo 等内核加载。界面上同一句“更新失败”,可能对应完全不同的环节。直接反复点击更新,通常只能重复同一个错误。
开始排查前,先记录报错原文、发生时间和客户端当前使用的内核版本。不要只记录“不能用”。像 timeout、403 Forbidden、yaml: unmarshal errors、unexpected end of file 这类关键词,已经能把范围缩小到网络、访问控制或格式解析。
| 可见现象 | 优先检查 | 常见含义 |
|---|---|---|
| 粘贴链接后立即提示格式错误 | 链接完整性、返回内容 | 复制不完整,或接口返回网页、JSON 错误信息 |
| 等待约 10 至 30 秒后超时 | DNS、路由、TLS、本机网络 | 请求没有稳定到达订阅服务器 |
| 显示更新成功但节点为 0 | 订阅类型、套餐状态、内容格式 | 返回内容可读取,但不是当前入口需要的数据 |
| 浏览器可打开,客户端返回 403 | User-Agent、请求头、访问频率 | 服务端按客户端特征或频率限制请求 |
| 旧配置可用,新订阅无法载入 | YAML 字段、代理协议、内核版本 | 新内容含当前内核不支持的结构 |
第一步:确认订阅链接仍然有效
检查复制结果与 HTTP 状态
先把链接粘贴到纯文本编辑器,确认开头是 https:// 或服务方明确提供的 http:// 地址。即时通信工具可能在问号、等号、连字符附近截断链接;二维码识别也可能混入空格或换行。URL 尾部如果包含 token=、key= 一类参数,缺少一个字符就可能返回 401、403 或空内容。
可在终端仅查看响应头。Windows 11 可打开“终端”→“PowerShell”,macOS 可打开“应用程序”→“实用工具”→“终端”。以下命令中的地址应在本机替换,执行结果不要公开转发:
curl -I -L --connect-timeout 10 --max-time 30 "订阅地址"
-L 用于跟随 301 或 302 跳转,连接超时设为 10 秒,总时限设为 30 秒。常见状态码可按下面的方向理解:
- 200:服务器返回了内容,但还不能证明内容就是有效订阅。
- 301、302、307、308:存在跳转;客户端过旧或跳转目标不可达时可能失败。
- 401、403:令牌失效、账户状态异常、请求特征不符合要求,或访问来源受限。
- 404、410:接口路径已变更,旧订阅地址被撤销。
- 429:短时间更新次数过多。停止重试,等待服务端限制窗口结束。
- 500、502、503、504:订阅服务器或其上游暂时异常,应间隔一段时间再次确认。
浏览器能打开不等于客户端一定能更新
浏览器与 Clash 客户端使用的 DNS、代理路径、Cookie、User-Agent 和重定向处理方式可能不同。浏览器显示下载文件,只能说明当前浏览器环境能访问。客户端仍可能因为请求头不同、代理形成循环或无法解析目标域名而失败。
还要核对账户侧状态。流量用尽、套餐到期、订阅地址被重置后,部分服务不会返回明确的 401,而是返回一段说明文字或 HTML 登录页。客户端拿到这些内容后,往往显示“解析失败”,表面像 YAML 错误,根因却是订阅权限已经变化。
第二步:检查返回内容是不是 Clash 可识别格式
识别完整配置、代理集合与通用节点列表
常见订阅并不只有一种结构。完整 Clash 配置通常是 YAML,可能包含 proxies、proxy-groups、rules、dns 等顶层字段。代理集合通常供 proxy-providers 引用,内容可能以 payload 为核心。另一类通用订阅则是经过 Base64 编码的节点 URI 列表,解码后可见 ss://、trojan://、vmess:// 等条目。
这三类内容的用途不同。把仅供 proxy-providers 使用的集合地址直接当作完整配置导入,客户端可能提示缺少策略组和规则;把完整 YAML 填入只接受节点列表的转换入口,也可能得到节点数为 0。先确认服务方标注的是“Clash 配置”“Mihomo 配置”“代理集合”还是“通用订阅”。
一个最小化的完整结构通常接近下面的形式。真实配置还会包含端口、DNS 和更多规则,但缩进关系应保持一致:
mixed-port: 7890
mode: rule
proxies:
- name: example-node
type: ss
server: 192.0.2.10
port: 443
cipher: aes-128-gcm
password: example-password
proxy-groups:
- name: PROXY
type: select
proxies:
- example-node
- DIRECT
rules:
- MATCH,PROXY
排除网页、错误 JSON 与截断文件
使用下面的命令保存响应正文,再用文本编辑器查看前几十行。文件名使用本地临时名称即可:
curl -L --connect-timeout 10 --max-time 30 \
-o subscription-response.txt \
"订阅地址"
如果开头出现 <!doctype html>、<html>、登录表单或验证码说明,返回的是网页。若内容是 {"code":403,"message":"..."} 之类结构,返回的是接口错误 JSON。若文件末尾突然停在一个未闭合的引号、列表或 Base64 字符串中间,则可能是下载中断或服务端生成内容不完整。
- YAML 缩进只能表达层级,列表项前的连字符必须位于正确层级。
- Tab 制表符可能导致 YAML 扫描失败,配置缩进应使用空格。
- 节点名称中的冒号、井号、花括号等字符可能需要引号包裹。
- 同一层级出现重复字段时,不同解析器的处理结果可能不同。
- 响应头中的 Content-Type 可作为线索,但不能单独判定内容是否有效。
第三步:比较 User-Agent 与请求行为
部分订阅接口会根据 User-Agent 返回不同格式。例如,对浏览器返回说明页,对 Clash 或 mihomo 返回 YAML;也有接口按 User-Agent 选择兼容字段。浏览器测试为 200、客户端却得到 403 或 HTML 时,应比较请求特征,而不是直接修改 YAML。
可用 curl 模拟常见的 mihomo 请求标识。先测试默认请求,再测试指定 User-Agent,两次结果若在状态码、文件大小或正文格式上明显不同,问题通常位于服务端识别逻辑:
curl -L -A "clash.meta" \
--connect-timeout 10 \
--max-time 30 \
-o subscription-mihomo.yaml \
"订阅地址"
若指定 clash.meta 后返回 YAML,而默认请求返回网页,应优先使用客户端提供的订阅 User-Agent 设置,或向订阅提供方确认推荐值。不同图形客户端菜单位置不同,常见入口位于“设置”→“订阅设置”或单个配置的“编辑”→“请求头”。修改前记录原值,避免把全局请求头误用于其他配置。
同时排查频率限制与缓存
连续点击“更新”会在几十秒内发出多次请求。服务端可能按令牌、IP 或 User-Agent 计数,随后返回 429、403 或临时空响应。遇到这种情况,应停止更新 10 至 30 分钟,再发起一次请求。不要同时让桌面端、手机端和路由器反复拉取同一地址。
客户端缓存也会制造“链接已修复但仍报旧错误”的错觉。可先在配置列表中记下配置名称与修改内容,再删除失败的远程配置并重新导入。不要直接覆盖仍在工作的本地配置。若客户端支持查看配置文件目录,也可以比较缓存文件的更新时间与大小:更新时间未变化说明下载阶段失败,时间已变化但无法启用则更接近解析或内核加载问题。
第四步:核对 mihomo 内核与配置字段兼容性
订阅成功下载后,仍要经过内核解析。Clash Premium、旧版 Clash、Clash Meta 与当前 mihomo 对协议字段和功能的支持范围并不完全相同。订阅服务升级模板后,可能加入旧内核不认识的代理类型、传输参数、DNS 字段或规则提供器选项,于是同一地址在新客户端可用,在长期未更新的客户端中报错。
从日志定位具体字段
打开客户端的“设置”→“日志”,把级别临时设为 info 或 debug,重新执行一次订阅更新或配置切换。完成后再恢复原日志级别。重点查找以下信息:
- unsupported proxy type:当前内核不支持订阅中的代理类型。
- field ... not found 或反序列化错误:字段名称、值类型或版本兼容性有问题。
- proxy ... not found:策略组引用了不存在的节点或其他策略组。
- rule provider ... error:主配置已载入,但外部规则集合下载或解析失败。
- bind: address already in use:配置可能已解析成功,失败点是 7890 等端口被占用。
内核兼容问题应先通过客户端内置的内核更新入口处理,常见位置为“设置”→“内核”→“检查更新”。更新后完全退出客户端再重新启动,确认日志中显示的实际内核版本已经变化。仅更新图形界面但仍使用旧内核,错误不会消失。
区分订阅解析与规则提供器失败
完整配置可能继续引用远程 proxy-providers 和 rule-providers。主订阅下载成功,不代表这些子资源都能访问。若节点列表存在,但切换配置时提示规则集合失败,应检查日志中的具体 URL、HTTP 状态和缓存路径,而不是重新生成主订阅。
例如主配置可通过直连访问,但规则集合地址需要代理;客户端启动时代理尚未建立,就可能形成启动依赖。可先暂时停用相关远程规则,确认主配置能否运行,再调整规则集合的下载路径或更新策略。修改 YAML 后先检查缩进,再使用客户端的配置检查功能载入。
第五步:检查本地网络、DNS 与代理循环
先在关闭系统代理后测试
订阅更新一般由客户端自身发起,但不同客户端可能选择直连、沿用系统代理或经当前代理策略访问。如果当前节点已经失效,而订阅域名又被送入该节点,就会出现“必须更新订阅才能恢复节点,但更新订阅又依赖失效节点”的循环。
- 记录当前配置和策略组选择。
- 关闭“设置”→“系统代理”。
- 如果启用了 TUN 模式,同时关闭“设置”→“TUN 模式”。
- 退出其他占用 7890、7891 或 7892 端口的代理程序。
- 在直连网络下重新测试订阅地址。
- 更新完成后,再依次恢复系统代理和 TUN。
如果关闭系统代理与 TUN 后立即恢复,根因通常是路由规则、当前策略或代理回环,而不是订阅格式。此时应检查订阅域名是否被错误送入代理策略,可为该域名添加明确的直连规则,并确保规则位于宽泛的代理规则之前。
rules:
- DOMAIN,subscription.example.com,DIRECT
- MATCH,PROXY
上面的域名仅用于展示结构,实际配置应填写订阅服务的真实主机名。若订阅经过多个跳转,还要检查最终跳转域名;只放行入口域名可能仍在第二跳失败。
检查 DNS、系统时间与 TLS
终端执行 nslookup 订阅域名,确认能返回地址。若浏览器使用安全 DNS,而系统解析失败,客户端可能无法复用浏览器的解析结果。可以临时切换到另一条网络,例如手机热点,再测试一次。更换网络后恢复,说明问题更可能在当前 DNS、路由器过滤或网络出口。
TLS 证书校验还依赖正确的系统时间。设备日期相差一天、时区错误或时间长期未同步,都可能触发 certificate has expired、not yet valid 等错误。Windows 11 可进入“设置”→“时间和语言”→“日期和时间”→“立即同步”;macOS 可进入“系统设置”→“通用”→“日期与时间”,启用自动设置。
防火墙或安全软件也可能只限制客户端进程,而不影响浏览器。可检查系统防火墙的允许列表,确认当前 Clash 图形客户端和 mihomo 内核进程都能建立出站连接。不要为了测试长期关闭防火墙;更合适的方法是查看阻止记录,并为对应程序建立范围明确的出站规则。
按固定顺序完成一次完整自查
为了避免多个变量同时变化,可以按下面的顺序执行。每完成一步只测试一次,并记录状态码、文件大小或日志变化。这样能明确是哪项调整产生了效果。
- 保存现场:记录错误原文、发生时间、客户端版本、内核版本和当前网络。
- 检查 URL:确认链接未截断,账户有效,令牌没有被重置。
- 检查 HTTP:使用 10 秒连接超时、30 秒总时限测试状态码与跳转。
- 查看正文:排除 HTML 登录页、JSON 错误、空文件和下载截断。
- 确认类型:区分完整 YAML、代理集合与通用节点列表。
- 比较请求头:测试默认 User-Agent 与 clash.meta 的响应差异。
- 检查兼容性:更新客户端内核,从日志中定位不支持的字段或协议。
- 隔离网络变量:暂时关闭系统代理和 TUN,改用直连或手机热点测试。
- 重新导入:保留旧配置备份,删除失败缓存后重新添加远程配置。
- 验证结果:确认节点数量、策略组、规则集合和更新时间都符合预期。
| 测试结果 | 可以得出的结论 | 下一步 |
|---|---|---|
| 所有网络都返回 401 或 403 | 更接近链接权限或服务端限制 | 确认账户状态、重置订阅地址或联系提供方 |
| 手机热点可用,原网络超时 | 原网络的 DNS、路由或出口存在问题 | 检查路由器、系统 DNS 和防火墙记录 |
| curl 得到 YAML,客户端仍失败 | 更接近请求头、缓存或内核兼容问题 | 查看客户端日志并更新内核 |
| 主配置成功,规则集合失败 | 主订阅本身有效 | 单独排查 rule-providers 地址和策略 |
| 关闭 TUN 后更新成功 | 存在路由回环或启动依赖 | 调整订阅域名规则与更新路径 |
恢复后还要验证配置是否真正可用
订阅页面显示“更新成功”只是第一层验证。还应确认配置更新时间已经刷新、节点列表不是空的、策略组引用正常,并执行一次延迟测试。延迟测试返回具体数值,例如 85 ms 或 230 ms,说明测试 URL 能经对应节点建立连接;持续显示超时,则应继续排查节点或本地网络。
随后打开连接面板,访问一个普通 HTTPS 页面,观察是否出现新连接,以及该连接命中了哪条规则、使用了哪个策略组和节点。规则模式下,订阅站点可以直连,其他目标按规则分流;全局模式则会把大部分流量交给当前全局策略。验证时应确认当前模式与预期一致。
如果系统代理使用默认混合端口 7890,还可检查操作系统代理地址是否为 127.0.0.1:7890,并确认日志中没有端口占用错误。TUN 用户则应检查 TUN 状态、默认路由与 DNS 是否已经恢复,不要只依赖浏览器缓存页面判断连接成功。
稳定后可把远程配置的自动更新间隔设置为合理值,例如 6 小时、12 小时或 24 小时。分钟级轮询通常没有必要,还可能触发服务端频率限制。客户端升级、内核切换或订阅模板变化后,再进行一次手动更新与配置检查即可。