进阶配置 预计阅读 12 分钟

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. 配置应用检查:按入口、解析、出口、规则验证

不要把上文所有片段直接拼成生产配置。它们分别说明结构,其中节点使用文档地址,规则集需要先创建本地文件。实际修改应以当前可用订阅为底稿,一次改变一个目标字段。

  1. 保留基线。备份当前配置,记录混合端口、运行模式和所选策略组成员。确认「配置」页启用的是刚刚编辑的项目。
  2. 检查加载。应用修改后进入「日志」页,先处理解析错误和名称引用错误。配置未成功加载时,不要继续用访问结果判断新规则。
  3. 核对入口。确认实际监听端口为预期的 7897 或修改后的数值。应用没有遵循系统代理时,再判断是否需要手动代理或 TUN 接管。
  4. 核对解析。区分 DNS 超时、节点域名解析失败与目标域名解析失败。启用 fake-ip 时,映射地址本身不是失败证据。
  5. 核对出口。在「代理」页确认策略组实际选择的成员,再在「连接」页查看新请求命中的规则及出口链路。
  6. 验证持久化。更新一次订阅或重新加载配置,确认定制内容仍然存在;若被覆盖,将定制迁移到合适的覆写入口。

需要查看更完整的字段关联,可继续阅读进阶配置;对混合端口、策略组和 TUN 的含义还不熟悉时,先查阅术语手册。先确认请求进入客户端,再验证 DNS 与规则,比同时替换整份 YAML 更容易定位问题。

Clash 客户端下载