配置文件的本质:一份 YAML 文本
Clash 与 mihomo(Clash Meta)内核的全部行为,都由一份 YAML 格式的配置文件决定。订阅链接下载到本地的文件,本质上就是服务方预先写好的一份 YAML;客户端界面上的模式切换、节点选择,最终也都落在这份文件的字段上。看懂结构之后,换端口、加规则、调 DNS,都只是找到对应段落改几行的事。
YAML 语法只需记住三条:缩进只用空格、禁用 Tab,层级通常缩进两格;键与值用英文冒号分隔,冒号后面必须跟一个空格;短横线开头的是列表项,# 之后的内容是注释。整份配置由若干顶层字段拼成,常见字段与职责如下。
| 顶层字段 | 作用 |
|---|---|
| mixed-port | 混合代理端口,HTTP 与 SOCKS5 请求共用 |
| allow-lan | 是否允许局域网内其他设备接入 |
| mode | 工作模式:rule 规则 / global 全局 / direct 直连 |
| log-level | 日志输出的详细程度 |
| external-controller | 内核 API 监听地址,网页面板由此通信 |
| dns | 内置 DNS 解析设置 |
| proxies | 代理节点列表 |
| proxy-groups | 代理组,客户端界面上切换的对象 |
| rules | 分流规则,自上而下逐条匹配 |
| tun | TUN 虚拟网卡模式(仅 mihomo) |
其中 proxies、proxy-groups、rules 三段决定流量怎么走,是本文重点;dns 段决定域名如何解析;其余字段控制端口与运行行为。下面逐段展开。
端口与全局字段:mixed-port 到 external-controller
mixed-port: 7890
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
mixed-port 是混合端口,HTTP 与 SOCKS5 请求都从这里进入内核,绝大多数客户端与订阅默认使用 7890。旧配置里分开写的 port(HTTP 专用)与 socks-port 仍然有效,新配置保留一个 mixed-port 即可。
allow-lan:设为 true 后,同一局域网的手机、平板可以把本机当作代理网关;bind-address控制监听哪块网卡。公共网络环境下保持 false。mode:rule 按 rules 段分流;global 所有流量走选定代理组;direct 全部直连。客户端界面上的模式切换,改的就是这一项。log-level:日常 info 足够;排查连接问题时临时调成 debug;silent 则完全不输出。external-controller:内核的 RESTful API 监听地址,metacubexd、yacd 等网页面板通过它读取状态、切换节点;另起一行写secret可以设置访问密钥,避免端口暴露后被随意控制。
mihomo 配置里还常见 unified-delay、tcp-concurrent、find-process-mode 等扩展字段,这些是 Meta 内核专有;原版 Clash 读到不认识的键会直接报错,混用内核时需要留意。
dns 段:域名怎么解析
dns:
enable: true
listen: 0.0.0.0:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- tls://1.1.1.1
- https://dns.google/dns-query
fake-ip-filter:
- "*.lan"
- "*.local"
enable 是总开关,使用 TUN 模式时必须开启;listen 是内置 DNS 服务的监听地址,系统把域名查询发到这里,由内核按配置向上游转发。
enhanced-mode:fake-ip 模式下内核先返回一个假 IP,等连接建立后再按域名分流,速度快、判断准;redir-host 是旧模式,新内核已逐步弃用,保持 fake-ip 即可。fake-ip-range:假 IP 地址池,默认 198.18.0.1/16,一般不需要改动。nameserver:默认上游解析器,支持三种写法——纯 IP 走 UDP,tls://开头走 DoT,https://开头走 DoH。fallback:解析海外域名的上游,属旧版写法;mihomo 更推荐nameserver-policy,可以按域名后缀分组指定不同上游。fake-ip-filter:名单内的域名不返回假 IP,局域网主机名、部分扫码登录域名常放在这里。
什么时候生效
dns 段只在内核接管流量时起作用。纯系统代理模式下,浏览器自行解析域名,dns 段不参与;TUN 模式下所有查询都经过内核,这一段的配置才真正生效。
proxies 段:每个短横线就是一个节点
proxies:
- name: "香港 01"
type: ss
server: hk1.example.com
port: 8388
cipher: aes-128-gcm
password: "example-password"
udp: true
- name: "日本 01"
type: vmess
server: jp1.example.com
port: 443
uuid: 00000000-0000-0000-0000-000000000000
alterId: 0
cipher: auto
tls: true
network: ws
proxies 是节点列表,每个短横线条目代表一个节点。name 是显示名,type 是协议,server 与 port 是服务器地址,其余字段由协议决定:ss 需要 cipher 与 password;vmess 需要 uuid、alterId 与 cipher;vless 需要 uuid;trojan 需要 password 与 sni;hysteria2 需要 password。udp: true 表示允许转发 UDP 流量。
mihomo 支持的协议比原版 Clash 多:原版有 ss、ssr、vmess、trojan、snell 等,Meta 内核增加了 vless、hysteria、hysteria2、tuic 等。这一段几乎总是由订阅自动生成,手动修改之前先确认一件事:下次更新订阅时,手改的内容会被覆盖。
proxy-groups 段:界面上切换的对象
proxy-groups:
- name: "自动选择"
type: url-test
proxies:
- "香港 01"
- "日本 01"
url: "http://www.gstatic.com/generate_204"
interval: 300
tolerance: 50
- name: "手动选择"
type: select
proxies:
- "自动选择"
- "香港 01"
- "日本 01"
- DIRECT
客户端界面上点选的从来不是单个节点,而是代理组。type 有四种:select 手动选择;url-test 按延迟自动选最快;fallback 按可用性依次切换;load-balance 在多个节点之间分摊连接。
url:延迟测试的目标地址,常用 http://www.gstatic.com/generate_204。interval:自动测速间隔,单位秒,300 即每五分钟测一次。tolerance:容差,单位毫秒;新测出的节点延迟比当前节点低出这个数值才切换,避免来回跳动。
组的 proxies 列表里既可以写节点名,也可以写另一个组名,形成「手动选择 → 自动选择 → 若干节点」的嵌套;还可以写 DIRECT 与 REJECT 两个内置策略。规则段引用的是组名,节点随订阅更新更换,组结构保持不变。
rules 段:自上而下,命中即停
rules:
- DOMAIN-SUFFIX,ads.example.com,REJECT
- DOMAIN-KEYWORD,bilibili,DIRECT
- GEOSITE,cn,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,手动选择
规则从上到下逐条匹配,命中即停止,顺序就是优先级;写在最后的 MATCH 是兜底,接住所有没被前面规则命中的流量。每条规则是三段结构:类型、匹配值、策略目标。策略目标可以是代理组名、节点名,也可以是 DIRECT(直连)或 REJECT(拒绝)。
| 规则类型 | 匹配对象 | 示例 |
|---|---|---|
| DOMAIN | 完整域名 | DOMAIN,www.example.com,PROXY |
| DOMAIN-SUFFIX | 域名后缀 | DOMAIN-SUFFIX,google.com,PROXY |
| DOMAIN-KEYWORD | 域名关键词 | DOMAIN-KEYWORD,bilibili,DIRECT |
| GEOSITE | 域名分类库(仅 mihomo) | GEOSITE,cn,DIRECT |
| IP-CIDR | 目标 IP 段 | IP-CIDR,10.0.0.0/8,DIRECT,no-resolve |
| GEOIP | IP 归属地 | GEOIP,CN,DIRECT |
| DST-PORT | 目标端口 | DST-PORT,443,PROXY |
| PROCESS-NAME | 进程名 | PROCESS-NAME,telegram.exe,PROXY |
| MATCH | 兜底,匹配全部 | MATCH,PROXY |
两点容易出错。其一,IP-CIDR 与 GEOIP 这类按 IP 判断的规则,对域名请求会触发一次 DNS 解析;加上 no-resolve 参数可以避免提前解析,把判断留给后面的域名规则。其二,GEOSITE 只有 mihomo 支持,依赖 geosite 数据文件,原版 Clash 读到会直接报错;GEOIP 则两个内核都支持,数据文件格式随内核不同。
修改后的生效方式与常见报错
桌面客户端改完配置后,在配置页面点重载即可,mihomo 支持热重载,不必重启程序;命令行运行的 mihomo 可以通过 API 提交新配置完成更新。
YAML 报错高发区
缩进里混入了 Tab;冒号打成中文全角「:」;冒号后漏了空格;列表项缩进与上一项不齐;节点名里带冒号或特殊符号却没加引号。客户端启动失败提示「yaml: line xx」时,按行号回去检查这几项,绝大多数问题出在这里。
另外两类常见问题:一是端口冲突,7890 被其他程序占用时内核启动失败,换掉 mixed-port 或结束占用进程;二是改了 rules 却不生效,多半是前面有更宽的规则先命中,把 log-level 调成 debug,日志里的规则匹配记录会显示每条流量实际命中了哪一条。
配置文件的结构就这几段:端口字段决定入口,dns 决定解析,proxies 是节点清单,proxy-groups 是选择开关,rules 是调度表。按这个顺序读一遍自己的订阅配置,每一行都能对上号。