CONFIG.YAML · REFERENCE

Clash 配置文件
字段参考

从顶层 YAML 结构开始,逐项查阅端口、运行模式、DNS、代理节点、策略组、规则与 Provider。示例采用可解析的字段层级,适合核对现有配置,也适合定位导入失败、规则未命中与 DNS 异常。

YAML DNS PROXIES GROUPS RULES

本页定位是系统查阅手册,不替代首次安装流程。尚未完成客户端安装、订阅导入和系统代理开启时,先按使用文档走完最短主线;需要选择 Clash Plus、Clash Verge Rev、FlClash 或其他平台客户端时,前往安装包页面。当配置已经能够加载,但需要理解某个字段为何生效、如何组合或怎样排错时,再按下面目录定位到对应章节。

01 · DOCUMENT MODEL

YAML 结构与配置加载顺序

顶层字段不是执行步骤

Clash 配置文件通常命名为 config.yaml,内容由一组顶层键组成。常见顶层包括端口、运行模式、DNS、代理节点、策略组、规则以及外部 Provider。它们在文件中的先后位置主要服务于阅读,并不表示内核严格按照书写顺序逐行执行。解析器先读取完整 YAML,构建配置对象,再校验策略组引用、规则目标与 Provider 定义。因此,把 rules 写在 proxies 前面未必直接报错,但会明显降低人工检查效率。建议按“基础运行参数 → DNS → 节点 → 策略组 → Provider → 规则”的顺序组织。

YAML 使用缩进表达父子层级,不能用制表符代替空格。相同层级必须保持同样的缩进宽度,通常使用两个空格。列表项以连字符开头,连字符后的对象仍需遵守缩进。字符串大多可以不加引号,但值中含有冒号、井号、花括号、前后空格或容易被识别为布尔值的词时,使用引号更稳妥。例如节点名称写成 "HK: Premium",可以避免冒号被解释为键值分隔符;密码中包含 # 时也应加引号,否则井号之后可能被当作注释。

port: 7890
socks-port: 7891
allow-lan: false
mode: rule
log-level: info

dns:
  enable: true
  enhanced-mode: fake-ip

proxies:
  - name: "Example-SS"
    type: ss
    server: 203.0.113.10
    port: 443
    cipher: aes-128-gcm
    password: "your-password"

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "Example-SS"
      - DIRECT

rules:
  - MATCH,节点选择

标量、列表与映射的区别

mode: rule 是标量;rules 下的多行条目是列表;dns 下由多个键值对构成的是映射。配置错误经常来自三种结构混用。例如 nameserver 要求列表,如果写成单个未带连字符的字符串,某些内核会拒绝加载;proxy-groups 是对象列表,每一个策略组都需要自己的 nametype。遇到“字段类型不正确”时,不要只检查字段拼写,还要确认它应当是字符串、数字、布尔值、列表还是对象。

YAML 中的 truefalse 不应加引号,因为布尔值与字符串的语义不同。端口通常写成数字。域名、节点名、正则表达式和密码更适合按字符串处理。空值也需要谨慎:只有键而没有值,并不等同于空列表。需要显式清空某项时,覆写系统可能要求 []{},具体取决于目标字段类型。

引用关系与最终配置

策略组通过名称引用节点或其他策略组,规则末尾再引用策略组名称。名称是精确匹配的,空格、大小写和全角符号都属于名称的一部分。若规则写着 DOMAIN-SUFFIX,example.com,国外节点,但策略组实际名称是“境外节点”,内核无法自动推断两者等价。订阅更新后节点名称变化,也可能让手写策略组失去引用目标。

图形客户端展示的配置不一定就是内核最终读取的内容。订阅原文可能先经过客户端的全局覆写、脚本处理、代理组生成和字段兼容转换,再生成运行时配置。排查时应优先寻找“查看最终配置”“运行配置”或日志中的加载路径,而不是只看订阅编辑器。若客户端提供配置语法检查,应先解决解析错误,再观察规则与网络行为;一个缩进错误会阻止整个文件加载,后续网络测试没有参考价值。

02 · RUNTIME

端口、模式与通用字段

入站端口如何分工

port 是 HTTP 代理端口,socks-port 是 SOCKS5 代理端口,mixed-port 可在同一个端口接受 HTTP 与 SOCKS5 请求。桌面客户端通常只需要启用混合端口,便于系统代理和命令行工具共享同一入口。不要让多个字段使用同一个端口,也不要与其他代理软件、开发服务器或已启动的 Clash 实例冲突。端口冲突时,客户端界面可能仍然显示配置已导入,但日志会出现监听失败,系统代理随后指向一个没有正常工作的入口。

redir-porttproxy-port 与 TUN 入站面向透明代理场景,主要由路由器、Linux 网关或客户端自动管理。普通 macOS 与 Windows 用户不需要为了“覆盖更全面”同时手动开启所有端口。系统代理模式处理遵循系统代理设置的应用;TUN 模式通过虚拟网络接口接管更广范围的流量。两者可以由客户端按平台能力配置,但端口字段本身并不能替代 TUN 驱动与路由设置。

字段 用途 常见使用位置 检查重点
mixed-port 同时接受 HTTP 与 SOCKS5 桌面客户端、本机应用 避免与其他进程占用同一端口
port HTTP 代理入口 系统代理、浏览器、命令行 系统代理地址需与字段一致
socks-port SOCKS5 代理入口 开发工具与支持 SOCKS 的应用 应用侧协议类型不能选错
allow-lan 允许局域网设备访问入站 局域网共享代理 配合监听地址与系统防火墙

allow-lan 与监听范围

allow-lan: true 表示允许局域网访问,但是否真的能够从其他设备连接,还取决于 bind-address、操作系统防火墙、网络接口与路由器隔离策略。只在本机使用时保持关闭更容易控制暴露范围。需要共享时,应确认当前网络可信,并为外部控制接口设置认证。代理入站与控制接口是两类服务:开放代理端口不代表应该同时把控制 API 暴露到局域网。

external-controller 定义外部控制接口,例如 127.0.0.1:9090。图形面板通过它读取连接、切换策略和刷新配置。绑定到回环地址时只有本机可访问;绑定到所有接口前,需要理解 secret 的认证作用并检查防火墙。若界面可以启动但无法显示节点和连接,先核对控制地址是否被占用、客户端填写的控制端口是否一致,以及认证值是否匹配。

mixed-port: 7890
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
ipv6: false
external-controller: 127.0.0.1:9090
secret: "your-controller-secret"

运行模式、日志与 IPv6

mode 常见值为 ruleglobaldirect。规则模式按 rules 从上到下匹配;全局模式把流量交给全局策略;直连模式跳过代理。日常使用应以规则模式为主,全局模式适合临时判断“规则问题还是节点问题”,直连模式可用于确认应用自身网络是否正常。把全局模式当成长期配置,会绕过精细分流,也会掩盖规则编写错误。

log-level 可控制日志详细程度。正常运行使用 info 较合适,排查规则命中、DNS 或握手问题时可以临时调整到 debug。详细日志可能快速增长,也可能包含访问域名和节点名称,问题定位完成后应恢复常规级别。ipv6 决定内核是否启用相关解析与连接能力,但它不是单独的网络修复开关;本地网络、DNS 返回、代理节点与规则都需要同时支持。遇到 IPv6 路径不稳定时,可以先关闭进行对照测试,再决定是否长期调整。

配置修改后,要区分“保存成功”“重载成功”和“流量已经经过新配置”三个状态。部分客户端只保存文本,不会立即重载;部分客户端在语法错误时保留上一份可运行配置。最可靠的确认方式是查看重载日志、核对当前模式与端口,并发起一次可识别的访问观察规则命中。若端口设置仍不明确,可结合疑难解答中的系统代理与端口问题逐项检查。

03 · NAME RESOLUTION

Clash DNS、Fake-IP 与解析链路

DNS 模块处在什么位置

启用 Clash DNS 后,域名解析不再只是操作系统向某个服务器发送查询。内核可以根据规则选择上游、缓存结果,并在 Fake-IP 模式下维护域名与保留地址之间的映射。理解这一点有助于区分三类问题:上游 DNS 无法访问、域名被解析到不合适的地址,以及应用绕过 Clash 直接发起加密 DNS。代理连接正常但网页打不开时,不应直接把所有故障归因于节点;需要同时检查 DNS 监听、系统 DNS 指向和规则路径。

dns.enable 控制模块是否启用,listen 指定监听地址与端口。桌面图形客户端可能自动接管系统 DNS,此时手动修改监听端口会与客户端管理逻辑冲突。路由器或局域网服务场景才更常需要显式设置监听地址。若绑定到局域网接口,还要确认端口没有被系统解析服务占用,并控制可访问范围。

Fake-IP 与 Redir-Host

enhanced-mode: fake-ip 会先向应用返回一段保留地址,再由 Clash 根据映射恢复原始域名并执行规则匹配。它的优势是域名信息保留完整,规则判断及时,也减少等待真实地址解析后再转发的步骤。代价是少数依赖真实地址、局域网发现或特殊协议的应用可能不兼容,需要通过 fake-ip-filter 排除。redir-host 更接近传统的真实地址解析路径,兼容思路不同,但域名识别与连接链路也会受到系统缓存和解析时序影响。

fake-ip-range 用于指定保留地址范围。通常沿用客户端或内核默认值即可,不应与本地真实网段、VPN 地址池或企业网络路由重叠。若访问某个局域网域名后被返回保留地址,优先把该域名加入过滤列表,而不是随意更换整个地址段。过滤规则应尽量精确:单个主机写完整域名,需要覆盖子域时使用支持的通配形式,并在修改后清理应用与系统 DNS 缓存。

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "*.local"
    - "time.*.com"
  default-nameserver:
    - 223.5.5.5
    - 1.1.1.1
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://cloudflare-dns.com/dns-query
  proxy-server-nameserver:
    - https://dns.alidns.com/dns-query

三组上游字段如何配合

default-nameserver 主要用于解析加密 DNS 上游自身的域名,因此通常填写可直接访问的 IP 地址。若把所有项都写成域名,就可能形成“需要先解析 DNS 服务器域名,但当前尚无可用解析器”的循环。nameserver 是主要查询上游,可以使用普通 UDP、DoT 或 DoH 地址。proxy-server-nameserver 用于解析代理节点服务器域名,避免节点域名解析与代理链形成依赖。节点服务器已经是 IP 地址时,这一层的影响较小;节点服务器是域名时则非常关键。

nameserver-policy 可以按域名指定不同上游,适合企业内网域名、地域解析或需要独立处理的服务。它解决的是“查询交给谁”,不直接决定最终连接走哪个策略组。连接分流仍由规则负责。不要把 DNS policy 与代理 rule 混为一套语法,也不要仅凭解析结果判断代理是否生效。

dns:
  nameserver-policy:
    "geosite:cn":
      - https://dns.alidns.com/dns-query
    "internal.example":
      - 192.0.2.53
  fallback:
    - tls://1.1.1.1
  fallback-filter:
    geoip: true
    geoip-code: CN

DNS 排错应按链路进行

第一步确认 Clash DNS 是否实际监听,第二步确认系统或 TUN 流量是否被送到该监听点,第三步观察查询使用了哪个上游,最后再检查连接规则。只修改浏览器缓存或频繁切换节点,不能定位 DNS 层问题。日志中若出现上游超时,应测试该上游在当前网络下能否直连;若域名能解析但连接失败,应继续检查规则命中、IPv4 与 IPv6 选择、节点可用性。若只有个别应用异常,还要考虑该应用内置的 DoH、QUIC 或缓存机制。

04 · OUTBOUND

代理节点字段与协议参数

所有节点共有的识别字段

proxies 是代理节点对象列表。每个对象至少包含唯一的 name、协议 type、服务器 server 与端口 port,其余字段由协议决定。节点名称是配置内部引用键,不只是界面标签。两个节点使用同名会造成策略组引用含糊,订阅与本地节点重名也可能在合并时覆盖。建议名称同时体现地区、线路或用途,但不要把会频繁变化的状态写进名称。

server 可以是 IP 地址或域名。使用域名时需要保证前一章提到的节点域名解析链可用。端口是远端服务端口,不是本机 mixed-port。把两者混淆是手工录入时的常见错误。协议字段必须与服务端配置一致,不能通过试改加密方式或传输类型“自动探测”。认证失败、TLS 握手失败与网络超时代表不同阶段,应结合日志判断。

Shadowsocks 与 VMess 示例

Shadowsocks 节点主要关注加密方法与密码。cipher 必须是内核支持且与服务端相同的值。密码建议始终加引号,避免特殊字符被 YAML 解释。若服务端还使用插件,需要同时填写插件名称与选项,不能只复制服务器、端口和密码。插件参数通常是映射对象,层级错误会导致插件未加载或节点不可用。

proxies:
  - name: "SS-Example"
    type: ss
    server: 203.0.113.20
    port: 443
    cipher: aes-128-gcm
    password: "your-password"
    udp: true

  - name: "VMess-Example"
    type: vmess
    server: edge.example.com
    port: 443
    uuid: 00000000-0000-4000-8000-000000000000
    alterId: 0
    cipher: auto
    tls: true
    servername: edge.example.com
    network: ws
    ws-opts:
      path: /proxy
      headers:
        Host: edge.example.com

VMess 除身份字段外,还可能包含 TLS、WebSocket、HTTP 或 gRPC 等传输配置。servername 用于 TLS SNI,WebSocket 的 Host 属于 HTTP 请求头,两者可能相同,但语义不同。路径要保留开头斜线,并与服务端入口一致。旧配置中可能出现历史兼容字段,导入新内核前应以服务提供方给出的当前参数为准,而不是从其他协议模板中拼接。

Trojan、VLESS 与 TLS 相关字段

Trojan 通常使用密码认证并依赖 TLS;VLESS 使用 UUID,并可组合不同传输与流控。TLS 类节点最常见的故障是服务器地址、证书名称与 SNI 不一致。skip-cert-verify 会改变证书验证行为,不应作为长期修复手段。若证书校验失败,应先确认设备时间、服务端证书、域名和 servername。只有明确知道测试环境使用何种证书时,才适合临时调整并记录原因。

  - name: "Trojan-Example"
    type: trojan
    server: gateway.example.com
    port: 443
    password: "your-password"
    sni: gateway.example.com
    udp: true
    skip-cert-verify: false

  - name: "VLESS-Example"
    type: vless
    server: vless.example.com
    port: 443
    uuid: 00000000-0000-4000-8000-000000000001
    tls: true
    servername: vless.example.com
    network: grpc
    grpc-opts:
      grpc-service-name: proxy

UDP、接口与拨号行为

udp: true 表示节点允许转发 UDP,但服务端、协议、客户端模式和本地网络也必须支持。仅增加该字段不会让不支持 UDP 的线路获得相应能力。涉及游戏、语音或 DNS 时,可以从日志确认流量是否走 UDP,并检查策略组选中的节点是否具备支持。某些配置还提供 interface-namerouting-mark 或拨号相关字段,它们更适合多网卡与网关环境,桌面用户不应在不清楚接口名称的情况下照抄。

节点能通过延迟测试,只能说明特定测试 URL 在当时可以建立请求,不等于所有协议与站点都正常。测试地址、TLS 路径、丢包和带宽都会影响结果。可继续阅读Clash 延迟测试数字怎么看,再结合实际访问与日志判断。若需要更换客户端进行对照,本站下载清单保持 Clash Plus 为各平台首推,同时列出 Clash Verge Rev、FlClash、Clash Nyanpasu、ClashX Meta 等适用选项。

05 · POLICY

策略组字段与选择逻辑

select:明确的人工选择

策略组把节点、内置动作和其他策略组组织为规则可引用的出口。select 是最直接的类型,用户在客户端界面手动选择其中一项,选择结果通常由客户端持久化。它适合总入口、地区选择和需要固定线路的服务。组内的 proxies 按名称引用现有节点或策略组,也可以包含 DIRECTREJECT 等内置动作。被引用对象必须已经存在于最终配置中。

策略组可以嵌套,例如“节点选择”引用“香港自动”“日本自动”和“手动选择”。嵌套能减少规则重复,但层级过深会增加排错成本。判断某条连接最终走向时,需要从规则目标开始,依次展开每层策略组,直到具体节点或内置动作。命名应反映功能,不要让多个组都叫“自动选择”而无法区分测试范围。

url-testfallbackload-balance

url-test 定期请求指定 URL,根据测得结果选择符合条件的节点。interval 是测试周期,tolerance 用于减少延迟接近时的频繁切换。测试过于频繁会增加请求和电量消耗,测试间隔过长则不能及时反映线路变化。测试 URL 应稳定、响应体小,并能代表实际出口连通性。不要使用需要登录、重定向复杂或受地区限制明显的页面。

fallback 更强调可用性顺序:当前节点不可用时切换到后续可用项。load-balance 会按策略把连接分配到多个节点,适合明确理解会话一致性要求的场景。需要固定来源地址的登录、支付或长连接服务,不适合随意使用负载均衡。自动组的测试结果也不应被解释为真实浏览速度排名;它只对应测试地址与当次网络条件。

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "香港自动"
      - "手动选择"
      - DIRECT

  - name: "手动选择"
    type: select
    proxies:
      - "SS-Example"
      - "Trojan-Example"
      - "VLESS-Example"

  - name: "香港自动"
    type: url-test
    proxies:
      - "SS-Example"
      - "Trojan-Example"
    url: https://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50

通过 Provider 动态引入节点

节点来自订阅 Provider 时,策略组可以使用 use 引用 Provider 名称,不必把每个节点写进 proxies。部分内核还支持 filterexclude-filter 按名称筛选。筛选通常使用正则表达式,字符范围与括号必须正确转义。订阅命名不统一时,只靠“港”“HK”可能漏掉节点,也可能误选包含相同字符的说明项。应先查看实际节点名称,再建立过滤表达式。

proxy-groups:
  - name: "香港节点"
    type: select
    use:
      - provider-main
    filter: "(?i)香港|港|HK|Hong Kong"
    exclude-filter: "(?i)游戏|剩余|到期"

  - name: "故障切换"
    type: fallback
    use:
      - provider-main
    url: https://www.gstatic.com/generate_204
    interval: 600

健康检查与连接保持

Provider 的健康检查与策略组自身的 URL 测试可能同时存在。前者用于维护节点可用状态,后者用于组内选择;重复且高频的测试会产生不必要的请求。设计配置时应明确由哪一层负责检查,并合理设置周期。切换策略组不会保证已有连接立即迁移,浏览器连接池、QUIC 和长连接可能继续使用旧出口。验证切换结果时,可关闭原连接、重新发起请求,必要时清理应用连接池,而不是只看界面选项。

规则引用的策略组应长期存在。订阅更新可以改变节点列表,但不应随意改变规则目标组名称。一个稳定结构通常包含总入口、自动组、手动组、直连与拒绝处理,再按业务增加流媒体、即时通信或开发服务组。组越多并不代表分流越准确;只有规则确实引用且用途清楚的组才有维护价值。

06 · ROUTING

Clash 规则分流语法与优先级

规则从上到下首次命中

rules 是有序列表。连接信息满足某一条规则后,内核使用该条指定的策略,不再继续检查后面的普通规则。因此,具体规则应放在宽泛规则之前,兜底的 MATCH 必须位于末尾。例如先写 DOMAIN-SUFFIX,example.com,DIRECT,再写 MATCH,节点选择,目标域名会直连;顺序相反时,前面的 MATCH 会接住所有流量,后续规则永远没有机会执行。

一条典型规则由“规则类型、匹配内容、策略目标”组成,部分类型还可以附加参数。逗号是字段分隔符,策略组名称必须与配置完全一致。规则列表中的每一行都要作为 YAML 字符串条目出现。域名规则不应附带协议头、路径或端口;需要匹配 https://sub.example.com/path 时,应提取主机名,并选择完整域名、后缀或关键词规则。

域名、地址与进程规则

DOMAIN 精确匹配完整域名,DOMAIN-SUFFIX 匹配指定域及其子域,DOMAIN-KEYWORD 按域名中出现的关键词匹配。后缀规则通常比关键词规则可控。关键词过短会扩大命中范围,例如使用常见的两个字母可能误伤无关域名。需要覆盖一项服务时,先收集实际请求域名,再决定精确规则与后缀规则的组合。

IP-CIDRIP-CIDR6 按地址段匹配。域名连接是否进入地址规则,取决于解析流程和 no-resolve 参数。对不希望触发额外 DNS 解析的地址规则,可在支持的语法中使用 no-resolveGEOIP 按地址归属数据库分类,结果受数据库来源与更新状态影响,不应视为业务归属的绝对判断。PROCESS-NAMEPROCESS-PATH 等进程规则依赖操作系统与客户端权限,在移动端、沙盒环境或 TUN 实现中支持程度可能不同。

rules:
  - DOMAIN,api.example.com,节点选择
  - DOMAIN-SUFFIX,example.net,节点选择
  - DOMAIN-KEYWORD,cdn-example,节点选择
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - GEOIP,CN,DIRECT
  - MATCH,节点选择

规则集合与逻辑组合

大型规则不适合全部写在主配置中,可以通过 RULE-SET 引用规则 Provider。规则集合只保存匹配条件,主配置负责指定策略目标,从而让同一份集合在不同设备上选择不同出口。使用时要确认 Provider 的 behavior 与文件内容一致:domain 适合域名项,ipcidr 适合地址段,classical 支持完整经典规则。类型不匹配时,文件可能成功下载但无法按预期解析。

部分内核支持 ANDORNOT 等逻辑规则。它们适合表达“某进程访问某域名”之类的组合条件,但可读性和跨客户端兼容性低于基础规则。只有基础类型无法准确描述需求时才应引入,并在旁边记录用途。规则复杂度增加后,日志命中信息比肉眼推断更可靠。

rules:
  - RULE-SET,private,DIRECT
  - RULE-SET,applications,DIRECT
  - RULE-SET,streaming,媒体服务
  - RULE-SET,global,节点选择
  - GEOIP,CN,DIRECT
  - MATCH,节点选择

规则未命中的定位方法

先从连接日志获取实际域名、目标地址、进程和命中的规则,再回到配置检查。浏览器地址栏中的主域名不代表页面只访问这一项,脚本、图片、认证和接口可能分布在多个域名。若日志只显示 IP,需要检查 DNS 是否由 Clash 接管,或应用是否直接使用地址连接。若预期的规则位于 MATCH 后面,移动顺序即可解释问题;若规则目标组不存在,则需要修复引用。

规则分流的目标是稳定、可解释,而不是尽可能多。局域网与保留地址通常优先直连,明确的业务规则居中,地区地址规则靠后,MATCH 负责兜底。每次新增规则后应验证正向命中与反向影响:目标服务是否走到预期组,无关服务是否被过宽条件带走。出现连接代理后无法访问网页的综合问题时,可按逐项排查清单检查系统代理、端口、节点、DNS 与规则。

07 · EXTERNAL SOURCES

Proxy Provider 与规则集合

Provider 解决什么问题

proxy-providers 把外部节点来源与主配置分离。主配置保留策略组和规则结构,Provider 定期更新节点清单。这样可以在订阅变化时维持稳定的策略组名称,也便于让多个自动组引用同一份节点来源。Provider 名称是内部引用键,应保持稳定;更换订阅地址不需要同时修改所有策略组,只需更新对应 Provider 定义。

常见 type 包括 httpfile。HTTP 类型通过 URL 获取,文件类型读取本地路径。path 指定缓存或本地文件位置,多个 Provider 不应写入同一个路径。interval 控制远程更新周期,设置过短会频繁请求,设置过长则不能及时接收上游调整。客户端若有自己的订阅更新调度,还要确认它是否覆盖内核字段。

proxy-providers:
  provider-main:
    type: http
    url: "https://subscription.example/config.yaml"
    path: ./providers/provider-main.yaml
    interval: 21600
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 600

proxy-groups:
  - name: "订阅节点"
    type: select
    use:
      - provider-main

Provider 文件格式与健康检查

代理 Provider 返回内容应符合内核要求,通常包含以 proxies 为键的节点列表,而不是完整的主配置。把普通订阅链接、Base64 节点列表或完整配置直接当成 Provider 文件,不一定能被当前内核识别。格式转换应在可信且可控的环节完成,并检查节点字段是否在转换中丢失。关于订阅格式的差异,可继续阅读Clash 订阅与其他链接格式如何相互转换

health-check 定期验证 Provider 内节点。测试 URL 与周期的选择原则和自动策略组相同。健康检查失败不必然说明订阅下载失败:前者是节点测试,后者是 Provider 文件获取。日志中应区分 HTTP 更新状态、文件解析状态和节点测试结果。若更新后节点数量为零,先查看缓存文件是否实际写入,再核对格式与筛选表达式。

rule-providers 的行为类型

规则 Provider 通过 behavior 声明内容类型。domain 文件通常保存域名或域名集合,ipcidr 保存 IPv4 与 IPv6 地址段,classical 保存带类型的完整规则。format 可用于区分 YAML、文本或内核支持的二进制格式。引用时,主规则使用 Provider 名称并指定策略组,例如 RULE-SET,private,DIRECT。策略并不固化在 Provider 文件中,这正是外部规则可以复用的原因。

rule-providers:
  private:
    type: http
    behavior: domain
    format: yaml
    url: "https://rules.example/private.yaml"
    path: ./rules/private.yaml
    interval: 86400

  local-network:
    type: file
    behavior: ipcidr
    format: yaml
    path: ./rules/local-network.yaml

rules:
  - RULE-SET,private,DIRECT
  - RULE-SET,local-network,DIRECT,no-resolve
  - MATCH,节点选择

更新失败、缓存与回退

Provider 更新失败时,内核通常会尝试继续使用已有缓存,但具体行为取决于客户端与缓存是否完整。首次加载时没有缓存,远程地址不可访问会直接导致对应节点或规则缺失;已成功运行过的设备则可能继续使用旧文件。排查时要记录“从未下载成功”还是“之前可用、当前更新失败”,两者处理路径不同。

远程规则与节点来源应使用稳定的 HTTPS 地址。URL 中的查询参数可能包含订阅识别信息,不适合写入公开日志、截图或共享配置。需要分享配置结构时,应替换地址和认证内容,但保留字段层级。路径也要考虑客户端工作目录:相对路径由内核运行目录解析,不一定相对于用户看到的订阅文件。遇到找不到文件时,查看日志给出的绝对路径比反复修改 ./ 更有效。

多个 Provider 合并后,节点重名仍可能发生。策略组筛选只看最终名称,无法区分同名节点来自哪个来源。可以由客户端覆写为不同 Provider 增加前缀,或在订阅管理阶段统一命名。更系统的多配置管理方法可参考Profile 结构入门与多配置管理

08 · MAINTENANCE

配置覆写、合并与系统排错

为什么需要覆写层

订阅配置会在更新时被上游内容替换,直接编辑订阅正文容易丢失本地修改。覆写层用于把稳定的本机设置与远程配置分开,例如端口、DNS、策略组补充和规则前置。不同客户端对覆写的称呼可能是 Override、Mixin、Merge、扩展脚本或配置增强,合并语义也不完全相同。使用前必须确认它采用对象递归合并、数组替换、数组追加还是脚本处理。

映射字段通常可以按键覆盖,例如只修改 dns.enable 而保留其他 DNS 子项;数组字段则更容易产生差异。若 rules 被整体替换,原订阅规则会消失;若采用追加,本地规则可能被放在 MATCH 后面而永远不命中。策略组和节点也属于列表,按名称合并还是按位置合并会直接影响结果。因此,覆写完成后必须查看最终配置,而不是只确认覆写文本语法正确。

# 示例:概念性覆写内容,实际合并方式由客户端决定
mode: rule
log-level: info

dns:
  enable: true
  enhanced-mode: fake-ip

rules:
  - DOMAIN-SUFFIX,internal.example,DIRECT
  - DOMAIN-SUFFIX,example.net,节点选择
  - MATCH,节点选择

规则前置、追加与删除

本地规则通常需要放到订阅规则之前,特别是要覆盖宽泛规则时。支持 prepend 与 append 的客户端,应把精确例外放在 prepend,把真正的补充兜底放在 append。若客户端只支持替换整个数组,就要明确承担后续规则维护。删除某个远程规则通常不能靠增加一条相反规则“消除”,只能在它之前增加更精确的规则,或使用客户端提供的过滤脚本。

清空字段时要使用正确类型。清空列表一般写 [],清空映射一般写 {},删除键则取决于覆写实现。把字段写成 null 可能代表删除,也可能把空值传给内核并触发类型错误。对于不熟悉的合并器,先用一个无关紧要的小字段测试,比较合并前后结果,再处理完整规则与策略组。

从语法到网络的四层检查

第一层是 YAML 解析。检查缩进、冒号、列表符号、引号与字段类型。此层失败时,客户端通常报告行号,但实际原因可能位于上一行,例如引号未闭合。第二层是配置引用。检查策略组是否引用存在的节点或 Provider,规则目标是否存在,Provider 路径是否冲突。第三层是运行时监听。检查代理端口、控制端口、DNS 端口与 TUN 是否成功启动。第四层才是网络行为,包括节点握手、DNS 上游、规则命中和应用是否走系统代理。

现象 优先检查 下一步
配置无法导入 YAML 缩进、字段类型、引号 按日志行号向上检查相邻对象
配置加载但节点为空 Provider 下载、格式、筛选表达式 查看缓存文件与更新日志
系统代理开启后无法访问 监听端口、模式、节点、DNS 分别用直连、全局、规则模式对照
特定网站走错策略 实际域名、规则顺序、MATCH 位置 根据连接日志增加精确规则
切换节点后行为未变化 上层策略组与已有连接 展开组引用并重新建立连接

最小化配置定位法

复杂配置出现问题时,可以复制一份本地测试配置,只保留一个已知节点、一个 select 策略组、一条 MATCH 规则和必要的端口字段。先验证代理链路,再逐步加入 DNS、Provider 与规则集合。每加入一部分就重载并测试,故障首次出现的位置就是主要调查范围。这种方法比同时切换多个节点、DNS 与运行模式更慢一些,但结果可重复,也能避免偶然恢复后无法解释原因。

mixed-port: 7890
mode: rule
log-level: debug

proxies:
  - name: "Test-Node"
    type: ss
    server: 203.0.113.30
    port: 443
    cipher: aes-128-gcm
    password: "your-password"

proxy-groups:
  - name: "TEST"
    type: select
    proxies:
      - "Test-Node"
      - DIRECT

rules:
  - MATCH,TEST

测试完成后,再恢复常规日志级别,并把验证过的修改放回稳定覆写层。若问题只发生在某个平台,还要考虑系统代理实现、权限、TUN 驱动和应用网络栈差异。Windows 的完整安装与系统代理问题可参考Windows 安装 Clash 全流程;通用问题则可在疑难解答中按基础认知、安装配置、使用技巧和故障排查分类继续定位。

维护一份可长期更新的配置

稳定配置应把上游数据与本地意图分开:订阅或 Provider 管理节点,主配置管理策略组与规则,覆写层保存设备差异。为策略组使用稳定名称,为自定义规则记录原因,避免重复定义端口和 DNS。订阅更新后检查最终配置中的节点数量、策略组引用和 MATCH 位置;客户端升级后则重点检查字段兼容与覆写合并结果。

需要迁移设备时,不要只复制单个 YAML。还应记录 Provider 缓存是否可重新下载、客户端是否保存了策略选择、系统代理与 TUN 权限如何设置。配置文件描述的是内核行为,操作系统授权和客户端界面状态并不全部包含在其中。按这一边界维护,出现问题时才能判断应修改 YAML、客户端设置还是系统网络。

NEXT STEP

继续安装或完成首次配置

需要客户端安装包时按平台进入下载页;尚未完成订阅导入、节点选择与系统代理设置时,按快速上手主线操作。