先看结构:入口、解析、节点、策略与规则
打开 Clash 配置文件,不必从第一行一路猜到最后。先找顶层字段:mixed-port 决定应用连到哪里,dns 管理内置域名解析,proxies 保存节点,proxy-groups 组织可选出口,rules 决定每条连接交给谁处理。理解这五部分,就能分清“文件能加载”和“连接能按预期转发”是两件事。
典型引用链是:规则命中策略组,策略组再选中节点;如果规则目标是 DIRECT,则直接连接目标,不经过远端代理节点。配置中各个顶层字段的排列通常不决定执行先后,但 rules 列表的上下顺序会直接改变匹配结果。
| 配置部分 | 负责的事情 | 优先检查项 |
|---|---|---|
mixed-port | 接收 HTTP 与 SOCKS5 代理连接 | 端口占用、应用填写地址 |
dns | 内置解析器及增强模式 | 是否启用、请求是否进入内核 |
proxies | 远端节点的连接参数 | 协议、地址、端口、认证 |
proxy-groups | 选择或测试出口 | 名称引用、当前选项 |
rules | 按条件分配连接 | 匹配顺序、最终兜底策略 |
YAML 写法:先检查缩进,再检查字段含义
YAML 用缩进表达层级。建议统一使用两个空格,不使用 Tab。同级字段左侧对齐,列表项以短横线加空格开头。扩展名可以是 .yaml 或 .yml,但把文本改成这个扩展名,不会自动修复语法。
proxy-groups:
- name: "出口选择"
type: select
proxies:
- DIRECT
这段配置包含两个不同位置的概念:顶层 proxy-groups 是策略组列表;组内的 proxies 是可选项名称列表,并不是完整节点参数。name、type 与组内 proxies 属于同一个对象,所以它们的缩进一致。
编辑器里重点检查四处
- 冒号后的空格:写成
mode: rule,不要把键和值粘在一起。 - 布尔值:
allow-lan: false使用布尔值,不需要把false包进引号。 - 带特殊字符的字符串:节点名称、密码和包含
#的值建议使用引号,避免被误当成注释等语法。 - 重复键:不要在文件末尾再添加第二个顶层
dns或rules。不同解析器可能拒绝加载,也可能覆盖前面的值。
语法错误通常会给出行号,但真正的问题可能在上一行。例如列表缩进少了两个空格,报错可能落在下一个字段上。定位时先看报错行,再向上检查最近一组字段与列表结构。
顶层设置:mixed-port、allow-lan 与 mode
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
mixed-port: 7890 表示同一个监听端口可以接收 HTTP 和 SOCKS5 代理连接。仅供本机使用时,应用可填写地址 127.0.0.1、端口 7890。端口号不是固定要求;如果日志提示 address already in use,先检查是否有第二个客户端或其他程序占用它。
allow-lan: false 限制局域网设备通过该代理入口接入。需要共享时,不仅要调整这个字段,还要核对监听地址、系统防火墙和当前网络是否可信。不要为了排查本机连接问题,直接把所有入站限制都放开。
三种模式与 rules 的关系
rule:按规则列表决定出口,适合验证分流配置。global:通过全局策略选择出口,不按普通规则列表逐条分流。direct:连接走直连;此时修改代理规则通常看不到预期变化。
log-level: info 适合日常查看连接与错误;排查时可以短暂改成 debug,完成后恢复,避免日志过多。ipv6: false 是本文起步配置的取舍,不代表所有网络都应该关闭 IPv6。需要 IPv6 时,应连同 DNS 返回、系统路由和节点能力一起检查。
dns 段:启用解析器与选择增强模式
dns 是一个嵌套对象。先确定内置解析是否启用,再考虑 enhanced-mode。下面是常见的结构示例,使用传统 IP 地址作为上游,便于看清字段关系;它不是对所有网络环境的通用推荐。
dns:
enable: true
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver 是上游解析服务器列表。这里的普通 IP 上游通常使用传统 DNS 传输;如需 DoH、DoT 或更细的分流解析,应核对内核支持与上游可达性。顶层 ipv6 与 dns.ipv6 不应被当成完全相同的开关,后者主要影响内置 DNS 对 AAAA 查询的处理。
fake-ip 会为符合处理条件的域名返回合成地址,内核保存地址与域名之间的映射,再按连接对应的域名处理流量。198.18.0.1/16 位于基准测试用途的保留地址空间,不是某个节点的公网地址,也不应该填进节点的 server 字段。
为什么写了 dns,系统解析仍没有变化?
enable: true 只是启用内置 DNS 功能,并不保证整个系统的 DNS 请求都进入它。通过代理协议传入域名、由系统直接解析域名,以及由 TUN 配合 DNS 劫持接入,是不同路径。排查时先确定应用使用哪条路径,再查看客户端是否配置了对应的 DNS 接管。
遇到局域网名称、游戏或设备发现异常,可以按实际需求研究 fake-ip-filter,让特定域名绕开合成地址。不要直接复制一长串来源不明的过滤项;过滤后的真实解析结果和后续路由仍然需要验证。
proxies 与 proxy-groups:节点参数和出口名称分开看
顶层 proxies 保存节点对象。每个对象至少需要一个用于引用的 name,其他必需字段由协议决定。例如 Shadowsocks 节点通常需要 type、server、port、cipher 和 password;其他协议还可能涉及 UUID、TLS、传输层等参数。不能把一个协议的字段表直接套给另一个协议。
节点参数应来自实际服务配置或可信订阅。本文不提供虚构服务器与认证信息,后面的完整示例使用 proxies: [],表示空节点列表。这样可以先验证 YAML、监听端口和规则引用,不会把一个看起来完整、实际上连不通的节点当成可用配置。
proxies: []
proxy-groups:
- name: "出口选择"
type: select
proxies:
- DIRECT
select 是手动选择组。组名“出口选择”会成为规则可以引用的目标,组内目前只有内置的 DIRECT。接入真实节点时,需要先在顶层节点列表中保留完整节点对象,再将其 name 原样加入组内列表;空格、大小写和符号都应一致。仅添加一个节点名称,不会自动生成节点。
自动测速组还需要什么?
url-test 等组类型还涉及测速地址、检测间隔等设置。检测结果只代表特定测试请求下的情况,不等同于所有网站都能访问,也不等同于实际下载带宽。刚开始拆读配置时,建议先使用 select 验证每个出口,再引入自动选择逻辑。
rules 段:从上往下匹配,MATCH 放在最后
在规则模式下,内核按列表顺序寻找匹配项,命中后采用该项指定的目标。目标可以是策略组、节点名称,也可以是 DIRECT、REJECT 等内置策略。为了便于维护,通常让规则指向策略组,而不是把所有节点名称散落在规则里。
rules:
- DOMAIN,example.com,DIRECT
- DOMAIN-SUFFIX,example.org,出口选择
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,出口选择
DOMAIN精确匹配域名。这里仅匹配example.com,不包含它的全部子域名。DOMAIN-SUFFIX匹配域名后缀。这里可以覆盖example.org及其子域名。IP-CIDR按目标 IPv4 地址网段匹配。192.168.0.0/16只是常见私网网段之一,不代表全部局域网范围。no-resolve表示不为这一条 IP 规则主动触发域名解析;目标 IP 已知时仍可参与匹配。MATCH是兜底项,接收前面没有匹配到的连接,通常放在列表最后。
这里用保留的示例域名演示语法,没有配置真实业务分流。若把 MATCH,出口选择 移到第一行,后面的这些规则就没有机会被命中。另一个常见误区是认为文件里的段落顺序会决定规则优先级:真正需要关注的是 rules 内部的条目顺序。
使用 GEOIP 或 RULE-SET 时,还会依赖相应数据库或规则提供器。若日志提示资源加载失败,应先处理资源问题。不要只反复调整规则文本,却忽略规则所引用的数据根本没有加载。
最小可用配置:先验证直连链路,再加入真实节点
下面是一份完整的本机直连验证配置,包含本文讲到的主要层级。它能建立代理监听入口,并通过规则和策略组将请求直连出去;它不包含远端代理节点,不能用于验证远端代理服务。与前面的 Fake-IP 片段不同,这里选择 redir-host,减少初次验证时对合成地址映射的依赖。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
dns:
enable: true
ipv6: false
enhanced-mode: redir-host
nameserver:
- 223.5.5.5
- 119.29.29.29
proxies: []
proxy-groups:
- name: "出口选择"
type: select
proxies:
- DIRECT
rules:
- DOMAIN,example.com,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,出口选择
保存与验证步骤
- 把现有可用配置另存一份备份,再将上面的内容保存为 UTF-8 编码的
config.yaml。确认编辑器没有自动追加.txt。 - 使用 mihomo 命令行时,可执行
mihomo -t -f config.yaml检查配置。图形客户端应使用自身提供的配置校验或导入功能;入口名称以当前版本界面为准。 - 校验通过后加载配置,确认日志没有端口占用、字段不支持或策略不存在等错误。图形客户端可能对原文件叠加端口、DNS、TUN 等设置,应查看最终运行配置。
- 显式指定代理发起一次请求,不依赖系统代理是否启用。能否访问测试站点,也受当前网络自身的直连能力影响。
curl -I --proxy http://127.0.0.1:7890 https://example.com
在 Windows PowerShell 中,如果 curl 被解释成其他命令,可改用 curl.exe。测试时同时查看客户端连接记录:目标应是 example.com,规则应命中精确域名项,出口应为 DIRECT。只看到 HTTP 响应而不检查连接记录,无法确认请求是否按预期经过了配置中的链路。
完成直连验证后,再从实际订阅或服务配置接入节点,把节点名称加入“出口选择”,并在客户端手动选中它。每次只改一类内容:先节点,再策略组,最后分流规则。这样出现问题时,能直接定位到最近修改的部分。
加载失败与规则不生效:按错误所在层排查
| 现象 | 优先检查 | 处理动作 |
|---|---|---|
| YAML 解析报错 | 缩进、Tab、冒号、引号 | 检查报错行及其上一组列表 |
| 策略或节点不存在 | 规则目标与组内名称 | 与对应的 name 逐字核对 |
| 7890 无法监听 | 其他客户端或后台内核 | 关闭重复进程,或更换端口并同步应用设置 |
| 规则修改没有效果 | 当前模式、启用配置、覆盖设置 | 切回 rule,确认运行配置,再新建连接 |
| 更新订阅后修改消失 | 修改位置是否为订阅生成文件 | 使用客户端支持的覆写或合并机制 |
规则与出口调整后,已有连接可能继续沿用建立时的路径。验证时应新建请求,必要时关闭目标应用的旧连接,再观察新的规则命中记录。不要因为某个长连接仍走原出口,就判断配置没有加载。
订阅管理同样需要区分原始内容与运行结果。客户端可能把订阅、全局设置和覆写规则合成为最终配置;直接编辑订阅下载文件,下一次更新就可能被替换。需要长期保留的端口或分流修改,应使用该客户端文档明确支持的覆写入口,并在更新后检查最终配置。
还没有客户端时,可先到客户端下载页按操作系统选择;需要了解导入、启用系统代理和首次连接流程,可继续查看配置教程。分享日志或配置求助前,记得移除订阅链接、密码、UUID 等访问凭据。