config.yaml 结构总览

一份完整的配置文件由几个顶层字段组成,理解这张表之后,后面每一节展开的都是其中某一个字段的详细写法:

字段作用
port / socks-port本地 HTTP / SOCKS5 代理端口
allow-lan是否允许局域网设备连接本机代理
mode运行模式:rule(按规则分流)、global(全局代理)、direct(全局直连)
log-level日志详细程度:silent / error / warning / info / debug
external-controllerRESTful API 监听地址,配合面板类客户端使用
dnsDNS 分流与防泄漏相关配置
proxies本地手写的节点列表(订阅节点不需要写在这里)
proxy-groups策略组定义
proxy-providers远程节点提供者(订阅链接的底层机制)
rule-providers远程规则集提供者
rules最终生效的分流规则列表,从上到下逐条匹配
提示: 订阅链接本质上就是客户端按固定周期请求这份 config.yaml(或其中的 proxies/rules 片段)并合并到本地配置,理解了这份结构,手动排查订阅问题会容易很多。

代理协议参数详解

如果需要手动添加节点(而不是完全依赖订阅),下面是几种主流协议在 proxies 字段下的核心参数:

Shadowsocks

核心字段是 cipher(加密方式,如 aes-256-gcmchacha20-ietf-poly1305)与 password;部分节点还会附带 plugin(如 obfsv2ray-plugin)用于流量混淆。

VMess

需要 uuidalterId(新版通常为 0),cipher 常见为 auto;若节点开启了 TLS,还需要填写 tlsservername(即 SNI)等字段。

Trojan

核心字段是 passwordsni,Trojan 默认强制使用 TLS 伪装为正常 HTTPS 流量,因此 sni 是否与证书域名匹配会直接影响可用性。

Hysteria2

基于 QUIC 协议,核心字段是 passwordup / down(上传/下载带宽提示值),在弱网或高延迟线路上通常比传统 TCP 协议更稳定。

WireGuard

字段风格与前面几种不同:需要 private-key、对端 public-key,以及 ip(本机在 WireGuard 内网中的地址),配置较为底层,一般由节点提供方直接给出完整片段。

点开查看几种协议的字段示例
proxies:
  - name: "ss-node"
    type: ss
    server: example.com
    port: 443
    cipher: aes-256-gcm
    password: "your-password"

  - name: "trojan-node"
    type: trojan
    server: example.com
    port: 443
    password: "your-password"
    sni: example.com

  - name: "hy2-node"
    type: hysteria2
    server: example.com
    port: 443
    password: "your-password"
    up: "50 Mbps"
    down: "200 Mbps"

规则语法完全参考

规则格式统一为 规则类型,匹配内容,目标策略,从上到下逐条匹配、命中即停。下面是常用规则类型的完整列表:

规则类型匹配对象示例
DOMAIN完全匹配的域名DOMAIN,ad.example.com,REJECT
DOMAIN-SUFFIX域名后缀DOMAIN-SUFFIX,google.com,PROXY
DOMAIN-KEYWORD域名中包含的关键字DOMAIN-KEYWORD,youtube,PROXY
DOMAIN-REGEX正则表达式匹配域名DOMAIN-REGEX,^ad\d+\.com$,REJECT
GEOIPIP 归属地(配合 GeoIP 数据库)GEOIP,CN,DIRECT
IP-CIDR / IP-CIDR6IPv4 / IPv6 地址段IP-CIDR,192.168.0.0/16,DIRECT
SRC-IP-CIDR发起请求的本机源 IP 段SRC-IP-CIDR,192.168.1.100/32,DIRECT
SRC-PORT / DST-PORT源端口 / 目标端口DST-PORT,22,DIRECT
PROCESS-NAME发起请求的进程名(分应用代理的底层机制)PROCESS-NAME,com.app.id,PROXY
RULE-SET引用一个 Rule Provider 规则集RULE-SET,reject,REJECT
MATCH兜底规则,匹配所有未命中的流量MATCH,PROXY
提示: 规则越具体、越常访问就应该放得越靠前,把耗时的 DOMAIN-REGEX 或大型 RULE-SET 放在明显不会命中的位置之前,会拖慢每一次请求的匹配速度。

Provider 机制:Proxy Provider 与 Rule Provider

Provider 是 Clash 管理「远程、可自动更新」资源的统一机制——订阅链接背后其实就是一个 Proxy Provider,规则集背后就是一个 Rule Provider,两者都支持定期自动拉取更新,无需手动替换文件。

proxy-providers:
  my-sub:
    type: http
    url: "https://example.com/api/v1/subscribe?token=xxx"
    interval: 3600
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 300

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./rules/reject.txt
    interval: 86400

其中 interval 控制自动更新周期(单位秒),health-check 让客户端定期对 Provider 下的节点批量测速,behavior 则告诉客户端规则集里的内容是域名列表(domain)、IP 段(ipcidr)还是完整规则(classical)。

策略组高级参数

除了基础的 typeproxies,策略组还有几个值得了解的进阶参数:

  • lazy —— 为 url-test / fallback 组开启后,只有在实际被使用时才后台测速,减少空闲时的资源占用;
  • tolerance —— 延迟容差(毫秒),新节点延迟只有比当前节点低于这个值才会触发切换,避免因测速抖动频繁切换节点;
  • strategy(仅 load-balance 组)—— 负载均衡策略,常见为 consistent-hashing(同一目标地址固定走同一节点,适合需要会话保持的场景)或 round-robin(依次轮询);
  • disable-udp —— 禁用该策略组下节点的 UDP 转发,部分节点或线路对 UDP 支持不佳时可以关闭。

DNS 高级配置

DNS 配置除了开关防泄漏,还可以精细控制解析行为:

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
  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  nameserver-policy:
    "geosite:cn": [223.5.5.5, 119.29.29.29]
  fallback-filter:
    geoip: true
    geoip-code: CN

enhanced-mode: fake-ip 是最常见的模式,客户端给每个域名分配一个虚拟 IP 再在代理层还原真实域名,兼容性最好;nameserver-policy 可以按域名归属分别指定用哪组 DNS 解析,fallback-filter 则用来判断某次解析结果是否「像是」被污染,从而决定要不要改用 fallback 列表重新查询。

TUN 模式参数详解

TUN 模式的核心参数如下:

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

stack 决定虚拟网卡的实现方式,system 兼容性最好,gvisor/mixed 在部分场景下性能更好;auto-route 开启后客户端会自动接管系统路由表,auto-detect-interface 让客户端自动识别当前使用的物理网卡,避免手动指定;dns-hijack 用于强制接管走 UDP 53 端口的 DNS 请求,防止应用绕过系统 DNS 设置直接查询。

外部控制与 RESTful API

设置 external-controller 后,Clash 会在指定地址上开放一套 RESTful API,配合仪表盘类客户端可以实时查看连接、切换节点、查询延迟等,而不需要重启客户端。

external-controller: 127.0.0.1:9090
secret: "your-strong-secret"
安全提示: 务必设置 secret 并保证 external-controller 只监听本机地址(127.0.0.1),如果绑定到 0.0.0.0 又没有设置密钥,相当于把代理控制权限暴露给整个网络。

性能与安全建议

  • 优先使用 RULE-SET 引用规则集,而不是把成百上千条 DOMAIN-SUFFIX 平铺在 rules 里,前者匹配效率更高、维护也更方便;
  • 把访问频率最高、最明确的规则放在 rules 列表靠前的位置,减少平均匹配次数;
  • 非必要不要把 log-level 设为 debug 长期运行,详细日志会持续占用磁盘和内存;
  • external-controller 一律设置 secret,多设备/多平台之间不要复用同一个密钥;
  • 策略组的测速间隔不宜过短,几十秒到几分钟一次足够及时发现节点异常,过于频繁反而增加节点侧压力和本机资源占用;
  • 自定义覆写的规则和策略组建议单独存放备份,订阅更新或重装客户端后可以快速找回。

常见问题

为什么改了配置文件不生效?

大多数客户端需要手动点击「重新加载配置」或重启客户端才会应用改动;如果是通过订阅管理的配置,直接编辑本地文件可能会在下次自动更新时被覆盖,建议改用覆写功能。

RULE-SET 和直接写规则有什么区别?

效果上是一样的,区别在于维护方式:RULE-SET 是一份可以远程更新的独立文件,规则内容变化时不需要重新导入整份配置;直接写在 rules 里的规则修改后必须手动改动配置文件本身。

fake-ip 和 redir-host 模式该怎么选?

fake-ip 兼容性和速度都更好,是目前的主流选择;redir-host 通过修改 DNS 返回结果实现,某些依赖真实 IP 做校验的应用可能会异常,仅在 fake-ip 模式下遇到明确兼容性问题时再考虑切换。

external-controller 端口被占用怎么办?

修改 external-controller 里的端口号为其他未被占用的端口即可,常见默认端口是 9090;也可以用系统命令查看该端口被哪个进程占用后再决定是否关闭。

策略组一直测速失败怎么排查?

先确认测速地址(url 字段)本身能否被节点访问到,部分测速地址在特定网络环境下会被拦截;也可以换用其他公开的连通性测试地址,或检查节点本身是否已经失效。

可以同时使用多个 Rule Provider 吗?

可以,rule-providers 支持定义任意多个规则集,在 rules 列表里按需通过 RULE-SET 名称分别引用即可,顺序仍然遵循从上到下逐条匹配的规则。

还没看过基础用法?可以先从新手教程了解订阅导入、策略组、规则分流这些基本概念。