YAML 结构总览
配置文件在哪里
GUI 客户端一般不让你直接面对文件本体:Clash Verge Rev 在「订阅 / 配置」页管理多份配置,Clash Plus 在 App 内维护订阅与本地配置,文件存放在各自的应用数据目录里,界面上都有「打开配置目录」之类的入口。而 mihomo 内核(以及 Clash for Windows 这类老客户端)直接读取一个 YAML 文件,默认文件名 config.yaml,启动时用 -d 参数指定它所在的目录。无论走哪条路径,最终生效的都是同一份结构的 YAML:顶层先是一组标量字段(端口、模式、日志级别),然后是 dns、proxies、proxy-groups、rules 四个功能段落,外加 proxy-providers、rule-providers 两个外部资源段。理解这份骨架,就理解了所有 Clash 系客户端共通的配置逻辑。
YAML 语法四条铁律
YAML 的写法约束很少,但每一条都直接决定文件能不能被解析:
- 缩进只能用空格,不能用 Tab。这是新手报错的第一来源,在编辑器里把 Tab 设为自动转换成两个空格可以一劳永逸。
- 键和值之间是「冒号加一个空格」。写成
port:7890或port : 7890都会解析失败,或得到意料之外的结果。 - 列表项以「- 」开头,短横线后面同样跟一个空格;列表可以与父键同列书写,也可以再缩进一级,两种写法等价,全文件统一即可。
- 字符串里出现冒号、#、花括号、方括号、逗号等特殊字符时,用英文双引号整体包起来;# 之后的内容是注释,不参与解析。
另外,YAML 支持锚点与引用(& 定义锚点、* 引用、<< 合并),多个节点共用一段参数时可以少写重复行,具体例子见「代理节点字段」一节。
顶层字段速览
一份完整配置的顶层大致分三组:网络监听(port、socks-port、mixed-port 等)、运行行为(mode、log-level、ipv6、external-controller 等)、功能段落(dns、proxies、proxy-groups、rules)。下表先给全景,后面逐段展开。
| 字段 | 类型 | 作用 |
|---|---|---|
port | 整数 | HTTP 代理监听端口 |
socks-port | 整数 | SOCKS5 代理监听端口 |
mixed-port | 整数 | HTTP 与 SOCKS 混合端口 |
allow-lan | 布尔 | 是否允许局域网设备接入 |
mode | 枚举 | rule / global / direct 三种运行模式 |
log-level | 枚举 | silent / error / warning / info / debug |
external-controller | 字符串 | RESTful 管理接口监听地址 |
dns | 段落 | 内置 DNS 服务器与解析行为 |
proxies | 列表 | 代理节点清单 |
proxy-groups | 列表 | 策略组清单 |
rules | 列表 | 分流规则,按序匹配 |
rule-providers | 映射 | 外部规则集定义 |
# config.yaml 骨架:先标量,后段落
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
dns:
enable: true
# ...详见「DNS 字段」一节
proxies:
- name: "node-a"
# ...详见「代理节点字段」一节
proxy-groups:
- name: "PROXY"
type: select
proxies: ["node-a", DIRECT]
rules:
- DOMAIN-SUFFIX,local,DIRECT
- MATCH,PROXY
值班提示
YAML 解析失败时内核会拒绝启动,GUI 客户端通常表现为「配置加载失败」或代理列表为空。报错信息里带的行号基本可信,优先检查该行附近的缩进、引号与冒号。
通用字段:端口、模式与全局行为
端口字段
Clash 对外提供四种入站监听。port 是经典 HTTP 代理端口;socks-port 是 SOCKS5 端口,支持 UDP 转发;mixed-port 把两种协议合并到同一端口,内核按请求特征自动识别,目前绝大多数 GUI 客户端默认只开混合端口;redir-port 与 tproxy-port 面向 Linux 透明代理,桌面用户用不到。启动时报「bind: address already in use」就是端口被占用:换一个端口,或找出并关掉占用进程。混合端口配合局域网共享的实际用法,技术笔记里有一篇专门展开。
| 字段 | 协议 | 常见取值 | 说明 |
|---|---|---|---|
port | HTTP | 7890 | 老客户端默认,逐步被混合端口取代 |
socks-port | SOCKS5 | 7891 | 支持 UDP 转发,游戏/语音类应用常用 |
mixed-port | HTTP + SOCKS5 | 7890 / 7897 | 当前主流默认,一个端口两种协议 |
redir-port | 透明代理(redirect) | 无默认 | Linux 网关/路由器场景 |
tproxy-port | 透明代理(tproxy) | 无默认 | Linux 网关场景,支持 UDP |
运行模式
mode 决定请求的出口走向,三个取值:rule 按 rules 列表逐条匹配,是日常使用的默认;global 把全部流量交给 GLOBAL 策略组(通常等于你在面板里选的那个节点),排查「是不是规则写错了」时切到它最直接;direct 全部直连,用于确认代理本身是否在工作。GUI 客户端首页的模式切换按钮,改的就是这个字段。
局域网与外部访问
allow-lan 打开后,同一局域网里的手机、平板可以把代理指向这台电脑的 IP 与端口,共用一个代理出口;bind-address 控制监听网卡,默认 "*" 表示所有网卡,只有配合 allow-lan 才有实际意义。external-controller 是内核的 RESTful 管理接口,GUI 面板靠它读状态、切节点、拉日志;secret 是该接口的访问令牌。如果把这个接口的监听地址改成 0.0.0.0 对外暴露,必须同时设置 secret,否则等于把代理控制权交给整个网络。external-ui 指向一个静态面板目录,可以让浏览器直接访问管理界面。
安全提示
allow-lan 只在可信网络里打开。公共 Wi-Fi 下开放代理端口,等于把带宽与出口借给同一网络里的陌生人。局域网共享的完整设置与验证步骤,见技术笔记《Clash 混合端口与局域网共享代理设置》。
日志、延迟与其他行为字段
log-level 从 silent 到 debug 共五档,排查问题时临时调到 debug,平时保持 info。ipv6 控制是否处理 AAAA 记录,网络没有 IPv6 出口时建议关闭。unified-delay 让测速把 TCP/TLS 握手时间计入延迟,各节点之间的数字才可比;tcp-concurrent 让候选节点并发建连,首跳更快;find-process-mode 控制是否解析本机进程名,PROCESS-NAME 规则依赖它;global-client-fingerprint 指定 TLS 客户端指纹伪装(常见取值 chrome),对依赖 uTLS 的协议有意义;profile 段的 store-selected 会记住面板里的手动选点,配置重载后选择不丢。另有 tun 段用于虚拟网卡级接管,属于进阶主题,普通桌面场景不必开启。
入站与出站的其他形态
除了顶层的端口字段,mihomo 还支持 listeners 列表声明更多入站:每项一个 name、type(http、socks、mixed、redir、tproxy、tun、shadowsocks、vmess 等)与 port,可以在同一份配置里同时监听多个端口、跑不同协议,例如给局域网单独开一个带认证的 SOCKS 端口,或把某个端口直接做成 Shadowsocks 服务端供其他设备接入。顶层端口字段与 listeners 可以共存,内核会把它们合并成完整的入站清单。出站方向除了 proxies 里的节点,还有三个内置出口:DIRECT 直连、REJECT 静默丢包、REJECT-DROP 直接断开连接;REJECT 会立即返回拒绝,适合广告与追踪域名,REJECT-DROP 不回应任何数据,适合让扫描类请求超时放弃。理解这两组概念,后面读规则与策略组时「出口」一栏的含义就完整了。
界面与外部资源字段
external-ui 指向一个静态面板目录后,浏览器访问 external-controller 的地址即可打开图形面板,适合内核裸跑在路由器、NAS 上的场景;external-ui-url 可以让客户端启动时自动下载官方面板压缩包。geodata-mode 与 geo-update-interval 控制地理数据文件的格式与更新周期;keep-alive-interval 调整连接复用的心跳间隔,移动网络下适当调大可以省电。这些字段都有合理默认值,只有明确遇到对应需求时才需要写进配置。
port: 7890
socks-port: 7891
mixed-port: 7897
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
ipv6: false
external-controller: 127.0.0.1:9090
secret: ""
unified-delay: true
tcp-concurrent: true
find-process-mode: strict
global-client-fingerprint: chrome
profile:
store-selected: true
store-fake-ip: true
DNS 字段:防污染与防泄漏
为什么 DNS 要单独成段
代理只解决「流量怎么走」,DNS 决定「域名先解析成什么」。系统默认 DNS 走运营商 UDP 53:明文、可被劫持,还会把访问意图暴露给本地网络——这就是常说的 DNS 泄漏。Clash 的 dns 段在内核里内置了一个 DNS 服务器:接管查询请求,按策略把不同域名交给不同上游;配合 fake-ip 模式还能实现「先按域名匹配规则、再决定代不代理」,绕开「先解析出被污染的 IP、规则却按域名写」的死结。
基础字段
enable 是总开关;listen 是内置 DNS 的监听地址,GUI 客户端不做系统级接管时可以不设。enhanced-mode 两个取值:redir-host 返回真实解析结果,由内核记录域名与 IP 的映射关系;fake-ip 直接返回 198.18.0.0/16 段的假地址,连接进来时再反查域名走规则匹配,速度更快、对污染免疫,是目前的主流选择。fake-ip-filter 列出不走 fake-ip 的域名——局域网设备名、NTP 校时、部分依赖真实 IP 的服务,名单内的域名按真实解析处理。default-nameserver 只负责解析「上游 DNS 服务器本身的域名」,必须填纯 IP 的传统 UDP 服务器,否则会陷入「要先解析 DoH 域名、又得先问 DoH」的循环。
上游服务器
nameserver 是主力上游列表,可写多行并发查询取最快结果。fallback 是备用组,配合 fallback-filter 按 GEOIP 判断:解析结果落在境外 IP 段时改用 fallback 重查。mihomo 更推荐 nameserver-policy:按域名集合直接指定上游,例如 geosite:cn 走国内 DoH、其余走可信境外 DoH,比 fallback 的「先查再判断」更确定。proxy-server-nameserver 专门解析代理节点的域名,防止节点域名被污染后连不上服务器。respect-rules 打开后,DNS 请求本身也按规则选择出口(经代理查询境外 DNS),代价是配置复杂度上升。另有 sniffer 嗅探段,可从 TLS/HTTP 握手里还原域名,修正「应用直接连 IP」时的规则匹配。
| 写法 | 协议 | 说明 |
|---|---|---|
223.5.5.5 | UDP 53 | 传统明文查询,仅适合 default-nameserver |
tls://dns.alidns.com | DNS over TLS | 853 端口加密传输 |
https://doh.pub/dns-query | DNS over HTTPS | 走 HTTPS,最不易被干扰 |
quic://dns.example | DNS over QUIC | mihomo 支持,低延迟 |
dhcp://en0 | DHCP 下发 | 跟随网卡获取运营商 DNS |
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- time.*.com
- ntp.*.com
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
proxy-server-nameserver:
- https://doh.pub/dns-query
nameserver-policy:
"geosite:geolocation-!cn":
- https://dns.cloudflare.com/dns-query
- https://dns.google/dns-query
排查路径
DNS 泄漏的典型症状:浏览器挂着代理,泄漏测试站点仍显示本地运营商。处理顺序:确认 dns.enable 已开、系统或浏览器的 DNS 指向内核监听地址、nameserver 里没有运营商 UDP。更多症状对照见常见问题页。
fake-ip 的工作原理与取舍
fake-ip 值得单独展开,因为它决定了整套分流的行为方式。开启后,内核对所有查询返回 198.18.0.0/16 段内的假地址,应用随即向这个假地址发起连接;内核收到连接时按假地址反查出原始域名,再拿域名去匹配规则。这样做有三个直接收益:一是规则匹配发生在解析之前,域名类规则永远生效,不会被「先解析出被污染的 IP」带偏;二是省掉了真实 DNS 的往返等待,首连更快;三是应用拿到的地址永不失效,不存在 DNS 缓存过期导致的抖动。代价同样明确:任何依赖真实 IP 的功能都会失灵——局域网里按 IP 访问设备、需要真实地址做地域判断的服务、以及直接 ping 域名排障,都会拿到假地址。这正是 fake-ip-filter 存在的意义:把这类域名逐个列入,让它们走真实解析。日常维护中,遇到「某个应用一开代理就异常、关掉就正常」,第一反应就是把它的域名加进 fake-ip-filter 试一次。
嗅探器 sniffer 的角色
并非所有应用都先查 DNS 再连接:部分客户端内置了硬编码 IP,或自己实现了 DNS。此时内核看到的只有目标 IP,域名类规则全部落空。sniffer 段开启后,内核会嗅探 TLS 握手中的 SNI 与 HTTP 请求的 Host 头,把连接还原出域名再重新走一遍规则匹配,命中率显著提升。它对纯 IP 的私有协议无能为力,但已足够覆盖绝大多数浏览器与常规应用。嗅探与 fake-ip 可以共存,二者解决的是同一问题的两个侧面:一个让域名在解析前可见,一个在解析缺失时把域名找回来。
代理节点字段:proxies 清单
通用字段
proxies 是一个列表,每个元素对应一个节点。所有协议共用的字段只有五个:name(显示名,规则与策略组靠它引用,必须全文件唯一)、type(协议类型)、server、port、udp(是否转发 UDP,节点支持就开)。其余字段随协议变化。手工维护多个同协议节点时,可以用 YAML 锚点抽出公共部分,后续节点用合并键引用,只写差异字段:
proxies:
- &ss-base
name: "ss-a"
type: ss
server: 203.0.113.10
port: 8388
cipher: aes-128-gcm
password: "your-password"
udp: true
- <<: *ss-base
name: "ss-b"
server: 203.0.113.11
port: 8389
各协议示例
以下示例覆盖 mihomo 常用的五类协议,地址全部使用文档保留段,替换为真实服务器信息即可使用:
proxies:
- name: "ss-example"
type: ss
server: 203.0.113.10
port: 8388
cipher: aes-128-gcm
password: "your-password"
udp: true
- name: "vmess-example"
type: vmess
server: 198.51.100.20
port: 443
uuid: 11111111-2222-3333-4444-555555555555
alterId: 0
cipher: auto
tls: true
servername: example.com
network: ws
ws-opts:
path: /ray
headers:
Host: example.com
- name: "trojan-example"
type: trojan
server: 192.0.2.30
port: 443
password: "your-password"
sni: example.com
skip-cert-verify: false
udp: true
- name: "hy2-example"
type: hysteria2
server: 203.0.113.40
port: 443
password: "your-password"
sni: example.com
skip-cert-verify: false
- name: "vless-example"
type: vless
server: 198.51.100.50
port: 443
uuid: 11111111-2222-3333-4444-555555555555
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.microsoft.com
reality-opts:
public-key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
short-id: "0123456789abcdef"
client-fingerprint: chrome
skip-cert-verify 只在确认证书链有特殊原因时临时打开,长期开启等于放弃 TLS 的身份校验。sni / servername 决定 TLS 握手时声明的域名,填错会直接连不上。
协议支持差异
原版 Clash 已停止维护,新协议只进 mihomo 内核。这也是本站下载页全部首推 mihomo 系客户端的原因:
| 协议 | 原版 Clash(停更) | mihomo |
|---|---|---|
| Shadowsocks | 支持 | 支持 |
| VMess | 支持 | 支持 |
| Trojan | 支持 | 支持 |
| Snell | 支持 | 支持 |
| Hysteria / Hysteria2 | 不支持 | 支持 |
| TUIC | 不支持 | 支持 |
| VLESS / Reality | 不支持 | 支持 |
| WireGuard | 不支持 | 支持 |
订阅用户注意
导入订阅后,客户端会自动生成 proxies 列表,基本不用手写这一段。直接改订阅文件里的节点,会在下次订阅更新时被整份覆盖;想长期保留自建节点,用「覆写与合并」一节的方法追加。
策略组字段:proxy-groups
五种类型
策略组是「节点的容器加选择策略」。select 手动选择,面板里点哪个走哪个,几乎每份配置都有一个总入口组;url-test 按固定间隔对组内节点测速,自动选延迟最低者;fallback 同样测速,但语义是「当前节点挂了才切下一个」,列表顺序即优先级;load-balance 把连接按策略分摊到多个节点(strategy 取 consistent-hashing 或 round-robin),适合多线叠加带宽;relay 把多个节点串成链式代理,流量依次穿过,出口是最后一个节点。mihomo 还支持给策略组加 icon 字段,面板里显示自定义图标。
| 类型 | 选择方式 | 典型用途 |
|---|---|---|
select | 手动选点 | 总入口、功能分组(如广告拦截开关) |
url-test | 自动最低延迟 | 同地区多节点择优 |
fallback | 故障转移 | 主备线路,稳定优先 |
load-balance | 负载均衡 | 多线叠加带宽 |
relay | 链式转发 | 入口与落地分离的中转链路 |
测速参数
url 是测速目标,惯例用 http://www.gstatic.com/generate_204,204 无内容响应、开销最小;interval 是测速间隔秒数,太短徒增流量与电量,300 是常见取值;tolerance 是切换阈值(毫秒),新节点比当前节点快出这个数才换,避免在两条相近线路间来回跳;lazy 为 true 时只有组被使用才测速,冷门备用组不白跑流量;timeout 是单次测速的超时上限。
嵌套与引用
策略组的 proxies 列表里可以再写其他策略组的名字——这就是嵌套:总入口 PROXY 里放「香港」「日本」「美国」三个地区组,每个地区组是 url-test,手动选地区、组内自动选节点,两层各司其职。use 字段引用 proxy-providers 里的订阅源,把整批节点拉进组;filter 用正则筛节点名,例如 filter: "香港|HK" 只保留名字含香港的节点。DIRECT(直连)与 REJECT(拦截)是两个内置出口,可以直接写进任何 proxies 列表,配合 select 组就能做「广告拦截开关」这类功能组。
proxy-groups:
- name: "PROXY"
type: select
proxies: ["HK-AUTO", "JP-AUTO", "US-AUTO", DIRECT]
- name: "HK-AUTO"
type: url-test
use: ["provider-main"]
filter: "香港|HK|Hong Kong"
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
lazy: true
- name: "JP-AUTO"
type: url-test
use: ["provider-main"]
filter: "日本|JP|Japan"
url: http://www.gstatic.com/generate_204
interval: 300
- name: "US-AUTO"
type: fallback
use: ["provider-main"]
filter: "美国|US|United States"
url: http://www.gstatic.com/generate_204
interval: 300
- name: "AD-BLOCK"
type: select
proxies: [REJECT, DIRECT]
关于 relay
链式代理上任意一环断开,整条链不可用;每过一环延迟叠加一次。它解决的是「入口与出口必须分离」的特定需求,不是日常提速手段,普通场景用前四种类型足够。
规则语法:rules 从上到下
匹配顺序
rules 是一个有序列表:内核从上到下逐条比对,命中第一条即停止,后面的不再看。写法上的铁律是「精确的放前面,宽泛的放后面,MATCH 永远垫底」。规则分两类:域名类(DOMAIN / DOMAIN-SUFFIX / DOMAIN-KEYWORD / GEOSITE)在解析前就能判断;IP 类(IP-CIDR / GEOIP)需要拿到解析结果。给 IP 类规则加 no-resolve 参数,表示「请求本来就是域名时,别为了匹配这条规则去触发 DNS 解析」,纯域名请求会跳过该条继续往下走,能避免大量无谓查询。GEOSITE 与 GEOIP 依赖地理数据文件,GUI 客户端会自动维护,内核裸跑时需保证数据文件在配置目录内或开启自动更新。
规则类型速查
| 写法 | 匹配对象 | 说明 |
|---|---|---|
DOMAIN,example.com,出口 | 单个域名 | 精确匹配,不含子域 |
DOMAIN-SUFFIX,example.com,出口 | 域名后缀 | 匹配该域及全部子域 |
DOMAIN-KEYWORD,google,出口 | 域名关键词 | 包含即命中,谨慎使用 |
GEOSITE,cn,出口 | 域名分类库 | 社区维护的分类数据 |
IP-CIDR,192.168.0.0/16,出口 | IPv4 网段 | 建议加 no-resolve |
IP-CIDR6,fe80::/10,出口 | IPv6 网段 | 同上 |
GEOIP,CN,出口 | IP 归属地 | 建议加 no-resolve |
SRC-IP-CIDR,192.168.1.201/32,出口 | 来源 IP | 局域网内按设备分流 |
DST-PORT,443,出口 | 目标端口 | 按目的端口分流 |
PROCESS-NAME,telegram.exe,出口 | 进程名 | 依赖 find-process-mode |
RULE-SET,名称,出口 | 外部规则集 | 引用 rule-providers 定义 |
MATCH,出口 | 兜底 | 必须是最后一条 |
rule-providers 规则集
规则集把成百上千条规则抽成外部文件,主配置只留一行引用。type 为 http 时按 url 定时拉取(interval 秒)并缓存到 path;为 file 时读本地文件。behavior 三种:domain(纯域名后缀集合,加载为域名树,匹配最快)、ipcidr(纯 IP 段)、classical(经典规则行,可混写各种类型)。规则集文件本身可以是 yaml(payload 列表)或纯文本一行一条。
rule-providers:
reject-ads:
type: http
behavior: domain
url: "https://example.org/rules/ads.yaml"
path: ./ruleset/ads.yaml
interval: 86400
local-direct:
type: file
behavior: classical
path: ./ruleset/direct.yaml
rules:
- RULE-SET,reject-ads,AD-BLOCK
- RULE-SET,local-direct,DIRECT
- DOMAIN-SUFFIX,lan,DIRECT
- GEOSITE,private,DIRECT
- GEOSITE,cn,DIRECT
- GEOIP,CN,DIRECT,no-resolve
- GEOSITE,geolocation-!cn,PROXY
- MATCH,PROXY
必须兜底
没有 MATCH 收尾的配置,未命中的请求会走默认行为(依内核与版本而定),表现为「某些网站莫名其妙打不开」。任何配置都应以一条 MATCH 结束,出口通常是你的总入口策略组。
规则排序的实战思路
写规则时先想清楚三件事:哪些必须直连、哪些必须代理、剩下的交给谁。直连组放最前:局域网与保留地址(GEOSITE,private)、系统与时间服务、公司内网域名,这些命中即走,不消耗代理资源。拦截组紧随其后:广告与追踪域名交给 REJECT,越早拦截越省后续处理。然后是指定代理的精确规则:常用境外服务用 DOMAIN-SUFFIX 或 GEOSITE 分类点名,命中进 PROXY。宽泛的地理规则放后段:GEOSITE,cn 与 GEOIP,CN 兜底国内直连,GEOSITE,geolocation-!cn 兜底境外代理。最后 MATCH 收尾。这个顺序的核心原则是「判断成本递增、覆盖范围递增」:精确规则判断快、范围小,放前面;地理库匹配要查数据文件、范围大,放后面。规则数量与启动速度直接相关,几千条以内无需担心,超过这个量级就应考虑把稳定的大段规则迁移到 rule-providers,主配置只留高频调整的部分。
进程分流与端口分流的边界
PROCESS-NAME 规则按发起连接的进程名分流,是「让某个应用单独走代理或直连」的最直接手段,但它有两个前提:find-process-mode 必须开启,且该应用不能走系统代理之外的路径。macOS 与 Linux 上进程解析的可靠性不如 Windows,遇到规则不生效先查日志里进程名是否被正确识别。DST-PORT 规则按目标端口分流,典型用法是把 22(SSH)、873(rsync)等管理端口固定直连,避免代理出口 IP 频繁变化触发服务器的安全告警。这两类规则都属于「特例通道」,数量宜少不宜多,放在精确域名规则之后、地理规则之前。
覆写与合并:订阅与自定义共存
为什么不能直接改订阅文件
订阅的本质是「服务方下发的完整配置文件」,客户端每隔一段时间重新拉取并整份覆盖。你在订阅文件里加的自定义规则、改的策略组,下次更新全部消失。正确思路是把「订阅内容」与「本地自定义」分成两层:订阅负责节点,覆写负责你的规则与字段,二者在客户端运行时合并成最终配置。这样订阅随便更新,本地层始终不动。
客户端覆写机制
以 Clash Verge Rev 为例:订阅列表右键进入编辑,可以维护一段全局扩展配置(Merge),对所有订阅生效。Merge 支持两类键:一是 prepend- / append- 前缀的追加键,把内容插到对应列表的头部或尾部;二是与顶层同名的覆盖键,直接替换订阅里的值。Clash Plus 同样提供订阅之外的自定义配置入口,思路一致。仍在使用 Clash for Windows 的读者注意:该项目已停止维护,其 Mixin 机制多年未更新,建议按《迁移到 Clash Verge Rev 与 Clash Plus 的方案》一文换到活跃维护的客户端。
# 全局扩展配置(Merge)示例
prepend-rules:
- DOMAIN-SUFFIX,internal.example.com,DIRECT
append-proxy-groups:
- name: "MY-SELECT"
type: select
use: ["provider-main"]
mixed-port: 7897
三条路线对比
| 路线 | 特点 | 适用场景 |
|---|---|---|
| 客户端覆写(Merge / 自定义配置) | 零外部依赖,随客户端走 | 日常加规则、改端口、追加策略组,推荐 |
| 本地模板 + 订阅转换 | 一次生成完整配置 | 多订阅合一、精细模板管理 |
| 自建 subconverter | 完全自控,可多人共用 | 有自己的服务器、进阶玩家 |
推荐路线
普通用户只用客户端自带覆写,绝大多数自定义需求(加规则、换端口、追加策略组)都能覆盖。订阅格式本身的差异与转换方法见技术笔记《Clash 订阅链接是什么格式》;客户端本体到下载页获取,全平台首推 Clash Plus。
校验、调试与常见错误
用内核做静态检查
mihomo 自带配置检查:把 config.yaml 放进一个目录,执行 ./mihomo -t -d ./目录,通过则打印检查成功的提示,失败则给出字段名与行号。改动较大时先在命令行过一遍 -t,再让 GUI 加载,比重启客户端反复试错快得多。Windows 用户把内核可执行文件与配置放同一目录,在 PowerShell 里执行同样的命令即可。
热重载与日志
external-controller 开着的时候,可以不重启内核直接重载配置:
curl -X PUT "http://127.0.0.1:9090/configs?force=true" \
-H "Content-Type: application/json" \
-d '{"path": "/绝对路径/config.yaml"}'
force=true 会强制断开并重连现有连接,日常重载可以不带。日志层面,把 log-level 调到 debug 后,每条连接的匹配过程(域名、命中的规则、出口节点)都会打印,是定位「这条流量为什么没走代理」的第一手段;GUI 客户端的日志 / 连接面板,本质就是这些数据的图形化呈现。
高频错误对照
| 现象 / 报错 | 常见原因 | 处理 |
|---|---|---|
| yaml: line N: did not find expected key | 缩进不一致或混入了 Tab | 统一为 2 空格缩进 |
| cannot unmarshal | 字段类型写错(如端口写成字符串) | 对照本页表格修正类型 |
| 配置加载成功但节点全部超时 | 订阅未更新,或节点域名被污染 | 更新订阅;配置 proxy-server-nameserver |
| 部分网站打不开 | 规则未命中且缺 MATCH 兜底 | 补一条 MATCH 收尾 |
| fake-ip 下某服务异常 | 该域名必须拿到真实 IP | 加入 fake-ip-filter |
| 面板连不上内核 | external-controller 地址或 secret 不对 | 核对监听端口与令牌 |
不要把配置贴到在线工具
排错时不要把整份配置粘贴到在线 YAML 校验网站:里面有服务器地址、端口与密码。本地编辑器(VS Code 等)的 YAML 插件足以完成语法检查,内核的 -t 参数足以完成语义检查。
到这里,一份配置从骨架到字段、从规则到覆写的完整链路就齐了。日常使用中更具体的问题——连不上、速度慢、某个应用不走代理——常见问题页按症状整理了排查路径;还没装客户端的读者,下载页按平台给出了当前维护中的选择;想先快速跑通最小流程,再回到本页查字段的,从教程页开始。