Clash 配置文件 YAML 逐段拆解:从 mixed-port 到 rules
按顺序解析通用端口、dns、proxies、proxy-groups、rule-providers 与 rules 各段字段含义,附常见缩进错误示例。
1. 配置文件结构:先区分客户端设置与内核配置
Clash Verge Rev 使用的 mihomo 内核负责连接、DNS 与规则匹配。YAML 是配置的书写格式,不是代理协议。文件能够被 YAML 解析器读取,只代表语法成立;节点类型是否受支持、策略组名称是否存在,还需要内核检查。
阅读订阅配置时,可以按“入口端口 → DNS → 节点 → 策略组 → 规则集 → 匹配规则”的顺序看。实际运行并不是按文件从上到下执行:例如 rules 引用前面定义的策略组,策略组再引用节点。这些名称构成配置之间的关联。
mixed-port、mode等顶层字段决定本地入口和运行方式。dns是映射,内部继续包含开关、解析模式和上游服务器。proxies、proxy-groups、rules是列表,每个列表项使用短横线。rule-providers是按名称组织的映射,用来声明外部规则集。
2. mixed-port:定义应用连接的本地入口
mixed-port 在一个端口上同时接受 HTTP 与 SOCKS 代理连接。下面使用 7897 作为具体示例;它不是所有安装环境都固定使用的值。应以客户端当前显示的监听端口为准。
mixed-port: 7897
allow-lan: false
mode: rule
log-level: info
ipv6: false
| 字段 | 示例含义 | 检查重点 |
|---|---|---|
mixed-port: 7897 | 本地混合代理入口为 7897 | 手动设置代理的应用也要填写该端口 |
allow-lan: false | 不开放局域网设备接入 | 本机使用时通常保持关闭 |
mode: rule | 按规则选择出口 | 全局模式下不能用 rules 验证分流结果 |
log-level: info | 记录常规运行信息 | 排查时可临时改为 debug,结束后恢复 |
ipv6: false | 关闭内核的 IPv6 支持 | 不等于关闭操作系统的 IPv6 |
手动填写 HTTP 代理时,主机填 127.0.0.1、端口填 7897。如果客户端改成 7898,这些手动设置也要同步修改。系统代理由客户端管理时,应在应用配置后核对系统中的实际值。
混合端口不是 DNS 端口,也不是内核控制接口。不要把 external-controller 的地址填进浏览器代理设置。需要局域网共享时,还应检查监听地址、防火墙和访问认证,不能只把 allow-lan 改成 true 就认定设置完整。
3. dns:解析模式、上游服务器与流量接管
dns 控制内核自己的 DNS 模块。开启它不代表操作系统的全部 DNS 请求已经进入客户端;系统 DNS、应用内安全 DNS、TUN 的 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:
- https://1.1.1.1/dns-query
- https://1.0.0.1/dns-query
fake-ip 返回的是映射地址
fake-ip 会为域名分配映射用的地址,内核保留域名与该地址的对应关系,供后续连接处理。看到 198.18 开头的结果,不应立即判断解析被污染。示例中的地址段属于测试用途地址范围,不是远端网站的真实公网地址。
监听 1053 不会自动修改系统 DNS
listen: 127.0.0.1:1053 表示本机 DNS 服务监听在 1053 端口。普通系统 DNS 设置通常只接收服务器 IP,不提供自定义端口输入,因此不能简单填入 127.0.0.1 就期待它访问 1053。TUN 模式下,应结合客户端生成的 tun 与 dns-hijack 配置确认接管方式。
nameserver指定内核用于解析的上游;示例使用两个具体的 DoH 地址,能否连接取决于所在网络。- 使用域名形式的加密 DNS 地址时,可能还需要通过
default-nameserver解决上游服务器域名的引导解析。 - 个别设备或应用不兼容 fake-ip 时,可针对域名检查
fake-ip-filter,不要先把全部 DNS 逻辑一起关闭。
订阅已有完整 DNS 配置时,不建议直接用这一小段覆盖。原配置可能还包含节点域名解析、国内外解析策略或特定域名处理。排查时一次只改一项,保留修改前后的日志,才能判断变化来自哪里。
4. proxies 与 proxy-groups:节点参数和出口选择
proxies 定义单个节点的连接参数;proxy-groups 把节点组织为手动选择、测速选择或其他策略。节点名称不是说明文字,而是后续配置引用的标识,空格、大小写和字符都要一致。
下面只演示 Shadowsocks 节点的字段结构。192.0.2.10 是文档示例地址,example-only-not-a-secret 是演示密码,这段不能用于实际代理连接。真实服务器、端口、加密方式与密码必须来自服务提供方,不能自行猜测。
proxies:
- name: "演示节点"
type: ss
server: 192.0.2.10
port: 443
cipher: aes-128-gcm
password: "example-only-not-a-secret"
udp: true
proxy-groups:
- name: "手动选择"
type: select
proxies:
- "演示节点"
- DIRECT
select 与 url-test 不要混为一谈
select 表示手动选择成员;url-test 则会按配置的探测 URL 和间隔测试候选成员。测速结果主要反映该探测目标的连接表现,不能直接当成下载带宽,也不能保证所有网站都使用同一个最优出口。
DIRECT 是内置直连出口,不需要在 proxies 中另建节点。节点上的 udp: true 只是允许相应 UDP 能力,服务端支持、协议能力与本地接管方式仍需同时满足。
5. rule-providers:把规则内容拆到独立文件
rule-providers 声明规则集的来源、格式和行为,但声明本身不会让规则生效。还要在 rules 中使用 RULE-SET 引用规则集名称,并指定命中后的出口。
以下采用本地文件示例,避免把一个演示网址误当成可用规则源。应先在内核允许的配置目录下准备 rules/local-direct.yaml,再加载主配置;相对路径按内核工作目录及其路径限制解析,不按浏览器或文章的位置解析。
rule-providers:
local-direct:
type: file
behavior: domain
format: yaml
path: ./rules/local-direct.yaml
这个规则文件的完整内容可以写成:
payload:
- "example.com"
- "+.example.org"
example.com 用来演示单个域名;+.example.org 用来演示该域名及其子域名。这里的两个域名都是文档示例对象,不代表实际业务所需的分流清单。
behavior: domain:规则内容是域名匹配项,不要写成完整的DOMAIN-SUFFIX,...规则。behavior: ipcidr:规则内容是 IP 网段,例如192.0.2.0/24。behavior: classical:可使用DOMAIN-SUFFIX等经典规则表达式,规则集中的条目通常不附带出口名称,由引用处指定。
改成 type: http 时,需要填写真实可访问的 url,并设置缓存路径;例如 interval: 86400 表示更新间隔为 86400 秒,即 24 小时。下载失败、文件格式不符和规则未被引用是三种不同问题,应分别检查日志、文件内容与主配置。
6. rules:按顺序匹配,最后设置兜底出口
规则模式下,rules 按列表顺序匹配,一般由第一条命中的规则决定出口。特例放前面,范围较大的规则放后面,MATCH 放最后。它不是“所有规则都匹配完再挑最合适的一条”。
rules:
- DOMAIN,example.com,DIRECT
- DOMAIN-SUFFIX,example.net,手动选择
- RULE-SET,local-direct,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,手动选择
这一段依赖前文已经定义的 手动选择 策略组和 local-direct 规则集,不能单独作为完整配置导入。DOMAIN 匹配指定域名,DOMAIN-SUFFIX 匹配该域名及其子域名;二者不要仅凭名称相似就互换。
no-resolve 不是关闭全部 DNS
IP 类规则可能为了匹配域名请求而触发解析。示例中的 no-resolve 表示不要仅为这条规则主动发起域名解析;如果请求本来就是 IP,或已有可用解析结果,仍可参与匹配。它不会关闭 DNS 模块,也不保证请求永远不会被其他步骤解析。
MATCH 放在前面会截断后面的规则
如果第一条就是 MATCH,DIRECT,后面的域名代理规则便没有机会命中。排查“规则写了却不生效”时,先到客户端「连接」页查看新连接的规则与出口,再检查前面是否存在覆盖范围更大的条目。修改后用新连接验证,已经建立的长连接不会因为规则变动就自动变成另一条连接。
7. YAML 缩进错误:能解析与能运行要分开检查
建议每层使用两个空格,不使用 Tab。YAML 的层级由缩进决定,冒号后通常需要空格,列表项前使用短横线加空格。配置报错显示的行号可能是解析器发现异常的位置,真正的问题也可能在上一行。
错误一:字段缩进到了父级
下面的 enable 没有归到 dns 下。它可能仍是合法 YAML,却不是预期的内核配置结构。
# 错误:enable 成了顶层字段
dns:
enable: true
# 正确
dns:
enable: true
错误二:列表成员与所属字段没有形成层级
# 错误:DIRECT 与 proxies 同级
proxy-groups:
- name: "手动选择"
type: select
proxies:
DIRECT
# 正确
proxy-groups:
- name: "手动选择"
type: select
proxies:
- DIRECT
错误三:特殊字符和重复键导致内容变化
包含 : 或空格加 # 的密码、名称,宜用引号包住。例如 name: "线路: A #1" 可以明确保留整段文本。不要在同一层写两个 dns: 或两个 rules: 期待自动合并:解析器可能报错,也可能只保留其中一个,均不适合当作覆写方法。
“找不到策略组”“规则集不存在”通常属于引用错误,而不是缩进错误。应逐字核对节点名、策略组名、规则集名;不要只盯着报错行反复增减空格。
8. 配置应用检查:按入口、解析、出口、规则验证
不要把上文所有片段直接拼成生产配置。它们分别说明结构,其中节点使用文档地址,规则集需要先创建本地文件。实际修改应以当前可用订阅为底稿,一次改变一个目标字段。
- 保留基线。备份当前配置,记录混合端口、运行模式和所选策略组成员。确认「配置」页启用的是刚刚编辑的项目。
- 检查加载。应用修改后进入「日志」页,先处理解析错误和名称引用错误。配置未成功加载时,不要继续用访问结果判断新规则。
- 核对入口。确认实际监听端口为预期的
7897或修改后的数值。应用没有遵循系统代理时,再判断是否需要手动代理或 TUN 接管。 - 核对解析。区分 DNS 超时、节点域名解析失败与目标域名解析失败。启用 fake-ip 时,映射地址本身不是失败证据。
- 核对出口。在「代理」页确认策略组实际选择的成员,再在「连接」页查看新请求命中的规则及出口链路。
- 验证持久化。更新一次订阅或重新加载配置,确认定制内容仍然存在;若被覆盖,将定制迁移到合适的覆写入口。
需要查看更完整的字段关联,可继续阅读进阶配置;对混合端口、策略组和 TUN 的含义还不熟悉时,先查阅术语手册。先确认请求进入客户端,再验证 DNS 与规则,比同时替换整份 YAML 更容易定位问题。