config.yaml 结构总览
一份完整的配置文件由几个顶层字段组成,理解这张表之后,后面每一节展开的都是其中某一个字段的详细写法:
| 字段 | 作用 |
|---|---|
port / socks-port | 本地 HTTP / SOCKS5 代理端口 |
allow-lan | 是否允许局域网设备连接本机代理 |
mode | 运行模式:rule(按规则分流)、global(全局代理)、direct(全局直连) |
log-level | 日志详细程度:silent / error / warning / info / debug |
external-controller | RESTful API 监听地址,配合面板类客户端使用 |
dns | DNS 分流与防泄漏相关配置 |
proxies | 本地手写的节点列表(订阅节点不需要写在这里) |
proxy-groups | 策略组定义 |
proxy-providers | 远程节点提供者(订阅链接的底层机制) |
rule-providers | 远程规则集提供者 |
rules | 最终生效的分流规则列表,从上到下逐条匹配 |
config.yaml(或其中的 proxies/rules 片段)并合并到本地配置,理解了这份结构,手动排查订阅问题会容易很多。
代理协议参数详解
如果需要手动添加节点(而不是完全依赖订阅),下面是几种主流协议在 proxies 字段下的核心参数:
Shadowsocks
核心字段是 cipher(加密方式,如 aes-256-gcm、chacha20-ietf-poly1305)与 password;部分节点还会附带 plugin(如 obfs 或 v2ray-plugin)用于流量混淆。
VMess
需要 uuid 与 alterId(新版通常为 0),cipher 常见为 auto;若节点开启了 TLS,还需要填写 tls、servername(即 SNI)等字段。
Trojan
核心字段是 password 与 sni,Trojan 默认强制使用 TLS 伪装为正常 HTTPS 流量,因此 sni 是否与证书域名匹配会直接影响可用性。
Hysteria2
基于 QUIC 协议,核心字段是 password 与 up / 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 |
GEOIP | IP 归属地(配合 GeoIP 数据库) | GEOIP,CN,DIRECT |
IP-CIDR / IP-CIDR6 | IPv4 / 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)。
策略组高级参数
除了基础的 type 和 proxies,策略组还有几个值得了解的进阶参数:
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 名称分别引用即可,顺序仍然遵循从上到下逐条匹配的规则。