规则
Chute 根据自定义规则将请求转发到另一个代理服务器或直接连接到目标主机。
优先级
规则按照配置文件中出现的顺序从上到下依次匹配。换句话说,列表顶部的规则优先级高于后面的规则。模块添加的规则按模块加载顺序排在配置文件自身的规则之前,而 Chute 运行时为 Tailscale 插入的规则又排在这两者之前。
组成
每条规则由 3 个部分组成:规则类型、流量匹配器(FINAL 规则除外)和策略:TYPE, VALUE, POLICY。例如:DOMAIN-SUFFIX,apple.com,DIRECT IP-CIDR,192.168.0.0/16,ProxyA
策略必须是某个代理服务器、策略组或内置策略(如 DIRECT、REJECT 及其变体,或 PROXY)的名称。规则应以一条 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 |
明文 HTTP 请求的完整 URL 匹配正则 |
| PROTOCOL | PROTOCOL,TLS,Proxy |
检测到的协议(HTTP/TLS/QUIC 等) |
进程规则(macOS 与 Android)
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| 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 |
入站代理服务器名称 |
注意:SUBNET 与 HOSTNAME-TYPE 会匹配实际流量——SUBNET 依据设备当前所在的网络匹配(Apple TV 没有网络身份,SUBNET 在其上永不命中)。IN-TYPE 与 IN-USER 同样匹配实际流量:IN-TYPE 给出连接所经的入站(
HTTP、SOCKS5或TUN),IN-USER 给出该入站依据http-auth校验通过的用户名——没有配置凭据时无从校验,IN-USER 便不会命中任何流量。IN-NAME 只为让 Surge 配置能加载而接受:Chute 只跑一个未命名的 HTTP 监听器和一个未命名的 SOCKS5 监听器,没有可匹配的入站名称,因此该规则永不命中;请改用 IN-TYPE 或 IN-PORT。
逻辑组合规则
| 类型 | 语法 | 匹配条件 |
|---|---|---|
| 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
在 RULE-SET 行上,no-resolve 作用于集合中的每一条基于 IP 的规则,就像它们各自都带了这个选项:RULE-SET,https://example.com/cn-ip.list,DIRECT,no-resolve。内置的 SYSTEM 和 LAN 集合会被展开成单独的规则,不接受该选项。
注意:由于采用两轮评估,对于主机名为域名的请求,靠后的非 IP 规则可能先于靠前的基于 IP 的规则匹配。如果 DNS 解析失败,基于 IP 的规则只是不会匹配,最终会应用 FINAL 规则;规则评估不会被中止。
force-remote-dns
强制通过远程代理服务器进行 DNS 解析,而非使用本地 DNS。
DOMAIN-SUFFIX,google.com,Proxy,force-remote-dns
注意:此选项目前仅为兼容性而被解析,在当前版本中没有任何效果。
extended-matching
将基于域名的规则匹配扩展到也检查 HTTP Host 头部,而不仅仅是连接主机名。该头部取自客户端连到 HTTP 代理监听器的连接上的第一个请求——对 HTTPS 而言,就是 CONNECT 请求自身的 Host 头部——因此当客户端把请求发往某个 IP 地址,或发往与其 Host 头部所写不同的名字时,此选项就能派上用场。经 TUN 或 SOCKS5 的连接不带 Host 头部,此选项对它们不起任何作用。
DOMAIN-SUFFIX,example.com,Proxy,extended-matching
requires-resolve
对于 SCRIPT 规则,此选项会被解析器接受,但不会推迟脚本的评估。$request.dnsResult 仅在会话已被解析时才在脚本中可用(例如,直接使用 IP 地址发起的请求,或 DNS 解析后的第二轮匹配)。
SCRIPT,MyRuleScript,PROXY,requires-resolve
pre-matching
仅在策略为 REJECT 或其变体(REJECT-DROP、REJECT-TINYGIF 等)的规则上有效。pre-matching 规则会在规则结果缓存和正常规则表之前的单独一轮中评估,因此匹配到的 REJECT 会在第一轮就生效,早于规则表可能触发的任何 DNS 解析。RULE-SET 或 DOMAIN-SET 行会接受并保留 pre-matching,但该集合不会在这提前的一轮中匹配:它仍然在规则列表中自己的位置参与匹配。
DOMAIN-SUFFIX,tracker.example.com,REJECT,pre-matching
dns-failed
仅对 FINAL 规则有效。当请求的判定需要本地 DNS 解析、而这次解析失败时,请求会改交给 FINAL 策略处理,而不是直接失败——详见最终规则。
FINAL,Proxy,dns-failed
notification-text
规则命中时发送一条系统通知:标题是这段文字,正文写明目标与策略(host:port → policy;在 Android 上为 host:port · policy · process)。notification-interval 设置同一条规则两次通知之间至少间隔多少秒(默认 300)。任何规则都可以带这两个选项,包括 FINAL。RULE-SET 或 DOMAIN-SET 行会接受并保留它们,但集合内的匹配永远不会发送通知。
DOMAIN-SUFFIX,bank.example,DIRECT,notification-text="Bank site opened",notification-interval=60
FINAL,Proxy,notification-text=Fell%20to%20FINAL
文字中含空格时加引号,或把每个空格写成 %20;逗号写成 %2C。通知由 Chute 自己发出,并遵循应用里管这件事的开关——iPhone 上是允许通知,Mac 上是显示事件上报通知,Android 上是系统授予 Chute 的通知权限——关掉它就什么都不会显示,Apple TV 上也从不显示。每次命中还会记录为一条规则通知事件——见通知报告。
别名
DOMAIN-MATCH可作为DOMAIN-KEYWORD的别名使用。NETWORK可作为PROTOCOL的别名使用。DST-PORT可作为DEST-PORT的别名使用。
域名集
Chute 支持通过 DOMAIN-SET 规则类型从外部 URL 加载域名集。类型之后的第一个字段必须是 http(s) URL。可选的 update-interval 参数表示下载的副本最多可以存在多久(秒),超过后才会重新获取;并没有定时器——见外部规则集。
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 匹配该域名及其所有子域名。以 # 或 // 开头的行为注释。
本页为英文版的翻译。如内容有出入,以英文版为准。