先辨认文件:配置、订阅与客户端设置

Clash 配置文件通常是 YAML 文本,常见文件名为 config.yaml。它描述本地监听端口、DNS、代理节点、策略组和分流规则;客户端读取文件后,再由所用内核解释这些字段。订阅链接则是获取配置的一种方式:客户端请求链接、保存返回内容,并按设定周期更新。订阅地址本身不是 proxies 节点,也不能直接写进 rules 当作规则。

先在客户端确认当前选中的是哪份 Profile,再决定是否编辑。多份配置可以同时保存在客户端里,但运行时通常只启用选中的一份。手动改动由订阅生成的文件,可能在下一次更新时被覆盖;需要长期保留的调整,应使用客户端提供的覆写功能,或维护自己可编辑的本地配置。不同客户端支持的覆写入口并不相同,保存前应确认修改作用于原文件还是订阅副本。

动手前复制一份原配置。修改后先检查 YAML 能否被客户端载入,再检查策略组与规则是否按预期工作;“导入成功”和“请求走对出口”是两件事。

基础字段:port、mixed-port 与运行模式

顶层字段从行首开始写。port 是本地 HTTP 代理监听端口,socks-port 是本地 SOCKS5 代理监听端口;mixed-port 则在同一个端口接受 HTTP 与 SOCKS5 代理连接。下例选用混合端口 7890,方便给支持手动代理的应用填写 127.0.0.1:7890。这是本机入口,不是远端节点的端口。

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

allow-lan: false 表示不打算让局域网其他设备使用这台设备的代理入口。确需共享时,还要检查客户端监听地址、系统权限和所在网络,不应只改一个开关。mode: rule 按 rules 决定出口;global 通常让请求统一交给所选策略,direct 则按直连方式处理。模式切换是排查工具,但不能替代正确的规则和节点配置。

iPhone 上还要区分“本地代理端口”和“系统流量接管”。客户端建立 VPN 配置或启用 TUN 后,部分流量可经系统网络扩展进入内核,不要求每个 App 手动填写 7890。具体哪些请求被接管,取决于客户端、系统权限及其网络设置。文件里的 tun 字段也并非所有 iOS 客户端都支持;不要把桌面端的 TUN 示例直接粘贴到手机配置里。

DNS 段:解析结果如何进入规则判断

dns 是一个嵌套对象。enable 控制内核 DNS 功能,nameserver 列出上游解析服务器。使用 fake-ip 时,内核会为符合条件的域名返回保留地址,并维护域名与该地址的映射;后续连接命中映射后,内核仍能知道原始域名,供域名规则匹配。它不是把网站真实地址永久改成保留地址。

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fake-ip-filter:
    - "*.lan"

198.18.0.1/16 是示例中的 Fake-IP 地址段,不是可直接访问的网站地址。fake-ip-filter 可让特定域名不走 Fake-IP 映射;局域网设备名、依赖真实解析结果的服务出现异常时,可以先针对具体域名测试,再决定是否加入过滤。过滤名单越宽,越难判断哪条设置改变了结果。上游 DNS 的选择也应结合实际网络:如果上游不可达,网页可能在连接代理节点之前就卡在解析阶段。

看到“域名规则不生效”时,先确认请求是否仍带有可供匹配的域名信息,以及客户端是否使用了这份配置的 DNS。某些应用直接连接 IP,或自行使用其他解析方式;仅调整 nameserver 并不能保证它们都会命中 DOMAIN-SUFFIX。需要进一步比较 Fake-IP 与 redir-host 的适用情形,可从技术参考核对当前客户端支持的字段。

proxies 与 proxy-groups:节点和选择器分开写

proxies 是具体代理节点的列表。每一项至少需要与其协议对应的名称、类型、服务器地址和端口;认证、加密或传输字段随协议变化。下面使用文档示例域名 proxy.example.net 展示层级,它不是可用的节点地址。真实配置应以服务提供方给出的参数为准,不要仅凭节点名称猜测协议。

proxies:
  - name: "自建 SOCKS5"
    type: socks5
    server: proxy.example.net
    port: 1080

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "自建 SOCKS5"
      - DIRECT

同名的 proxies 在这里出现了两次,但层级不同:行首的 proxies 定义节点;缩进在 proxy-groups 项下的 proxies 列出该策略组可选择的出口。select 是手动选择组,客户端一般会在策略界面显示其中的候选项。DIRECT 是内置直连目标,不必另建同名代理节点。组名与节点名是引用标识,规则里必须写得完全一致。

订阅配置也可能使用 proxy-providers 集中获取节点,再在策略组里引用 provider。这与直接把节点逐个列在顶层 proxies 是两种组织方式。排查“节点列表为空”时,分别检查订阅是否更新、provider 是否被策略组引用,以及当前 Profile 是否就是刚更新的那份。不要把策略组的空白候选列表直接判定为 DNS 故障。

rules:自上而下匹配,出口必须存在

rules 是有顺序的列表。内核通常从上往下检查,命中一条后就采用该条指定的出口;因此范围小的域名规则一般放在范围大的地理位置规则之前,兜底规则放最后。下例中的 节点选择 必须与前面策略组的名称一致。

rules:
  - DOMAIN-SUFFIX,example.org,节点选择
  - GEOIP,CN,DIRECT
  - MATCH,节点选择

DOMAIN-SUFFIX 用于匹配指定域名及其子域名;GEOIP,CN,DIRECT 按目标 IP 的地理位置数据判断,和“这个 App 是国内应用”并不是同一个条件。MATCH 承接前面未命中的请求。若把 MATCH 放在第一行,后面的规则通常就没有匹配机会;若将宽泛规则提前,也可能遮住更精确的域名规则。

规则命中后仍然打不开页面,不等于规则语法一定错。先在客户端连接记录中看请求命中了哪条规则、交给哪个策略组,再检查组里当前选的是节点还是 DIRECT。若目标使用 IP 直连,域名规则可能没有匹配条件;若使用 REJECT,请求会被拒绝而不是尝试代理。关于这些术语的区别,可查术语表。

缩进、顺序与保存:一次只改一处

YAML 用缩进表达层级。顶层的 dns:、proxies:、proxy-groups:、rules: 都从行首开始;其下的对象字段要继续缩进,列表项用短横线加空格表示。建议统一使用空格,不混入 Tab。含冒号、井号或前后空格的名称可以加引号,避免被当成 YAML 语法。大小写同样重要:DIRECT 与自行命名的 Direct 不是同一个引用。

现象优先核对处理方向
配置无法载入报错行附近的缩进、冒号与列表短横线恢复最近一次改动,再逐段添加
规则引用目标不存在规则末尾名称与策略组名称统一名称,并检查大小写
策略组没有可选节点组内的节点名或 provider 引用确认节点已载入,再检查组的候选列表
修改后又恢复原样当前 Profile 的来源与订阅更新记录改用持久化覆写或本地配置

一套稳妥的修改流程是:先备份原文件;只改一个字段或一条规则;保存后让客户端重新载入配置;查看是否出现解析错误;最后用一个明确的目标域名检查连接记录。例如调整 DOMAIN-SUFFIX,example.org,节点选择 时,测试应落在该域名范围内,并确认记录显示预期策略组。测试完再继续下一处修改,出错时才能迅速定位。

配置能被 YAML 解析,也不表示当前内核认识其中每个字段。Clash 与 Clash Meta(mihomo)及各客户端支持的配置项并不完全相同;从其他设备复制配置时,应先核对客户端使用的内核和支持范围。对于 iPhone,尤其要把系统网络扩展权限、Profile 选择、配置语法和实际出站结果分开检查。按这四层逐项排除,比一次替换整份文件更容易找到问题。