配置结构:先看引用链,再改字段

Clash 配置文件不是一份节点清单。端口决定应用怎样把连接交给内核,DNS 决定域名怎样解析,节点定义远端连接参数,策略组组织出口,规则负责把连接送到相应出口。FlClash 使用的 Clash Meta 内核通常也称为 mihomo;本文按这一内核体系解释配置,其他旧内核不一定识别全部字段。

最需要记住的关系是:规则引用策略组,策略组引用节点名或内置出口。例如规则把请求交给“手动选择”,该组再选择“示例节点”或 DIRECT。名称必须完全一致,多一个空格也可能变成找不到目标。

  • proxies:节点定义列表,记录协议、服务器、端口和认证信息。
  • proxy-groups:策略组列表,记录可选出口及选择方式。
  • rules:有顺序的匹配列表,决定连接交给哪个出口。
  • dns 与 tun:分别处理名称解析与虚拟网卡接管,不等于节点本身。

通用字段:端口、模式与日志

先从顶层字段开始。下面的片段定义一个同时接受 HTTP 代理和 SOCKS5 的本地混合端口;这里的 7890 是示例值,不代表每份订阅或每个客户端都使用相同端口。

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
字段示例值实际作用
mixed-port7890在一个端口提供 HTTP 与 SOCKS5 代理入口。
allow-lanfalse禁止将该代理入口作为局域网共享入口使用。
moderule按规则选择出口,而不是对全部连接使用全局选择。
log-levelinfo记录常规运行信息;排错时可短暂改为 debug。
ipv6false限制内核的 IPv6 使用,不等于关闭操作系统 IPv6。

代理端口不是节点端口

本机程序连接的是 127.0.0.1:7890,远端节点可能使用 443 或其他服务端指定端口。两者不需要相同。port 可单独提供 HTTP 代理,socks-port 可单独提供 SOCKS 代理;使用混合端口时,不必为了“完整”而把所有监听字段都加上。

配置加载成功后,可以用 curl -I -x http://127.0.0.1:7890 https://example.com 检查代理入口是否接受连接。这个命令只测试 HTTP 请求链路,不证明 UDP、TUN 或全部应用已经被接管。若提示连接被拒绝,先核对实际监听端口和内核运行状态。

DNS 段:解析入口与 Fake-IP

DNS 配置影响域名如何交给内核解析。下面是便于理解的最小片段:监听本机 1053 端口,使用 Fake-IP 模式,并指定一个加密上游。它不是适配所有网络的推荐方案;上游地址必须在当前网络中可达。

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

1053 监听与系统 DNS 是两件事

listen 只是让内核提供 DNS 服务。仅写入这个字段,不会自动把系统 DNS 改成该入口;普通系统 DNS 设置通常也不能直接填写自定义端口。是否接管系统 DNS,还取决于 TUN 的 DNS 劫持、系统网络设置和实际路由。

Fake-IP 不是真实服务器地址

198.18.0.1/16 在此用于内核的虚拟地址映射。应用拿到映射地址后,内核根据保存的域名关系继续匹配规则和建立连接。因此,看到这一网段不必立即判断为解析错误;更应检查请求是否被送回同一个内核,以及映射关系是否仍然有效。

  • dns.ipv6: false 在此用于不向调用方返回 AAAA 结果,与顶层 ipv6 的作用范围不同。
  • nameserver 是主要解析上游。使用带域名的上游地址时,还需考虑该上游域名本身的引导解析。
  • 节点的 server 如果是域名,也需要能够解析。复杂配置可单独使用 proxy-server-nameserver 指定节点域名解析上游。
  • 不要一次同时修改上游、Fake-IP 过滤和 TUN 劫持。每次只改一项,才能判断故障来自哪里。

proxies:节点参数必须与服务端对应

proxies 是列表,每个节点以 - name: 开始。不同协议的必需字段不同;Shadowsocks 的密码与加密方式,不能直接套用到需要 UUID 或 TLS 参数的其他协议。下面仅演示 Shadowsocks 节点的字段层级。

proxies:
  - name: "示例节点"
    type: ss
    server: 192.0.2.10
    port: 443
    cipher: chacha20-ietf-poly1305
    password: "yaml-demo-password"
    udp: true

name 是供策略组引用的本地名称,可以使用中文;server 才是远端服务器地址。udp: true 表示在该节点配置中启用 UDP 能力,并不保证服务端、线路和应用都支持 UDP 转发。

如果服务提供方给的是完整 Clash 订阅,通常已经包含节点参数,不需要手工重写。另一个常见结构是 proxy-providers:它把节点交给提供器管理,策略组通过 use 引用提供器名称。不要把提供器名称直接当成单个节点名塞进组内的 proxies 列表。

proxy-groups:把节点组织成可选出口

定义节点后,再创建策略组。select 表示由用户手动选择组内出口,适合验证配置引用是否正确。下面的“手动选择”同时提供示例节点和直连出口。

proxy-groups:
  - name: "手动选择"
    type: select
    proxies:
      - "示例节点"
      - DIRECT

DIRECT 是内置直连出口,不需要出现在顶层 proxies 中。REJECT 也是内置出口,用于拒绝连接。自定义组名应避免与这些内置名称冲突,也不要创建同名节点和同名策略组。

自动测速不是下载速度测试

url-test 策略组会按配置的探测地址和间隔比较候选出口的探测延迟。例如 interval: 300 表示间隔 300 秒,tolerance: 50 可设置以毫秒计的切换容差。探测结果受目标站点和线路影响,不能直接换算为大文件下载速度。

初次调试优先保留一个手动组。先确认节点可连接、规则引用正确,再增加自动选择或故障转移。多个策略组可以互相引用,但必须避免 A 引用 B、B 又引用 A 的循环依赖。

rules:从上到下,首次命中生效

在 mode: rule 下,规则通常按从上到下的顺序匹配,命中后交给指定出口。精确规则放前面,兜底规则放最后。下面的域名仅用于说明匹配范围,不代表某类网站必须直连或必须代理。

rules:
  - DOMAIN,example.com,DIRECT
  - DOMAIN-SUFFIX,example.org,手动选择
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - MATCH,手动选择
  • DOMAIN,example.com:匹配这个完整域名,不自动包含 www.example.com。
  • DOMAIN-SUFFIX,example.org:匹配该域名及其子域名,不是任意字符串包含匹配。
  • IP-CIDR:按目标 IP 网段匹配;例子列出两个私有地址段,并非完整的局域网地址集合。
  • no-resolve:避免为了这一条 IP 规则主动触发域名解析,不代表整个连接永远不需要 DNS。
  • MATCH:接住前面未命中的连接。放在开头会使后续规则失去匹配机会。

规则没生效,先检查模式和新连接

如果客户端当前处于全局模式,不能用规则模式的预期判断结果。切回规则模式后,核对连接记录中的目标域名、命中规则和实际出口。只有 IP、没有可用域名信息的连接,也不能保证命中预想的域名规则。

修改规则或切换策略后,应新建连接再测试。浏览器可能复用已有 TCP 或 QUIC 连接,原连接不会因为配置文字改变就自动按新规则重建。必要时关闭对应连接后重试,而不是连续刷新同一个已复用的会话。

TUN:接管入口,不替代规则与 DNS

TUN 模式通过虚拟网卡把流量交给内核,适用于不读取系统代理设置的应用。它与 mixed-port 是不同的接入方式,但接管后的连接仍需要策略组和规则决定出口。下面保持关闭状态,只展示 mihomo 常见字段的层级。

tun:
  enable: false
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

auto-route 用于自动配置路由,auto-detect-interface 用于自动识别出站接口;具体支持和行为受系统与内核版本影响。dns-hijack 中的 any:53 用于处理被接管的普通 DNS 流量,并不能据此宣称应用自带的 DoH 或全部加密 DNS 都被接管。

启用 TUN 通常需要系统授权。FlClash 的界面开关也可能参与生成最终配置,因此不能只看订阅文件里的 enable 就断言运行状态。应结合虚拟网卡、路由、客户端状态和连接记录确认。若系统同时运行其他 VPN,先记录原状态,再逐个停用做对照,避免同时修改多个接管入口。

缩进检查与最小可加载示例

YAML 用缩进表达结构,建议统一使用两个空格,不使用 Tab。顶层的 dns、proxies、proxy-groups 和 rules 应对齐;同一节点里的 type、server、port 则应处在同一级。

  1. 检查冒号后的空格。mode: rule 是键值写法,mode:rule 可能被当作普通字符串。
  2. 检查列表横线。节点、组内候选项、规则都是列表,但各自所属层级不同。
  3. 检查特殊字符。密码或名称中含有 #、冒号加空格等内容时,使用合适的引号;双引号字符串里的反斜杠还涉及转义。
  4. 检查重复键。不要在文件末尾再追加第二个顶层 rules。应把规则合并到原列表,重复键可能报错或造成覆盖。
  5. 检查名称引用。“手动选择”和“手动选择 ”不是同一个名称;节点和策略组改名时,引用位置也要一起修改。

先验证直连结构,再加入真实节点

下面是一份独立的最小配置,所有连接最终都直连。它不提供远端代理能力,适合在本地副本中验证端口、策略组和规则的基本结构。不要把它当成订阅替代品覆盖当前常用配置。

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

proxies: []

proxy-groups:
  - name: "手动选择"
    type: select
    proxies:
      - DIRECT

rules:
  - MATCH,手动选择

如果使用独立 mihomo 程序,可执行 mihomo -t -f ./config.yaml 检查指定文件。检查通过只说明内核能够接受配置,不证明节点认证正确、上游 DNS 可达或路由已经接管。FlClash 管理的配置则应在客户端内重新加载,再查看实际报错。

继续配置时,可结合进阶配置说明核对策略组、规则和 TUN 的关系;需要从订阅导入开始操作,则按配置教程完成导入与模式选择。配置文件说明了意图,最终生效结果仍应以客户端运行状态和连接记录为准。