Clash 配置文件结构逐段解析:port、proxies 到 rules 全字段读懂
拿到一份 config.yaml 却不敢改?本文按加载顺序逐段拆解通用字段、代理列表、策略组与规则段的语法与常见写法,改配置前先看这一篇。
配置文件加载顺序与整体结构
Clash 与 Clash Meta(内核代号 mihomo)读取的都是一份 YAML 格式的文本文件,常见文件名为 config.yaml。客户端启动或切换订阅时,会把整份文件一次性解析成内存里的对象,再按段落名逐一生效,不存在"边读边生效"的顺序依赖,但阅读和排查问题时按下面的顺序理解最省力:
- 通用字段:端口、运行模式、日志级别、外部控制器等,决定客户端本身怎么跑起来。
dns段:域名解析行为,影响后续规则匹配用的是域名还是解析出的 IP。proxies段:节点清单,每一条描述一个可用的代理服务器。proxy-groups段:把节点清单组织成策略组,决定"选哪个节点"这件事怎么呈现给用户。rules段:流量匹配规则,决定"这条连接走哪个策略组"。
订阅链接下发的配置文件本质也是同一套字段,只是由订阅方的后台生成。手动改配置前建议先备份原文件,改错字段轻则客户端拒绝加载,重则规则失效导致流量全部直连或全部走同一个节点。
YAML 对缩进极度敏感,统一使用两个空格缩进、不要混用 Tab,冒号后必须留一个空格,列表项用短横线加空格开头,这几条不遵守是新手改坏配置文件的头号原因。
通用字段:port、mode、log-level 与外部控制
文件最上方通常是一批不需要缩进的顶层字段,控制客户端自身的运行方式:
port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
secret: ""
port/socks-port:分别开放 HTTP 代理端口和 SOCKS5 代理端口,系统或浏览器按需选一个配置。mixed-port:一个端口同时接受 HTTP 与 SOCKS5 请求,现在的客户端界面大多默认只暴露这一个端口,简化系统代理设置。allow-lan:是否允许局域网内其他设备通过本机代理,手机接局域网共享上网时要打开。mode:核心工作模式,rule表示按rules段匹配分流,global表示所有流量走同一个策略组,direct表示全部直连不经代理。log-level:日志详细程度,排查问题时可临时改成debug,日常使用建议留info或warning,避免日志文件迅速变大。external-controller:开启 RESTful API 的监听地址,配合secret密钥,客户端图形界面和第三方面板都依赖这个接口读取状态、切换节点。
这些字段大多有默认值,图形界面一般会用界面开关覆盖 YAML 里的写法,但订阅链接生成的配置文件仍以 YAML 字段为准,冲突时以客户端实际加载结果为判断标准。
proxies 段:每一个节点怎么描述
proxies 是一个列表,列表里每一项对应一个可用节点,字段随协议类型不同而不同,但公共字段是一致的:
proxies:
- name: "HK-01"
type: ss
server: 1.2.3.4
port: 8443
cipher: aes-256-gcm
password: "your-password"
udp: true
- name: "SG-Trojan"
type: trojan
server: example.com
port: 443
password: "your-password"
sni: example.com
skip-cert-verify: false
常见公共字段说明:
name:节点显示名称,策略组里靠这个名字引用节点,重名会导致引用歧义,建议保持唯一。type:协议类型,常见有ss(Shadowsocks)、ssr、vmess、trojan、hysteria2等,不同协议要求的专属字段不同。server/port:节点的服务器地址与端口,直接影响连接目标。udp:是否允许该节点转发 UDP 流量,游戏和部分实时应用依赖 UDP,关闭后这类流量会失败或被迫直连。skip-cert-verify:是否跳过 TLS 证书校验,自签证书场景才需要打开,正常节点保持关闭更安全。
手写节点时最容易出错的是密码里包含冒号或特殊符号却没有用引号包裹,YAML 解析器会把冒号当成新的键值分隔符,建议密码统一加双引号。
proxy-groups 段:策略组语法与常见类型
proxy-groups 把 proxies 里的节点组织成可供规则引用的组,常见类型如下:
proxy-groups:
- name: "自动选择"
type: url-test
proxies:
- HK-01
- SG-Trojan
url: "http://www.gstatic.com/generate_204"
interval: 300
- name: "手动切换"
type: select
proxies:
- 自动选择
- HK-01
- SG-Trojan
- DIRECT
- name: "故障转移"
type: fallback
proxies:
- HK-01
- SG-Trojan
url: "http://www.gstatic.com/generate_204"
interval: 300
select:手动切换组,界面上呈现一个下拉列表,用户点哪个就用哪个,适合放在最外层给用户兜底。url-test:自动测速组,按interval秒的间隔对组内节点探测一次,自动选延迟最低的节点使用。fallback:故障转移组,按列表顺序尝试,第一个能连通的节点优先使用,前一个失效才轮到下一个。load-balance:负载均衡组,按策略把连接分散到多个节点,适合节点数量多且性能相近的场景。
策略组的 proxies 列表里除了节点名,还可以填其他策略组的名字,也可以填 DIRECT 或 REJECT 这两个内置策略,分别表示直连和拒绝连接。组与组之间可以互相嵌套引用,但不能出现循环引用,否则客户端加载时会报错。
rules 段:匹配语法与优先级
rules 是一个从上到下顺序匹配的列表,命中第一条规则就立即生效,不再继续往下比对,所以规则顺序本身就是优先级:
rules:
- DOMAIN-SUFFIX,openai.com,自动选择
- DOMAIN-KEYWORD,google,自动选择
- DOMAIN,ads.example.com,REJECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,自动选择
常见规则类型:
DOMAIN/DOMAIN-SUFFIX/DOMAIN-KEYWORD:按完整域名、域名后缀或关键词匹配,后缀匹配最常用,覆盖子域名场景。IP-CIDR/IP-CIDR6:按 IP 段匹配,常配合no-resolve参数跳过 DNS 解析,直接对连接目标的字面 IP 判断。GEOIP:按 IP 所属国家或地区匹配,GEOIP,CN,DIRECT是国内直连常见写法。PROCESS-NAME:按发起连接的进程名匹配,桌面端做按应用分流常用这条。MATCH:兜底规则,放在列表最后,前面所有规则都没命中的流量走这一条,几乎每份配置文件都需要一条MATCH收尾,否则未命中流量的走向会不明确。
规则里引用的策略组名必须与 proxy-groups 里的 name 完全一致,大小写、空格都要对上,否则客户端加载时通常会报"引用了未定义的策略"之类的错误并拒绝启用整份配置。
DNS 解析行为会影响 IP 类规则是否生效:如果开启了 fake-ip 模式,连接目标在规则匹配阶段拿到的是虚拟 IP,这时 IP-CIDR 类规则容易不按预期工作,通常需要针对特定域名把 DNS 模式切成真实解析,具体判断逻辑本站另有 DNS 相关文章详细说明。
常见错误与排查思路
手动改配置文件后客户端不生效或直接报错,可以按下面几个方向排查:
- 先用任意在线 YAML 校验工具或文本编辑器的语法高亮检查缩进和冒号空格,大多数"加载失败"是格式问题而非逻辑问题。
- 确认
proxy-groups里引用的节点名和proxies里的name完全对应,复制粘贴时最容易出现多余空格或全角字符。 - 确认
rules里引用的策略组名在proxy-groups里存在,新增规则时顺手把策略组名抄错是高频问题。 - 把
log-level临时改成debug,重启客户端观察日志输出,连接失败的具体报错通常会指向哪一段配置出了问题。 - 怀疑是订阅方生成的配置本身有问题时,可以在客户端里查看原始订阅内容,和自己理解的字段逐一核对,而不是直接怀疑客户端本身。
理解了这五段结构和加载顺序后,后续遇到订阅商提供的复杂配置文件、或者想手动加一条自定义分流规则,基本都能照着对应段落的语法直接改,不用整份文件推倒重写。