进阶配置 预计阅读 13 分钟

Clash 配置文件 YAML 结构逐段解析:从基础字段到 proxy-groups 与 rules

逐段拆解一份完整 config.yaml,说明顶层字段、dns、proxies、proxy-groups、rule-providers 与 rules 各自的作用和书写顺序。

先区分 YAML 文件、订阅与内核配置

config.yaml 是配置文件的常见名称,扩展名也可以是 .yml。YAML 负责表达键值、列表和层级;Clash 或 mihomo 负责解释这些字段。一个文件能被 YAML 解析器读取,不代表其中的节点协议、DNS 参数和规则类型都受当前内核支持。

Clash Meta 后续以 mihomo 名称维护。不同客户端封装的内核与设置入口并不完全相同。本文以 mihomo 配置结构为主,其中内联规则集等功能不应直接套用到旧版 Clash 内核。排查兼容性时,应先在客户端的关于或内核信息页面确认实际运行的内核,而不是只看客户端名称。

  • 完整配置订阅:可能同时包含端口、DNS、节点、策略组和规则,更新后这些内容也可能改变。
  • 节点提供者:通过 proxy-providers 提供节点,由本地策略组引用,不等同于一份完整配置。
  • 客户端覆写:在订阅内容之外合并或替换字段,具体合并顺序由客户端决定。

一份可以校验结构的完整 config.yaml

下面的配置只提供本地混合端口和直连策略,不包含代理服务器。它适合用来检查字段层级、策略引用和规则顺序;载入成功不代表已经具备代理出口。示例中的内联规则集需要使用支持 type: inline 的 mihomo 内核。

# 基础入口
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

# DNS 模块;未设置独立 DNS 监听端口
dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - '*.lan'
    - 'localhost'
  nameserver:
    - 223.5.5.5
    - 1.1.1.1

# 当前不包含远程代理节点
proxies: []

# 策略组名称供 rules 引用
proxy-groups:
  - name: 出口选择
    type: select
    proxies:
      - DIRECT

# 内联规则集,不需要额外的规则文件
rule-providers:
  示例域名:
    type: inline
    behavior: domain
    payload:
      - '+.example.com'

# 从上到下匹配,最后一条兜底
rules:
  - DOMAIN,localhost,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - RULE-SET,示例域名,出口选择
  - MATCH,出口选择

这份文件没有启用系统代理,也没有启用 TUN。手动将应用的 HTTP 代理设为 127.0.0.1:7890,才会把该应用的相应请求送入混合端口。连接进入内核后,规则选择“出口选择”,该组当前只有 DIRECT,所以仍然直接访问目标。

书写顺序与执行顺序不是一回事

顶层先写 dns 还是先写 proxies,通常不影响配置含义;按“入口 → DNS → 节点 → 策略组 → 规则集 → 规则”排列,是为了便于检查依赖。真正会改变匹配结果的是 rules 列表的顺序。策略组中候选项的顺序也会影响界面排列,不能把所有列表都当成可随意排序的字典。

基础字段:端口、运行模式与日志

字段示例值实际作用
mixed-port7890在同一端口接收 HTTP 与 SOCKS 代理连接。
allow-lanfalse不允许其他局域网设备使用本机代理入口。
moderule由规则列表决定连接使用的策略。
log-levelinfo输出常规运行信息;排障时可临时切换为 debug。
ipv6false关闭内核相应的 IPv6 支持;并非修改操作系统网络设置。

mixed-port: 7890 不意味着系统里的全部流量都会进入 Clash。系统代理只影响遵守该设置的应用;自行连接网络的程序可能绕过它。TUN 则通过虚拟网卡与路由接管连接,两者属于不同的流量入口。

external-controller 是管理 API 的监听地址,不是给浏览器填写的代理地址。例如本地管理端口可设为 127.0.0.1:9090,但不能与混合端口同时占用同一地址上的 7890。客户端可能自行管理控制接口,手动覆盖前要先确认其要求。

dns:解析模式、上游与 Fake-IP 的关系

dns 是一个顶层映射,内部的 enable、nameserver 等字段必须比 dns: 多缩进一级。示例中的 nameserver 提供两个上游 DNS 地址;填写两个地址不表示一定按第一、第二的顺序逐个回退,实际查询行为由内核实现和其他 DNS 参数共同决定。

Fake-IP 不是代理节点地址

enhanced-mode: fake-ip 让内核为适用的域名查询分配合成地址,再借助映射关联后续连接。示例地址池 198.18.0.1/16 不是远端服务器地址,也不应写进节点的 server 字段。某些需要真实解析结果的局域网应用,可按需求加入 fake-ip-filter。

  • dns.enable: true 开启内核 DNS 模块,不等于操作系统已把所有 DNS 请求交给它。
  • dns.listen 用来开放独立的 DNS 监听入口;示例没有设置,避免额外占用端口。
  • dns.ipv6: false 控制内核 DNS 对 AAAA 查询的相应处理,不能据此认定系统完全不会发起 IPv6 连接。
  • 加密 DNS 保护的是相应解析链路,不会自动替代代理规则,也不能保证所有 DNS 请求都经过代理出口。

出现“域名打不开,直接访问 IP 可以”的现象时,先检查 DNS 查询是否进入内核、上游是否可达,再看 Fake-IP 映射与路由。此时反复切换节点,可能没有触及真正的故障点。

proxies 与 proxy-groups:节点和选择逻辑分开写

proxies 是节点列表。每个节点通常包含 name、type、server、port,以及对应协议要求的认证和传输参数。不同协议的字段不能互换:例如密码类字段不能替代另一个协议要求的 UUID。实际值应来自服务提供方或自建服务配置。

proxy-groups 不定义远端服务器,而是定义如何选择出口。组内的 proxies 虽然与顶层字段同名,在这里却只是候选名称列表。名称必须对应一个已定义节点、其他可引用策略组,或 DIRECT 等内置策略。

常见策略组类型

  • select:在客户端手动选一个候选项,适合明确指定节点或直连。
  • url-test:依据指定测试地址的探测结果自动选择候选项;测试延迟不等于所有网站的实际加载速度。
  • fallback:按照候选顺序与健康检查结果选择可用项,适合主备切换。
  • load-balance:依据配置的分配策略处理连接,不代表把一条下载连接拆到多个节点叠加带宽。

示例使用 select,因此不需要探测 URL。若换成自动测试类策略组,还要提供适合当前网络的测试地址和检查间隔,例如 interval: 300 表示 300 秒。不能只改 type,却遗漏该类型运行所需的参数。

订阅节点放进 proxy-providers 时怎么引用

使用节点提供者后,策略组通常通过 use 引用提供者名称,而不是把订阅 URL 填到组内的 proxies 列表。提供者返回的内容也需要满足对应格式,普通完整配置订阅不一定能直接当作节点提供者使用。规则指向策略组,策略组再选择节点,这条引用链应保持清楚。

rule-providers 与 rules:集合内容和匹配入口

rule-providers 保存可复用的规则集合;rules 决定何时引用集合,以及匹配后走哪个策略。只定义名为“示例域名”的规则集,却没有写 RULE-SET,示例域名,出口选择,不会让它自动参与分流。

behavior 决定 payload 应该写什么

behavior内容示例注意事项
domain+.example.com使用域名规则集语法,不在每行添加目标策略组。
ipcidr192.168.0.0/16内容是 IP 网段,不应混入域名。
classicalDOMAIN-SUFFIX,example.com采用规则表达式,目标策略由引用处指定。

示例使用 type: inline,集合内容直接位于 payload 下。远程 HTTP 规则提供者还涉及下载地址、缓存路径、更新间隔和格式;不能把远程文件的正文直接复制到 URL 字段里。旧内核不支持内联提供者时,可在确认语义一致后改写为普通规则。

从上到下,首次匹配生效

例如,希望示例域名走“出口选择”,其余连接直连,可以写成:

rules:
  - DOMAIN-SUFFIX,example.com,出口选择
  - MATCH,DIRECT

DOMAIN 匹配完整域名;DOMAIN-SUFFIX 匹配该域名及其子域名。MATCH 是兜底规则,通常放在最后。若把它移到第一行,后面的域名规则就没有匹配机会。新增规则时,应修改原有列表,而不是在文件末尾再追加第二个 rules:。

IP 规则末尾的 no-resolve 表示不为了匹配该条 IP 规则主动把域名解析成 IP;它不表示全局禁用 DNS。连接本身已经具有目标 IP 时,仍可能参与对应的网段匹配。示例只列了部分本地地址范围,不应把这三条视为完整的内网规则集。

TUN 配置放在哪里,为什么不能只开一个开关

tun 与 dns、rules 同属顶层字段,不能缩进到某个策略组内部。桌面端常见的配置片段如下,实际支持情况还取决于内核、操作系统与客户端接管方式:

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

auto-route 用于自动配置相关路由,auto-detect-interface 用于自动识别出口接口。启用 TUN 通常需要管理员权限或客户端的服务模式;Android 客户端则常通过系统 VpnService 建立 VPN 接口,不应照搬桌面端的权限处理步骤。

dns-hijack 中的 any:53 用于劫持适用的传统 DNS 流量,并不覆盖浏览器通过 HTTPS 发出的全部加密 DNS 请求。公司 VPN、其他虚拟网卡和手动路由也可能与自动路由冲突。建议先在系统代理入口验证配置可用,再启用 TUN,避免同时更改入口、DNS 与规则而失去排查依据。

加载前检查:缩进、引用和客户端覆盖

YAML 层面的常见错误

  • 使用 Tab 缩进:统一改为两个空格;同一层级必须对齐。
  • 漏写列表短横线:rules、nameserver 和组内候选项都是列表。
  • 重复顶层字段:两个 dns: 不代表自动合并,解析器可能报错或保留其中一个。
  • 特殊字符未加引号:密码、带特殊符号的名称以及可能被误解为其他类型的值,宜用引号包裹。
  • 大小写或名称不同:出口选择 与 出口选择 不是可靠的同一引用;复制时检查尾部空格。

用内核检查,再看实际生效结果

如果已安装 mihomo 命令行程序,可在配置所在目录执行:

mihomo -t -f ./config.yaml

Windows 下可使用 .\mihomo.exe -t -f .\config.yaml,前提是当前目录存在该程序。测试通过说明配置能够通过相应内核的检查,不代表节点认证正确、网络可达或系统流量已经进入代理。

  1. 先运行配置测试,优先处理日志指出的行号、未知字段和策略引用错误。
  2. 在客户端载入配置,确认混合端口确实是 7890,且没有端口占用报错。
  3. 使用已配置代理的应用发起请求,在连接列表中检查命中的规则和最终策略。
  4. 若文件写了 mode: rule,界面却显示其他模式,检查客户端全局设置或运行时 API 是否覆盖了文件值。
  5. 最后更新一次订阅,检查自定义规则是否仍然存在,确认持久修改确实写在覆写层。
下载Clash