跳到主要内容

首页 / 博客 / 配置基础

Clash 配置报错速查:常见 YAML 错误与内核报错对照

配置基础2026-05-161998 字约 5 分钟
Clash 配置报错速查:常见 YAML 错误与内核报错对照

改完配置点保存,客户端弹一句英文报错就没了下文。这篇把常见报错整理成对照表。

先做一次配置检查

改配置之后、导入之前,用内核自己验一遍:

mihomo -t -d /path/to/config/dir

-t 是 test 模式,只检查不运行。它给出的错误信息比客户端弹窗详细得多,通常直接告诉你第几行有问题。

Clash Verge 用户可以在配置目录下对 config.yaml 执行这条命令。配置目录位置:

平台路径
Windows%APPDATA%\io.github.clash-verge-rev.clash-verge-rev
macOS~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev
Linux~/.local/share/io.github.clash-verge-rev.clash-verge-rev

一、YAML 语法错误

这类错误在配置解析阶段就失败了,通常报错里带行号。

found character that cannot start any token

原因:用了 Tab 缩进。YAML 只接受空格。

定位:编辑器里打开「显示空白字符」,Tab 会显示成箭头。

修复:全部替换成空格。VS Code 里 Ctrl+Shift+P → 「Convert Indentation to Spaces」。

mapping values are not allowed in this context

原因:冒号后面缺空格,或者值里有未加引号的冒号。

# 错误
port:7890
name: HK: 01

# 正确
port: 7890
name: "HK: 01"

did not find expected key / could not find expected ':'

原因:缩进层级不一致。

# 错误:两个键缩进不同
proxies:
  - name: "A"
    type: trojan
     server: a.com      # ← 多了一个空格

# 正确
proxies:
  - name: "A"
    type: trojan
    server: a.com

found unexpected end of stream

原因:引号没闭合,或者文件被截断。

检查所有引号是否成对;如果配置是下载来的,可能没下完整。

密码里的特殊字符

# 危险:# 会被当成注释,@ 和 : 也可能出问题
password: p@ss#word

# 正确
password: "p@ss#word"

二、字段与结构错误

语法没问题,但内核不认识你写的内容。

unmarshal error / cannot unmarshal !!str into int

原因:类型不对,比如端口写成了字符串。

# 错误
port: "443"      # 有些字段严格要求数字

# 正确
port: 443

反过来,UUID、密码这类必须是字符串:

uuid: 12345678-1234-1234-1234-123456789012      # 可能被解析成奇怪的类型
uuid: "12345678-1234-1234-1234-123456789012"    # 稳妥

unsupported proxy type: xxx

原因:订阅里用了当前内核版本不支持的协议。

修复:更新 Mihomo 内核。Clash Verge 里:设置 → Clash 内核 → 更新。

如果更新后还是不支持,说明这个协议确实还没被 Mihomo 实现,只能在服务商那边换个协议的节点。

proxy 'xxx' not found

原因:策略组里引用了不存在的节点名。

常见触发

  • 手写节点名时拼错了
  • 订阅更新后节点改名了
  • 扩展配置里引用的策略组名和订阅里不一致(emoji、空格差异)

修复:打开订阅原文件,复制粘贴准确的名字。或者改用 include-all + filter 自动收编,见节点分组正则

rule 'xxx' error: invalid domain

原因:规则写法有误。

# 错误
- DOMAIN-SUFFIX,https://google.com,PROXY   # 不要写协议
- DOMAIN-SUFFIX,*.google.com,PROXY         # 不要写通配符
- IP-CIDR,8.8.8.8,DIRECT                   # IP-CIDR 必须带掩码

# 正确
- DOMAIN-SUFFIX,google.com,PROXY
- IP-CIDR,8.8.8.8/32,DIRECT,no-resolve

rules[N] [xxx] error: unsupported rule type

原因:规则类型名写错,或者内核版本不支持。

检查拼写:DOMAIN-SUFFIX 不是 DOMAIN_SUFFIXIP-CIDR 不是 IPCIDR

策略组循环引用

报错:配置加载卡住或提示 recursive。

原因:A 组的 proxies 里有 B,B 组的 proxies 里有 A。

修复:理清层级,保证引用是单向的(上层组引用下层组,下层不反向引用)。

三、DNS 相关

default-nameserver 里填了域名

# 错误
default-nameserver:
  - https://doh.pub/dns-query

# 正确:必须是纯 IP
default-nameserver:
  - 223.5.5.5
  - 119.29.29.29

default-nameserver 的用途就是解析其他 DNS 服务器的域名,所以它自己不能是域名。

解析不出内网域名

不是报错,是行为不对。原因是 fake-ip 拦截了。

dns:
  fake-ip-filter:
    - "+.mycompany.com"
    - "*.lan"
    - "*.local"

详见 DNS 配置详解

四、规则集与 provider

provider xxx: initial failed

原因:规则集或订阅下载失败。

排查

按顺序检查url 在浏览器里能打开吗path 指向的缓存文件存在吗,内容是什么给 provider 加 proxy 字段,让下载走代理服务商是否限制了 User-Agent(加 header 指定 clash.meta)磁盘是否可写(path 所在目录权限)

规则集加载了但不生效

原因behavior 和文件内容不匹配。这个不会报错,只是静默失效。

behavior 必须对上domain文件里是纯域名列表google.com+.youtube.comipcidr文件里是 IP1.0.1.024classical文件里是完整规则DOMAIN-SUFFIX,google.com
打开 path 指向的缓存文件看一眼,就知道该用哪个

rule-set xxx not found

规则集名在 rules 里引用了,但 rule-providers 里没定义,或者名字拼错了。

五、TUN 与权限

operation not permitted / TUN 开关点了没反应

原因:权限不足,虚拟网卡创建失败。

修复

  • Windows / macOS:安装「服务模式」
  • Linux:sudo setcap cap_net_admin,cap_net_bind_service=+ep /path/to/mihomo

address already in use

端口被占用。

# Windows
netstat -ano | findstr :7897
tasklist | findstr <PID>
# Linux / macOS
lsof -i :7897

改端口或停掉占用的进程。

六、一个快速定位法

配置很长、报错又没给行号时,用二分法:

二分定位把配置砍掉一半保留 proxies 和最简 rules能加载吗能则问题在被删的那半再砍一半逐步缩小范围定位到具体段落通常几轮就能找到
比逐行看快得多,尤其是几千行的订阅配置

一个最小可用配置模板,用来做对照基线:

mixed-port: 7897
mode: rule
log-level: info
proxies:
  - name: "TEST"
    type: trojan
    server: example.com
    port: 443
    password: "pwd"
proxy-groups:
  - name: "PROXY"
    type: select
    proxies: ["TEST", DIRECT]
rules:
  - MATCH,PROXY

这份能加载,说明环境没问题,问题在你的配置内容里。

七、报错速查表

报错关键字原因处理
cannot start any token用了 Tab换成空格
mapping values are not allowed冒号后缺空格 / 值含冒号加空格 / 加引号
did not find expected key缩进不一致对齐缩进
unexpected end of stream引号未闭合 / 文件不完整检查引号,重新下载
unmarshal error类型不匹配数字不加引号,字符串加引号
unsupported proxy type协议不支持更新内核
proxy not found节点名引用错误从订阅里复制准确名字
unsupported rule type规则类型拼错检查连字符和大小写
invalid domain规则内容格式错去掉协议头和通配符
provider initial failed下载失败检查 url、加 proxy 和 UA
address already in use端口占用改端口或停掉占用进程
operation not permitted权限不足装服务模式 / setcap
规则集不生效但无报错behavior 不匹配打开缓存文件核对

八、预防措施

少踩坑的习惯改配置前先备份一份用支持 YAML 语法高亮的编辑器(VS Code + YAML 插件)改完先跑 mihomo -t 检查用扩展配置(Merge)而不是直接改订阅文件字符串一律加双引号systemd 服务加 ExecStartPre 做配置检查,坏配置不会顶掉运行中的服务

小结

  • mihomo -t -d 目录 是最有用的一条命令,报错比客户端详细
  • YAML 三大坑:Tab 缩进、冒号后缺空格、引号没闭合
  • proxy not found 通常是名字对不上,从订阅里复制
  • 规则集不生效但不报错 = behavior 写错了
  • 定位不了就用二分法砍配置

相关:YAML 结构详解Merge 扩展配置


相关文档