Clash config.yaml 逐段拆解:从 port 到 rules 的结构顺序
按文件自上而下的顺序拆解通用字段、dns、proxies、proxy-groups、rules 五大段,说明缩进规则与段间引用关系。
先看结构:五段配置怎样连接
读配置时先确认入口,再检查解析、节点、策略组与规则。config.yaml 不是按行执行的脚本:顶层字段通常可以调整排列顺序,但列表内部的顺序可能直接影响行为,尤其是 rules。把文件按五大段组织,是为了便于阅读和排错,并不是要求内核依次执行五个阶段。
本文以使用 Clash 配置格式的 mihomo 内核为主要参考。Clash 客户端是图形操作入口,内核负责解析配置和处理连接;不同客户端可能对端口、DNS、TUN 等字段再次合并或覆盖。因此,编辑前既要确认当前使用的内核,也要确认修改的是订阅原文件、覆写文件,还是客户端最终交给内核的运行配置。
| 配置段 | 主要职责 | 关联对象 |
|---|---|---|
| 通用字段 | 设置监听端口、运行模式和日志级别 | 应用代理设置、客户端开关 |
dns | 设置内核 DNS 的解析方式与上游 | 域名解析、Fake-IP、DNS 接管 |
proxies | 定义代理节点的连接参数 | 策略组的成员名称 |
proxy-groups | 组织节点和其他策略,提供选择入口 | 规则中的目标名称 |
rules | 按顺序匹配连接并指定处理目标 | 策略组、节点或内置策略 |
最常见的引用链是:rules 指向一个策略组,策略组再引用节点名称,节点最终提供服务器地址、端口和认证信息。DIRECT 与 REJECT 是内置策略,不需要在 proxies 中额外定义。
通用字段:port、模式与监听范围
三个代理端口不是三个节点
port 是 HTTP 代理监听端口,也支持常见的 HTTPS CONNECT 隧道;socks-port 是 SOCKS 代理监听端口;mixed-port 可以在同一个端口接收 HTTP 与 SOCKS 代理请求。它们都是本机入口,与远端节点的 port 不是同一件事。
port: 7890
socks-port: 7891
mixed-port: 7892
allow-lan: false
bind-address: "127.0.0.1"
mode: rule
log-level: info
ipv6: false
这段配置用三个不同端口展示字段关系,实际使用不必全部开启。只需要混合入口时,可以仅保留 mixed-port: 7892。对应地,浏览器或系统 HTTP 代理应填写 127.0.0.1:7892,支持 SOCKS 的应用也可以连接同一个混合端口。改完内核端口后,还要同步应用侧设置,不能让应用继续访问旧的 7890。
mode 与 allow-lan 各自控制什么
mode: rule:使用规则列表分流,适合日常按域名或 IP 区分出口。mode: global:主要通过全局策略选择出口,不按普通规则列表逐条分流。mode: direct:使用直连模式,不等于关闭客户端或清除系统代理。allow-lan: false:不向局域网设备开放代理入口。需要共享时,才进一步配置监听地址、认证与防火墙。
dns:上游解析与流量接管
dns 段负责内核的域名解析设置,但“启用内核 DNS”与“系统所有 DNS 请求都进入内核”是两件事。以下示例在本机 1053 端口启用 DNS 监听,使用 Fake-IP 模式,并指定一个普通 DNS 上游:
dns:
enable: true
listen: "127.0.0.1:1053"
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
fake-ip-filter:
- "*.lan"
- "localhost"
四个需要分清的字段
listen是内核接受 DNS 查询的地址与端口,不是上游服务器地址。普通系统 DNS 设置通常不能直接填写1053这样的自定义端口。nameserver是解析上游。示例使用普通 DNS,能否访问以及解析结果是否适合当前网络,需要结合实际环境判断。enhanced-mode: fake-ip让内核在适用情况下返回虚拟地址,并保存域名映射;这些地址不是网站真实的公网地址。fake-ip-filter指定不使用 Fake-IP 回答的域名范围,用于处理局域网名称或特定兼容性需求。
采用 TUN 时,还需要由客户端或配置中的 DNS 劫持、路由接管等设置把请求引入内核。仅写 dns.enable: true 不会自动修改系统路由;仅启用系统代理,也不能保证所有应用的 DNS 查询都由内核接管。应用自带的加密 DNS 还可能走自己的解析通道。
如果把上游改为带域名的 DoH 地址,例如 https://dns.alidns.com/dns-query,就要考虑上游域名本身如何解析。mihomo 的 default-nameserver 可用于这类引导解析;proxy-server-nameserver 则用于代理节点域名解析。不要把它们当成同义字段,也不要在不了解连接路径时同时叠加多层 DNS 转发。
proxies:节点定义与订阅边界
proxies 是节点对象组成的列表。每个节点通常包含 name、type、server、port,其余认证与传输字段取决于具体协议。节点的远端端口可以是 443 或其他服务端指定值,不能因为本地代理监听 7890 就把节点端口也改成 7890。
编辑节点时按字段来源检查
- 先确认
type与服务端协议一致。协议支持范围受内核版本影响,能导入文件不代表每种协议都能建立连接。 - 服务器地址、密码、UUID、加密方法等连接参数,应以服务提供方给出的配置为准,不能按字段名称猜测。
- 传输层、TLS 与证书名称需要和服务端保持一致。遇到证书错误时,应先核对域名和系统时间,而不是直接关闭证书验证。
name建议唯一。策略组按这个名字引用节点,重命名节点后要同步修改引用。
没有节点也可以写出合法配置:proxies: [] 表示空列表。它适合验证文件结构,但不会凭空产生代理出口。后面的完整示例采用空列表和 DIRECT,因此只用于检查配置加载与规则关系。
proxy-groups:名称引用与策略选择
策略组把节点、内置策略或其他策略组组织成一个可引用的出口。下面定义一个手动选择组,只有直连和拒绝两个内置成员,因此不依赖任何节点凭据:
proxy-groups:
- name: "出口选择"
type: select
proxies:
- DIRECT
- REJECT
type: select 表示手动选择成员。在客户端的代理页面选择 DIRECT 后,引用“出口选择”的规则会使用直连;选择 REJECT 后,对应连接会被拒绝。这不代表规则消失,而是同一个规则目标的实际行为随组内选择改变。
三类常见策略组
| 类型 | 用途 | 配置检查重点 |
|---|---|---|
select | 手动选择成员 | 成员存在,当前选择符合预期 |
url-test | 依据连通性测试结果自动选择 | 测试 URL、间隔与候选节点可用性 |
fallback | 按候选顺序选择可用成员 | 成员顺序与健康检查设置 |
自动测试结果反映的是到指定测试地址的测量,不等于所有网站的实际下载速度。只为理解结构时,先用 select 验证引用链更直接。需要嵌套策略组时,还应避免 A 引用 B、B 又引用 A 的循环依赖。
若配置使用 proxy-providers,策略组通常通过 use 引用提供者名称,而不是把提供者名称塞进 proxies 列表。两种字段指向的对象不同;出现“找不到代理”时,要先确认引用的是节点、策略组,还是节点提供者。
rules:先具体匹配,再放兜底
规则模式下,连接按列表顺序匹配,命中适用规则后采用该规则的目标。配置中的策略名称必须与前面定义的名称完全一致,包括大小写、空格和中文字符。以下四条规则分别处理局域网域名、示例域名、私有地址和其余连接:
rules:
- DOMAIN-SUFFIX,lan,DIRECT
- DOMAIN-SUFFIX,example.org,出口选择
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,出口选择
DOMAIN-SUFFIX,lan,DIRECT匹配lan及其子域名,不是任意包含“lan”的字符串。DOMAIN-SUFFIX,example.org,出口选择把示例域名及其子域名交给“出口选择”。example.org用于说明规则语法。IP-CIDR,192.168.0.0/16,DIRECT,no-resolve匹配这个私有 IPv4 网段,no-resolve表示不为了匹配该条规则而主动解析域名。MATCH,出口选择接收前面没有命中的连接,应放在列表末尾。
no-resolve 不是禁用整个配置的 DNS,也不是保证连接从未发生过解析。它只影响相关 IP 类规则是否主动触发解析。已有目标 IP 的连接仍然可以参与 IP 匹配。
若把 MATCH,DIRECT 放在第一行,后续规则就无法再处理已被它接收的连接。需要更细的域名例外时,应把例外放到更宽的后缀规则之前。使用 GEOIP、GEOSITE 或 RULE-SET 时,还要检查对应地理数据库或规则提供者是否可用,不能只复制一条规则而忽略数据来源。
完整结构:两空格缩进与最小配置
下面的配置不包含外部节点,默认将匹配流量交给只有 DIRECT 成员的策略组。它适合先验证 YAML 结构、监听端口与组名引用;它不是可直接获得远端代理能力的订阅,也没有启用 TUN。内核 DNS 监听在 127.0.0.1:1053,仍需额外的系统或客户端设置才能接收系统 DNS 查询。
mixed-port: 7890
allow-lan: false
bind-address: "127.0.0.1"
mode: rule
log-level: info
ipv6: false
dns:
enable: true
listen: "127.0.0.1:1053"
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
fake-ip-filter:
- "*.lan"
- "localhost"
proxies: []
proxy-groups:
- name: "出口选择"
type: select
proxies:
- DIRECT
rules:
- DOMAIN-SUFFIX,lan,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,出口选择
YAML 的四个高频错误
- 使用 Tab 缩进。统一用空格,上例每层增加两个空格;同级字段必须对齐。
- 把顶层字段缩进到上一段。
proxies、proxy-groups与rules都从行首开始,不能缩进到dns下面。 - 漏掉列表的短横线。
nameserver、策略组成员与规则都采用列表,每个独立条目以-开头。 - 重复定义同一个顶层键。不要在文件末尾再追加第二段
dns或第二个rules;应合并到原位置,避免不同解析器对重复键产生不同处理结果。
名称中有 #、冒号加空格等特殊内容时,应使用引号,防止被当成注释或映射语法。常见规则字符串不需要为了中文名称额外加引号,但使用规范的引号包裹整条字符串也可以。不要把网页里的全角冒号“:”当成 YAML 的半角冒号 :。
加载验证:从语法到实际连接
配置保存成功,只说明编辑器写入了文件;内核能加载,也只说明结构与必要字段通过了检查。节点是否能连接、DNS 是否走预期路径、应用是否使用代理,还需要分别验证。
建议按四步检查
- 备份当前可用文件,复制成单独的
config.yaml再编辑;每次只改一个配置段,便于回退。 - 使用当前实际运行的 mihomo 二进制执行配置测试。Linux 或 macOS 下,如果二进制在当前目录,可运行下面的命令。
- 在客户端重新加载或启用配置,查看日志是否出现端口占用、名称引用不存在、规则数据缺失等错误。
- 用明确指定代理的请求测试入口,再查看客户端连接记录中的规则与策略链,最后才验证系统代理或 TUN 的全局接管效果。
./mihomo -t -f ./config.yaml
curl --proxy http://127.0.0.1:7890 --head https://example.org/
如果配置依赖相对路径的规则文件、节点提供者或数据库,还要让测试使用与实际运行一致的工作目录;可以通过内核的 -d 参数指定配置工作目录。命令不存在时,应先核对二进制路径,而不是改 YAML 字段。上面的 curl 请求只验证所指定的 HTTP 代理入口与目标访问,不足以证明 UDP、系统 DNS 或 TUN 已经正常。