规则
Chute 根据自定义规则将请求转发到另一个代理服务器或直接连接到目标主机。
优先级
规则按照配置文件中出现的顺序从上到下依次匹配。换句话说,列表顶部的规则优先级高于后面的规则。
组成
每条规则由 3 个部分组成:规则类型、流量匹配器(FINAL 规则除外)和代理策略:TYPE, VALUE, POLICY。例如:DOMAIN-SUFFIX,apple.com, DIRECT IP-CIDR,192.168.0.0/16,ProxyA
代理策略必须是某个策略名称,包括代理、策略组、DIRECT 或 REJECT。规则应以一条 FINAL 规则结尾,用于定义默认行为。如果配置中没有 FINAL 规则,Chute 的行为等同于在末尾追加了 FINAL,DIRECT。
示例:
[Rule]
DOMAIN-SUFFIX,company.com,ProxyA
DOMAIN-KEYWORD,google,DIRECT
GEOIP,US,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
FINAL,ProxyB
规则类型
基于域名的规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| DOMAIN | DOMAIN,www.apple.com,Proxy |
精确域名匹配 |
| DOMAIN-SUFFIX | DOMAIN-SUFFIX,apple.com,Proxy |
域名后缀匹配 |
| DOMAIN-KEYWORD | DOMAIN-KEYWORD,google,Proxy |
域名包含关键字 |
| DOMAIN-WILDCARD | DOMAIN-WILDCARD,*.apple.com,Proxy |
通配符域名匹配 |
| DOMAIN-REGEX | DOMAIN-REGEX,^mail\..+\.com$,Proxy |
域名正则匹配 |
| DOMAIN-SET | DOMAIN-SET,https://example.com/domains.txt,DIRECT |
从 URL 下载的域名集 |
基于 IP 的规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| IP-CIDR | IP-CIDR,192.168.0.0/16,DIRECT |
IP 地址在 CIDR 范围内 |
| IP-CIDR6 | IP-CIDR6,2001:db8::/32,DIRECT |
IPv6 地址在 CIDR 范围内 |
| GEOIP | GEOIP,US,DIRECT |
GeoIP 数据库中的国家代码 |
| IP-ASN | IP-ASN,13335,DIRECT |
IP 地址属于指定 ASN |
HTTP 层级规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| USER-AGENT | USER-AGENT,Instagram*,DIRECT |
User-Agent 头部 |
| URL-REGEX | URL-REGEX,^http://google\.com,DIRECT |
URL 匹配正则 |
| PROTOCOL | PROTOCOL,TLS,Proxy |
检测到的协议(HTTP/TLS/QUIC 等) |
进程规则(仅 Mac)
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| PROCESS-NAME | PROCESS-NAME,Telegram,Proxy |
进程名(通配符匹配) |
| PROCESS-PATH | PROCESS-PATH,/Applications/Safari.app,Proxy |
完整进程路径(通配符匹配) |
| PROCESS-NAME-REGEX | PROCESS-NAME-REGEX,^Safari$,DIRECT |
进程名(正则匹配) |
端口和来源规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| DEST-PORT | DEST-PORT,80,DIRECT |
目标端口 |
| SRC-IP | SRC-IP,192.168.20.100,DIRECT |
来源 IP 地址(单个 IP 或 CIDR) |
| SRC-PORT | SRC-PORT,52345,DIRECT |
来源端口 |
| IN-PORT | IN-PORT,6152,DIRECT |
Chute 上的入站代理端口 |
高级匹配规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| SUBNET | SUBNET,TYPE:WIFI,Proxy |
网络子网属性(TYPE、BSSID、SSID、ROUTER) |
| HOSTNAME-TYPE | HOSTNAME-TYPE,AAAA,Proxy |
DNS 记录类型(A/AAAA 等) |
| IN-TYPE | IN-TYPE,SOCKS5,Proxy |
入站连接类型(HTTP/SOCKS5/TUN) |
| IN-USER | IN-USER,user1,Proxy |
入站认证用户名 |
| IN-NAME | IN-NAME,my-proxy,Proxy |
入站代理服务器名称 |
注意:高级匹配规则可以被配置解析器接受,但当前的 Chute 版本尚未填充它们所匹配的会话属性,因此这些规则在运行时不会匹配任何流量。它们为未来版本保留。
逻辑组合规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| AND | AND,((DOMAIN,example.com),(DEST-PORT,443)),Proxy |
所有子规则均匹配 |
| OR | OR,((DOMAIN,example.com),(DOMAIN,test.com)),Proxy |
任一子规则匹配 |
| NOT | NOT,((DOMAIN,example.com)),Proxy |
子规则不匹配 |
特殊规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| RULE-SET | RULE-SET,SYSTEM,DIRECT |
来自 URL、规则提供者或内置集合的规则集 |
| SCRIPT | SCRIPT,MyRuleScript,PROXY |
基于 JavaScript 的自定义规则匹配 |
| FINAL | FINAL,ProxyB |
无其他规则匹配时的默认行为(必须放在最后) |
选项
no-resolve
对于主机名是域名的请求,Chute 会分两轮评估规则列表。第一轮中,基于 IP 的规则(GEOIP、IP-CIDR、IP-ASN)会被跳过。如果没有其他规则匹配,Chute 会用 DNS 解析该域名,然后携带解析出的 IP 地址再次评估规则。添加 no-resolve 选项可以让基于 IP 的规则在第二轮中也被跳过,从而只匹配本身就携带 IP 地址的请求。
GEOIP,US,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
注意:由于采用两轮评估,对于主机名为域名的请求,靠后的非 IP 规则可能先于靠前的基于 IP 的规则匹配。如果 DNS 解析失败,基于 IP 的规则只是不会匹配,最终会应用 FINAL 规则;规则评估不会被中止。
force-remote-dns
强制通过远程代理服务器进行 DNS 解析,而非使用本地 DNS。
DOMAIN-SUFFIX,google.com,Proxy,force-remote-dns
注意:此选项目前仅为兼容性而被解析,在当前版本中没有任何效果。
extended-matching
将基于域名的规则匹配扩展到也检查 HTTP Host 头部,而不仅仅是连接主机名。当 SNI 或 CONNECT 目标与 Host 头部不同时,此选项非常有用。
DOMAIN-SUFFIX,example.com,Proxy,extended-matching
requires-resolve
对于 SCRIPT 规则,此选项会被解析器接受,但不会推迟脚本的评估。$request.dnsResult 仅在会话已被解析时才在脚本中可用(例如,直接使用 IP 地址发起的请求,或 DNS 解析后的第二轮匹配)。
SCRIPT,MyRuleScript,PROXY,requires-resolve
pre-matching
仅在策略为 REJECT 的规则上有效。该规则会在正常规则列表之前、并且在规则结果缓存之前的单独一轮中评估,因此拒绝会在协议嗅探或 DNS 解析之前就生效。
DOMAIN-SUFFIX,tracker.example.com,REJECT,pre-matching
别名
DOMAIN-MATCH可作为DOMAIN-KEYWORD的别名使用。NETWORK可作为PROTOCOL的别名使用。
域名集
Chute 支持通过 DOMAIN-SET 规则类型从外部 URL 加载域名集。类型之后的第一个字段必须是 http(s) URL。可选的 update-interval 参数每 N 秒重新下载该文件。
DOMAIN-SET,https://example.com/domains.txt,DIRECT
DOMAIN-SET,https://example.com/domains.txt,DIRECT,update-interval=86400
域名集文件包含纯域名,每行一个:example.com 匹配精确域名;.example.com 或 +.example.com 匹配该域名及其所有子域名。以 # 或 // 开头的行为注释。