Clash YAML
配置文件参考
从顶层结构开始,逐项查阅端口、运行模式、DNS、代理节点、策略组、分流规则与覆写合并。示例采用 mihomo 兼容语法,并说明字段之间的依赖关系和常见边界。
YAML 结构总览与缩进规则
从顶层键理解配置加载顺序
一份可运行的 Clash 配置通常由通用设置、DNS、代理节点、代理提供者、策略组、规则提供者和规则列表组成。它们都位于 YAML 顶层,彼此通过名称引用。内核读取文件时会先解析 YAML 语法,再建立节点与策略组,最后检查规则目标是否存在。配置顺序通常不影响解析,但按“基础设置、DNS、节点、策略组、规则”的次序排列,更便于人工检查,也能减少引用尚未定义对象时产生的阅读困难。
最小配置不等于只有一个端口。若规则模式被启用,至少还要有可用的策略目标与末尾规则;若策略组引用了节点名称,该节点必须存在;若规则使用 RULE-SET,对应的 rule-providers 项也必须存在。订阅生成器往往会补齐这些模块,但手工配置时需要自行保证引用闭合。名称区分大小写,中文、空格和符号虽然可以使用,却应保持稳定,避免覆写脚本在字符串匹配时找不到目标。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- https://dns.example/dns-query
proxies:
- name: "演示节点"
type: ss
server: proxy.example.com
port: 443
cipher: aes-128-gcm
password: "your-password"
proxy-groups:
- name: "节点选择"
type: select
proxies:
- "演示节点"
- DIRECT
rules:
- DOMAIN-SUFFIX,example.com,节点选择
- MATCH,DIRECT
缩进、列表与数据类型
YAML 用空格表达层级,推荐每层两个空格,禁止用制表符混入缩进。同级键必须对齐,列表项使用短横线加空格。上例中的 dns 是映射,nameserver 是列表,proxies 是由多个节点映射组成的列表。一个多出的空格可能把字段移入错误对象,一个少掉的短横线则可能把列表变成普通字符串。编辑器若支持显示空白字符,应在排错时开启该功能。
布尔值应写成 true 或 false,端口写为不带引号的整数。节点名称、策略名称和密码建议加双引号,尤其是内容含冒号、井号、逗号、星号、首尾空格或类似布尔值的单词时。井号表示注释起点,未加引号的密码若包含井号,后半段会被解析成注释。纯数字密码也建议加引号,避免前导零被处理。空值不要随意写成空字符串;不需要的可选字段通常应整行删除。
引号、锚点和重复键
双引号会处理反斜杠转义,单引号基本按原文保留。普通名称使用双引号最直观;正则表达式、Windows 路径或包含大量反斜杠的内容则需要特别确认转义结果。YAML 锚点可以复用一段映射,但不同客户端的预处理流程可能改变锚点行为。需要跨客户端传递的订阅文件,应优先使用完整字段,不要过度依赖复杂锚点和合并键。
同一映射中出现重复键是危险情况。例如顶层写了两次 dns,有的解析器采用后者,有的工具会直接报错,结果不能依赖。订阅覆写常见的故障正是把新模块追加到文件末尾,却没有删除原模块。检查时应搜索顶层键是否只出现一次,再查看客户端最终生成的运行配置,而不是只看覆写片段。
配置扩展名通常为 .yaml 或 .yml,两者语法相同。文件编码建议使用 UTF-8,避免策略组中文名称在不同系统之间变成乱码。换行格式通常可由客户端处理,但从 Windows 编辑后再交给 Linux 服务运行时,仍应避免混入不可见控制字符。先保证文件可以被 YAML 解析,再讨论节点连通性和规则命中,这是整个排错过程的第一道门。
通用字段:端口、模式与控制接口
监听端口如何分工
port 提供 HTTP 代理监听,socks-port 提供 SOCKS5 监听,mixed-port 则让同一个端口同时接受 HTTP 与 SOCKS5。桌面图形客户端通常只需要一个 mixed-port,系统代理会自动指向它。若另一个程序明确要求 SOCKS5 地址,可以单独配置 socks-port。多个监听端口不能占用同一个端口号,也不能与系统里其他服务冲突。
redir-port 和 tproxy-port 主要用于 Linux 网关、路由器或透明代理规则,桌面用户不应仅为“覆盖更多流量”而随意开启。TUN 模式有独立的虚拟网卡和路由处理路径,也不等于简单增加一个监听端口。需要比较两种接管机制时,可阅读TUN 模式与系统代理区别,先确定流量从哪里进入内核,再选择相关字段。
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"
profile:
store-selected: true
store-fake-ip: true
| 字段 | 用途 | 常见设置 | 检查重点 |
|---|---|---|---|
mixed-port |
统一接受 HTTP 与 SOCKS5 请求 | 桌面客户端保留一个本地端口 | 确认未被其他进程占用 |
allow-lan |
允许局域网设备连接 | 仅本机使用时设为 false | 开启后同时检查防火墙 |
bind-address |
限定监听地址 | 配合局域网共享使用 | 不要把控制接口误当代理端口 |
mode |
决定规则、全局或直连处理 | 日常使用通常为 rule | 客户端界面可能覆盖文件值 |
局域网访问与绑定地址
allow-lan 决定其他设备能否通过当前设备的代理端口连接。设为 false 时适合单机使用;设为 true 后,还要检查操作系统防火墙、监听地址和局域网隔离设置。开放局域网访问并不会自动把手机或电视设置为代理,仍需在目标设备中填写运行 Clash 的局域网地址和监听端口。地址变化会导致连接失效,因此长期共享时应为主机设置稳定的局域网地址。
bind-address 用来约束监听范围。某些客户端会根据“允许局域网连接”开关自动生成该字段,因此文件中的值可能在启动时被界面设置覆盖。排查时应查看实际监听地址:若只监听 127.0.0.1,其他设备无法访问;若监听所有接口,则应确保控制接口和代理端口没有被直接暴露到不可信网络。代理监听与外部控制接口是两套服务,不应混淆。
运行模式、日志与状态保存
mode: rule 按 rules 自上而下匹配,是日常配置的主体。global 会把流量交给全局策略,适合临时验证某个节点是否可用;direct 让请求直接连接,适合确认问题是否由代理路径引起。图形客户端的模式按钮通常会在运行时切换状态,未必回写订阅原文件。因此不要只看文件里的 mode,还要看客户端当前界面。
log-level 常用 info,排错时可临时提高到 debug,完成后恢复,避免日志过多干扰判断。ipv6 控制内核是否处理 IPv6 相关能力,但它不能修复本地网络本身缺少 IPv6 路由的问题。开启后若出现连接等待,应检查 DNS 是否返回 IPv6 地址、系统是否有可用 IPv6 出口,以及规则是否覆盖对应地址。
external-controller 提供界面与内核通信的控制地址,通常绑定本机回环地址。secret 是控制接口的访问凭据,示例值必须替换。它不是代理节点密码,也不会参与远端连接。profile.store-selected 可保存策略组选择,profile.store-fake-ip 可保存 Fake-IP 映射状态。若订阅更新后策略选择总被重置,应同时检查客户端自己的持久化选项,而不是只修改 YAML。
DNS 配置:解析路径与 Fake-IP
先分清谁在发起解析
DNS 配置决定域名如何转换为地址,也会影响规则能否在正确阶段识别域名。浏览器可能使用系统 DNS、安全 DNS或自身缓存,操作系统可能缓存旧结果,TUN 模式又可能把更多 DNS 请求交给内核。出现“节点可用但网站打不开”时,不应立刻更换全部节点;先确认请求是否进入 Clash DNS、解析结果是否可达、规则最终选择了哪个策略。
dns.enable 开启内置 DNS 模块。listen 用于指定 DNS 服务监听地址,在普通图形客户端中通常由客户端管理,手工开放到局域网前需要理解防火墙影响。nameserver 是主要解析器,既可以填写普通地址,也可以填写 DoH 地址。解析器数量不宜无目的堆叠,因为不同响应之间的差异会让排错变得困难。
dns:
enable: true
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
respect-rules: true
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.example/dns-query
proxy-server-nameserver:
- https://resolver.example/dns-query
direct-nameserver:
- 223.5.5.5
fake-ip-filter:
- "*.lan"
- "*.local"
- "time.*.com"
- "+.stun.*.*"
各类 nameserver 的职责
default-nameserver 主要用于解析 DoH 或 DoT 服务器自身的域名,也可作为启动阶段的基础解析器。为了避免形成“先解析解析器域名才能使用解析器”的循环,这里通常填写可直接访问的 IP 地址。它不是所有业务域名的默认出口,不能用增加大量地址的方式替代正确的主解析配置。
nameserver 负责常规域名查询。proxy-server-nameserver 可专门解析代理节点服务器域名,防止节点域名解析过程依赖尚未建立的代理连接。节点地址如果本身就是 IP,该项影响较小;节点地址是域名且启动时持续出现解析失败,则应重点检查。direct-nameserver 可用于直连域名解析,配合遵循规则的 DNS 路径,使直连和代理目标采用不同解析策略。
respect-rules 让 DNS 查询更紧密地遵循分流规则,但它对策略组和解析器配置有依赖。错误的规则目标、不可用的代理解析器或循环引用,可能让 DNS 在节点尚未可用时等待代理。启用后若所有域名都停止解析,应暂时恢复简化配置:保留一个可访问的 nameserver,关闭复杂分流,确认基础解析恢复,再逐项加入专用解析器。
Fake-IP 与 redir-host 的差异
enhanced-mode: fake-ip 会为域名返回保留地址段中的临时地址,并由内核维护“临时地址到原域名”的映射。优点是内核能尽早保留域名信息,规则判断更直接,也能减少某些应用绕过域名规则的情况。fake-ip-range 应使用专用保留地址段,不要与本地真实网段、公司网络或虚拟机网段重叠。发生局域网地址冲突时,表现可能是部分内网服务打不开,而普通公网访问正常。
redir-host 返回真实解析地址,兼容路径更传统,但在透明接管场景下可能较早丢失原域名信息。选择哪种模式应以应用兼容性和接管方式为准,而不是认为某一种永远更快。桌面客户端使用 Fake-IP 后若只有打印机、局域网设备、时间同步或游戏局域发现异常,通常先补充 fake-ip-filter,不必直接关闭整个 DNS 模块。
fake-ip-filter 中的域名会绕过 Fake-IP 返回真实地址。过滤范围应尽量精确。把过宽的通配符加入列表,会让大量域名失去 Fake-IP 处理,最终产生“规则写了但命中不稳定”的情况。新增条目后应清理客户端 DNS 缓存或重启内核,因为旧映射可能仍被保留。系统和浏览器也有独立缓存,必要时分别刷新。
DNS 故障的分层检查
第一层检查配置能否加载,第二层检查解析器地址能否从当前网络访问,第三层检查节点服务器域名能否解析,第四层检查业务域名规则,最后才检查应用缓存。若日志显示超时,应区分是 UDP DNS、DoH 建连还是代理节点建连超时。若能得到地址但连接失败,则问题已经从解析阶段进入路由、规则或节点阶段。
不要同时更换 DNS、开启 TUN、改 Fake-IP 范围并替换规则集。正确做法是保留一份可工作的基线配置,每次只改变一个模块。关于连接速度下降的进一步分层方法,可参阅Clash 速度慢怎么排查。DNS 只负责解析路径,不会提升质量较差的远端线路,也不能替代正确的节点和策略选择。
代理节点字段与代理提供者
节点对象的共同结构
proxies 是静态节点列表,每个列表项至少包含名称、类型、服务器地址和端口,再按协议补充认证与传输字段。name 是整个配置中的引用标识,策略组通过它找到节点。重名节点会导致选择和覆写结果不确定,因此订阅合并后应检查名称是否唯一。server 可以是域名或 IP,port 必须与服务端实际监听一致。
协议类型决定可用字段,不能把一种协议的参数机械复制到另一种协议。加密方式、用户标识、传输层、TLS 和服务器名称都必须与服务端设置一致。客户端能够加载 YAML,只表示语法和字段结构基本有效,不表示远端认证一定成功。日志中的握手失败、认证失败、连接拒绝和超时分别指向不同阶段,应按错误阶段处理。
proxies:
- name: "SS 演示节点"
type: ss
server: ss.example.com
port: 443
cipher: aes-128-gcm
password: "your-password"
udp: true
- name: "Trojan 演示节点"
type: trojan
server: trojan.example.com
port: 443
password: "your-password"
sni: service.example.com
skip-cert-verify: false
udp: true
- name: "Hysteria2 演示节点"
type: hysteria2
server: hy2.example.com
port: 443
password: "your-password"
sni: service.example.com
skip-cert-verify: false
认证、TLS 与传输字段
Shadowsocks 节点常见字段包括 cipher、password 和 udp。加密方法必须与服务端相同,名称相近也不能互换。Trojan 类节点依赖 TLS,除密码外还经常需要 sni。SNI 表示握手时使用的服务器名称,它可能与连接地址相同,也可能由服务提供方指定。填写错误时,TCP 连接可能成功,但 TLS 握手会失败。
skip-cert-verify 控制证书验证。正常配置应保持 false,优先修正服务器名称、系统时间和证书链问题。把它改为 true 只能用于定位证书验证是否为故障点,不应作为通用修复。系统时间偏差、受限网络拦截和错误 SNI 都可能产生证书相关报错。只看“连接失败”四个字不足以判断原因,必须结合日志中的握手阶段。
VMess、VLESS、TUIC、Hysteria2 等类型还可能包含用户标识、网络类型、WebSocket 路径、HTTP 头、流控或拥塞控制字段。字段集合随内核能力和服务端部署方式变化。手工迁移节点时应以原始订阅和当前内核文档为准,不要仅凭另一个节点的外观补字段。关于原版 Clash、Meta 与 mihomo 的名称和兼容关系,可阅读内核版本选型说明。
proxy-providers 的按需加载
节点较多或需要远程更新时,可以使用 proxy-providers。提供者是节点集合,策略组通过 use 引用它。常见类型为 HTTP 或本地文件,远程提供者包含地址、更新间隔、保存路径和健康检查。保存路径应位于客户端允许写入的位置;容器或服务模式下还要确认目录权限。远程地址中的查询参数可能包含访问凭据,不应写入公开日志或公开示例。
proxy-providers:
provider-main:
type: http
url: "https://subscription.example/config?token=xxxx"
path: ./providers/provider-main.yaml
interval: 3600
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
proxy-groups:
- name: "订阅节点"
type: select
use:
- provider-main
proxies:
- DIRECT
interval 是刷新间隔,不代表每次启动都一定立即下载。客户端还可能有自己的更新按钮和缓存策略。health-check 用固定地址检查节点可达性,结果用于界面展示或自动策略选择,但单一检测地址不能代表所有网站都可访问。检测失败时先确认测试地址在当前网络中可达,再判断节点是否故障。
proxies 与 use 可以在同一策略组中共同出现:前者列出固定节点或内置动作,后者引入提供者集合。覆写工具处理这两类字段时行为可能不同,追加静态节点不一定会自动加入提供者。订阅更新后节点消失,通常应检查远程提供者是否刷新成功、保存路径是否可写、策略组是否仍引用正确的提供者名称。
策略组:手动选择与自动测试
策略组是规则与节点之间的中间层
proxy-groups 把多个节点、其他策略组和内置动作组合成可选择目标。规则通常不直接指向某个具体节点,而是指向“节点选择”“流媒体”或“下载”等策略组。这样更换节点时无需重写规则。策略组名称同样区分大小写,规则目标、上级策略组引用和界面显示必须保持一致。
组之间可以嵌套,但不能形成循环。例如 A 引用 B,B 又引用 A,会导致配置检查失败或运行行为异常。设计策略层级时应保持单向:顶层业务组引用地区组,地区组引用具体节点;不要让底层组反向引用顶层业务组。层级过深也会增加选择成本,通常两到三层已经足够。
proxy-groups:
- name: "节点选择"
type: select
proxies:
- "自动选择"
- "故障转移"
- "SS 演示节点"
- DIRECT
- name: "自动选择"
type: url-test
proxies:
- "SS 演示节点"
- "Trojan 演示节点"
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
lazy: true
- name: "故障转移"
type: fallback
proxies:
- "SS 演示节点"
- "Trojan 演示节点"
url: https://www.gstatic.com/generate_204
interval: 300
lazy: true
select、url-test 与 fallback
select 是手动选择组,客户端界面会显示其中的节点和子策略。它不会自行判断哪个节点更快,适合需要稳定指定出口的场景。将 DIRECT 放进选择组可用于临时对照,但也意味着误选后相关规则全部直连。常用主组可开启状态保存,使客户端重启后继续使用上次选择。
url-test 定期访问测试地址,并在候选节点中选择响应结果较合适的一个。它测量的是到测试地址的连接表现,不等于所有业务的实际速度。interval 控制测试周期,过短会增加网络与电量消耗。tolerance 用于减少结果接近时频繁切换;容差过小,节点会因轻微波动反复变化,长连接也可能受到影响。
fallback 更重视可用性与候选顺序。当当前节点不可用时按列表切换,适合希望优先使用固定出口、故障时再切换的场景。它与“永远选择延迟最低”不是同一个目标。若业务依赖稳定来源地址,通常手动选择或故障转移比频繁测速切换更可控。
load-balance 与健康检查边界
load-balance 在多个可用节点之间分配连接,可按内核支持的策略保持同一目标的一致性或进行轮换。它适合大量独立连接,不适合要求整个会话始终使用同一出口的服务。登录状态异常、验证码增多或同一业务观察到出口变化时,应先改用固定节点确认,而不是继续缩短测速间隔。
自动策略依赖健康检查地址。测试地址应稳定、响应体小、允许频繁访问,并且不能被本地网络特殊处理。若所有节点突然显示失败,而实际访问仍正常,可能是检测地址本身不可达。反之,检测成功只说明该地址可访问,不能证明 DNS、目标网站、UDP 或特定协议均正常。自动选择是辅助机制,不是完整质量评分。
| 策略类型 | 主要目的 | 适合场景 | 常见误区 |
|---|---|---|---|
select |
人工固定选择 | 稳定出口、按需切换 | 以为会自动测速 |
url-test |
按测试结果自动选择 | 日常浏览、候选较多 | 把测试延迟等同于下载速度 |
fallback |
优先使用并在故障时切换 | 主备线路 | 忽略列表顺序 |
load-balance |
在多个节点间分配连接 | 多连接任务 | 用于要求固定出口的会话 |
用业务组保持规则可维护
一个可维护的配置通常保留一个总入口组,再按业务建立少量策略组。规则指向业务组,业务组再引用总入口、自动组或指定地区组。这样订阅节点变化时,只需调整组成员。不要为每个域名建立一个策略组,否则界面会充满重复选项,覆写也难以维护。
策略组增加或改名后,应搜索整个文件中的旧名称。规则、其他策略组以及覆写脚本都可能引用它。客户端出现“策略不存在”时,先检查名称的空格、全角符号和大小写,再检查组是否因覆写顺序被删除。若节点延迟展示与实际体验差异明显,可结合节点、线路与本地设置排查,分别验证 DNS、握手和持续传输,不要只依据一次健康检查。
规则语法、匹配顺序与规则集
规则按从上到下的顺序匹配
rules 是有序列表。请求遇到第一条匹配规则后即停止继续检查,因此具体规则应放在宽泛规则之前,末尾使用 MATCH 承接其余流量。若把 MATCH 放在顶部,后续规则永远不会生效。若先写宽泛的域名后缀,再写其子域名的特殊规则,子域名也会被前一条提前接走。
规则通常由“类型、匹配值、策略目标”组成,部分规则还可以附加参数。逗号是字段分隔符,策略名称必须在 proxy-groups 中存在,或使用 DIRECT、REJECT 等内置动作。规则行中的多余空格可能成为值的一部分,手工编辑时应保持格式统一。
rules:
- DOMAIN,api.example.com,节点选择
- DOMAIN-SUFFIX,example.com,节点选择
- DOMAIN-KEYWORD,example,节点选择
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- PROCESS-NAME,example-app.exe,DIRECT
- GEOIP,CN,DIRECT
- RULE-SET,private-domain,DIRECT
- RULE-SET,service-domain,节点选择
- MATCH,节点选择
域名、地址与进程规则
DOMAIN 只匹配完整域名,适合单个主机;DOMAIN-SUFFIX 匹配指定域名及其子域,适合完整站点范围;DOMAIN-KEYWORD 只要域名包含关键词就可能命中,覆盖范围最宽,也最容易误伤。能用完整域名时不要使用关键词,能用明确后缀时不要写过短的片段。
IP-CIDR 和 IP-CIDR6 按目标地址段匹配。局域网、容器网段和公司内网通常应优先直连,但地址范围必须符合实际网络。no-resolve 表示匹配时不为取得 IP 而额外解析域名,可避免不必要的 DNS 查询。它不表示禁止已有 IP 流量,也不会改变应用自身已经完成的解析。
PROCESS-NAME 和进程路径类规则依赖平台能力、权限与接管方式。系统代理模式下,并非所有流量都能可靠获得进程信息;移动平台也可能不支持同样的进程规则。跨平台配置应把域名和地址规则作为基础,进程规则作为特定设备上的补充。出现桌面端命中而手机端不命中时,先检查规则类型是否具备平台可移植性。
GEOIP 根据 IP 数据库分类,GEOSITE 或规则集则按域名集合分类,具体可用能力取决于内核及数据文件。数据库规则方便覆盖大范围目标,但分类数据存在更新周期,不能替代明确的业务规则。需要强制某个域名走指定策略时,应把它的精确规则放在数据库规则之前。
rule-providers 管理大型规则集
大量规则适合放入 rule-providers。每个提供者需要名称、类型、行为、来源、保存路径和更新间隔。behavior 决定内容格式:域名集合、IP 地址段或传统规则行不能混用。提供者下载成功不代表已参与分流,还必须在 rules 中使用同名 RULE-SET。
rule-providers:
private-domain:
type: http
behavior: domain
format: yaml
url: "https://rules.example/private-domain.yaml"
path: ./rules/private-domain.yaml
interval: 86400
service-domain:
type: file
behavior: classical
format: yaml
path: ./rules/service-domain.yaml
rules:
- RULE-SET,private-domain,DIRECT
- RULE-SET,service-domain,节点选择
- MATCH,节点选择
domain 行为适合域名或域名后缀集合,ipcidr 适合地址段,classical 允许传统规则表达式。远程内容格式必须与声明一致。若提供者文件本身包含完整 payload 结构,保存后由内核按对应格式读取;若把普通订阅文件误当规则集,配置会在解析阶段报错。
规则集刷新失败时,先看网络请求状态,再看保存目录权限和文件格式。旧缓存仍可能继续工作,因此“当前还能访问”不能证明更新成功。服务模式下相对路径以运行目录或客户端配置目录为基准,不一定是 YAML 文件所在目录。迁移设备后规则提供者失效,路径差异是高频原因。
验证规则命中而不是凭结果猜测
客户端连接记录通常会显示目标域名、命中规则和最终策略。测试时应先清除浏览器已有连接或使用新的请求,否则复用连接可能继续沿用旧策略。修改规则后重新载入配置,再查看新连接是否命中新规则。只看网页能否打开,无法区分它走了直连还是代理。
自定义规则应从少量精确条目开始。先写一条明确域名规则,确认命中,再逐步扩大到后缀或规则集。若新增规则导致大量网站异常,立即检查是否使用了过短的关键词、过宽的地址段或提前出现的 MATCH。规则分流的核心不是数量,而是顺序清晰、目标存在、范围可解释。
订阅覆写、YAML 合并与更新边界
原始订阅与运行配置不是同一份文件
图形客户端导入订阅后,通常会经历下载、解析、覆写、客户端设置注入和内核加载几个阶段。界面中看到的订阅内容可能是原始文件,也可能是处理后的缓存;内核实际运行的配置还可能包含客户端自动写入的端口、控制接口和 TUN 设置。因此排查覆写问题时,要明确正在查看哪一个阶段的文件。
订阅更新会重新下载远程内容。直接编辑缓存文件的改动可能在下一次更新时消失,这是正常的更新结果,不代表客户端保存失败。需要长期保留的本地规则、策略组或 DNS 设置,应放入客户端支持的覆写、扩展脚本或本地配置层。不同客户端的覆写能力和字段名称并不完全相同,迁移时应先导出最终配置进行核对。
映射、列表与标量的合并差异
YAML 本身定义数据结构,但不统一规定订阅工具必须怎样深度合并。标量字段如 mode 通常由后值替换前值;映射如 dns 可能逐键合并,也可能整个替换;列表如 rules 和 proxy-groups 可能覆盖、追加、前置或按名称处理。不能假设所有客户端都采用同一种算法。
规则覆写尤其依赖顺序。若自定义规则被追加到远程规则末尾,而远程配置已经有 MATCH,新规则不会命中。此时需要“前置规则”而不是普通追加。策略组若整体替换,则订阅生成的节点引用可能丢失;若只追加同名组,则可能产生重复名称。每种数据类型都应单独确认合并结果。
# 基础配置中的片段
mode: rule
dns:
enable: true
enhanced-mode: fake-ip
rules:
- DOMAIN-SUFFIX,example.com,节点选择
- MATCH,节点选择
# 期望前置的本地规则片段
rules:
- DOMAIN,internal.example.com,DIRECT
# 合并后的正确顺序应类似
rules:
- DOMAIN,internal.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,节点选择
- MATCH,节点选择
安全使用 YAML 锚点
锚点可以减少重复字段。例如多个自动策略组共享测速地址和间隔时,可以定义公共映射,再用合并键展开。但锚点只在同一份 YAML 文档内部有效。远程订阅和本地覆写若在解析后才合并,覆写片段不一定能引用原文件中的锚点。某些转换工具还会先展开或丢弃锚点,因此不能把关键兼容性建立在跨文件锚点上。
group-test-common: &group-test-common
type: url-test
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
proxy-groups:
- name: "自动选择"
<<: *group-test-common
proxies:
- "SS 演示节点"
- "Trojan 演示节点"
锚点名称只用于 YAML 解析,不会成为 Clash 配置字段。若客户端的严格检查不接受额外顶层键,可以把公共结构放到工具支持的位置,或直接展开字段。为了跨设备传输,最终导出的配置最好是已经展开、能够独立加载的完整文件。减少重复固然方便,但可读性和兼容性优先级更高。
建立可回退的覆写流程
第一次覆写只修改一个容易验证的字段,例如日志级别或一条精确规则。重新载入后查看最终配置与连接记录,确认覆写层确实生效。第二步再加入 DNS 或策略组。若一次同时替换端口、DNS、组和规则,出现故障时无法判断是哪一层引起。
为本地扩展保留清晰命名,例如策略组统一使用稳定名称,规则提供者使用不会与订阅冲突的前缀。订阅更新前后对比最终配置中的顶层键数量、策略组名称和规则顺序。不要只对比文件行数,因为节点数量变化会产生大量无关差异。重点是本地字段是否仍在、引用是否闭合、末尾兜底是否唯一。
客户端之间迁移时,应先在新客户端中导入原订阅,再移植本地覆写,不要直接复制整个运行目录。Clash Plus、Clash Verge Rev、FlClash、Clash Nyanpasu 等图形客户端的配置管理界面和持久化方式可能不同,内核兼容也不表示界面设置完全一致。可在选型指南了解客户端定位,再到下载中心取得对应平台安装包。
订阅更新后的异常定位
更新后配置无法加载,先暂时停用本地覆写并验证原订阅。原订阅可用而覆写后失败,说明问题位于合并层;原订阅也失败,则应检查远程内容、订阅状态或内核兼容。若配置能加载但策略组为空,检查节点提供者名称和过滤条件;若自定义规则消失,检查覆写类型是替换还是追加;若端口恢复默认,检查客户端设置是否优先于文件字段。
保留一份最近可工作的最终配置,可以迅速区分“上游订阅变化”和“本地编辑变化”。回退后不要立刻再次覆盖全部内容,应从差异最小的模块开始恢复。首次安装和订阅导入的通用注意事项,也可参考跨平台初始化与常见错误。
配置检查、载入流程与故障分层
先检查语法,再检查网络
配置故障应按固定顺序处理:文件编码与 YAML 语法、字段结构与引用、监听端口、DNS、节点连接、策略组、规则命中、应用接管。上一层没有通过时,不要跳到下一层。语法错误会让整个配置无法载入,节点错误只影响对应连接,规则错误则可能让流量走错策略。分清故障范围,才能避免无目的地更换所有设置。
图形客户端通常提供配置检查或重新载入按钮。服务端和命令行环境可使用当前内核提供的测试参数,但具体可执行文件名与参数应以安装包内说明为准。检查命令必须指向实际配置目录;相对路径错误时,可能测试了另一份同名文件。看到“配置有效”后仍需观察启动日志,因为端口占用、目录权限和网络连接属于运行阶段问题。
# 示例:先进入实际配置目录,再调用当前内核的配置检查参数
cd /path/to/clash-config
mihomo -t -d .
# 查看本机端口是否已被占用时,可按操作系统使用对应工具
# Linux
ss -lntup
# Windows PowerShell
Get-NetTCPConnection -State Listen
解析错误的常见位置
报错包含行号时,应同时查看该行和它上方数行。YAML 解析器往往在无法继续理解时才报错,真正问题可能是前一行漏了引号、冒号后缺空格或列表缩进中断。若提示映射键重复,搜索同一层级的同名字段;若提示类型不符,检查原本应为列表的位置是否少了短横线,或整数是否误写成了对象。
从聊天软件或富文本复制的内容可能包含全角冒号、弯引号、不间断空格和不可见字符。最稳妥的处理方式是在纯文本编辑器中重新输入问题行。中文策略组名称可以正常使用,但标点应保持普通半角 YAML 分隔符。注释必须从井号开始,并与有效值保持适当空格。
配置能解析但提示目标不存在时,检查节点名、提供者名、策略组名和规则集名。常见情况包括策略组引用已被订阅更新改名的节点、规则指向被覆写删除的组、RULE-SET 名称与提供者键不一致。搜索名称时应包含引号内的完整文本,注意末尾空格和形似字符。
端口、系统代理与 TUN 的分支
客户端显示运行但应用无法联网,先确认监听端口是否存在,再核对系统代理地址。若 YAML 的 mixed-port 已改为新值,而系统代理仍指向旧值,浏览器会立即连接失败。若只有不遵循系统代理的应用无法接管,说明基础代理可能正常,需要评估 TUN,而不是继续修改节点协议。
开启 TUN 后完全断网,应检查权限、虚拟网卡、路由、DNS 接管和其他网络软件冲突。先关闭 TUN,确认系统代理路径可工作,再单独处理 TUN。若关闭客户端后仍无法上网,检查系统代理是否残留开启、虚拟网卡路由是否恢复。不要在同一测试中同时启用多个代理客户端,它们可能竞争系统代理、端口和路由。
节点可用性与规则命中的验证
节点测试失败时,先区分 DNS 解析失败、TCP 连接超时、连接拒绝、TLS 握手失败和认证失败。解析失败检查节点服务器域名与 proxy-server-nameserver;超时检查网络和远端地址;拒绝通常表示目标端口没有接受连接;握手失败检查系统时间、SNI 和证书;认证失败检查密码、用户标识和协议字段。不同错误不能用同一种修复方式处理。
节点测试成功但目标网站失败时,查看连接记录中的命中规则和策略。若命中 DIRECT,问题在规则顺序或模式;若命中预期节点,继续检查目标域名解析、节点出口和网站侧限制。临时切换到全局模式可用于区分规则问题,但测试后应恢复规则模式。全局模式能访问并不表示原规则正确,只说明某个代理路径可用。
| 现象 | 优先检查 | 下一步 |
|---|---|---|
| 配置无法载入 | 缩进、重复键、字段类型 | 缩小到最小可解析配置 |
| 客户端运行但浏览器断开 | 监听端口与系统代理端口 | 确认本地端口没有冲突 |
| 域名失败但 IP 可连接 | DNS 监听、解析器和缓存 | 简化 DNS 后逐项恢复 |
| 全局可用、规则模式失败 | 规则顺序和策略目标 | 查看连接记录的命中项 |
| 更新订阅后本地规则消失 | 覆写方式与合并顺序 | 对比最终运行配置 |
建立最小可工作配置
复杂配置无法定位时,可从一个端口、一个节点、一个手动策略组和两条规则开始。确认它能载入并连接后,依次加入 DNS、自动策略、规则提供者和 TUN。每加入一层就保存可工作的副本。这个过程比在数千行订阅中反复猜测更快,也能明确客户端与内核实际支持哪些字段。
最小配置测试使用的节点必须确认信息完整,测试域名也应稳定。若最小配置仍失败,问题多半不在规则集,而在节点、系统网络、权限或客户端安装。此时可回到使用文档核对初始化步骤,或阅读订阅、模式与连接状态十问。需要重新安装时,从下载中心选择对应平台,桌面与移动平台均优先查看 Clash Plus。
完成排错后,应把临时的 debug 日志、宽泛测试规则和证书验证变更恢复到正常设置。删除不再使用的端口、重复策略组与失效提供者,给自定义部分写简短注释。配置的长期可维护性取决于每个模块都有清晰职责,而不是字段数量。能够说明每条规则为何存在、每个组引用谁、每个 DNS 解析器负责什么,才是一份可持续更新的配置。
从可运行配置继续
尚未安装客户端时,先按平台取得安装包;已完成安装但不熟悉界面操作时,按快速上手流程导入订阅、选择策略并验证连接。