策略组
一个策略组可以包含多个策略。它可以是代理服务器、另一个策略组或内置策略(DIRECT、REJECT 及其变体或 PROXY)。
共有七种组类型:select、url-test、fallback、load-balance、random、relay 和 ssid(也可写作 subnet)。[Proxy Group] 段用于声明策略组。smart 类型同样被接受,并会被当作 url-test 处理。其他任何类型的组——Surge 的 external,或 Chute 不认识的类型——会保留成员并按 select 组运行,同时在日志里记录提示,而不是被拒绝。
手动选择组
在用户界面上选择使用哪个策略。
SelectGroup = select, ProxyHTTP, ProxyHTTPS, DIRECT, REJECT
可选参数:default=(初始选中的成员——写它的名称,或从 0 开始计数的索引;Shadowrocket 的 select= 与 policy-select-name= 含义相同)、policy-provider:Name(从代理提供者导入成员)、filter= / exclude-filter=(应用于提供者所提供成员的正则表达式)以及 HIDDEN=true。除 ssid 外,所有组类型还支持订阅与成员参数。
在 iOS 版本中,Today Widget 可以切换前三个未隐藏的
select组的策略;它显示几个组,由应用中的使用 Today Widget 选择策略组设置。在 macOS 版本中,你可以在菜单栏菜单中切换策略。
自动 URL 测试组
通过对 URL 进行延迟基准测试,自动选择使用哪个策略。
AutoTestGroup = url-test, ProxySOCKS5, ProxySOCKS5TLS, url = http://www.google.com/generate_204
参数
url:可选
Chute 会经由每个策略,向该 URL 所在主机的 80 端口发送一个明文 HTTP GET 请求:URL 中的 https:// scheme 或端口都会被忽略,所以请使用在 80 端口提供服务的 http:// URL。测试只关心是否接收到响应数据,即使响应是 HTTP 错误也可以。自带 test-url= 的成员会改为在那个 URL 上探测。省略时,将使用默认的探测 URL http://www.gstatic.com/generate_204。[General] 中的 proxy-test-url 会替换所有未写 url 的组的这一默认值。
interval:可选,秒(默认值:600 秒)。
策略重新测试的频率。一个全局的 1 秒定时器驱动自动重测,每 interval 秒进行一次,无论该策略组是否正在被使用。有两个例外:设置了 lazy=true 的组在首次被使用之前不会开始测试;以及当该组闲置超过 idle-timeout 时,测试会暂停。0 等同于不写。
tolerance:可选,毫秒(默认值:100 毫秒)。
每一轮都会同时测试所有成员。如果最先应答的成员不是正在使用的那个,Chute 会为正在使用的成员再多等最多 tolerance 毫秒(绝不超过这一轮的 timeout):它若在这段时间内应答,就保住自己的位置,否则组会切换到最先应答的那个成员。还没有哪一轮选出成员时,最先应答的成员会被直接采用;没有任何成员应答的一轮不会改变任何东西。0 等同于不写。
timeout:可选,秒(默认值:5 秒)。
如果在超时时间内未完成,则放弃该策略。未写 timeout 或写成 0 时,如果设置了 [General] 中的 test-timeout,则使用它。
lazy:可选(true/false,默认值:false)。
启用后,策略仅在首次使用时进行测试,而不是在启动时测试。
max-failed-times:可选(默认值:0,禁用)。
连续测试失败达到该次数后,策略被视为不健康。此选项仅对负载均衡组有效,不健康的策略会被排除出选择范围。对于 url-test 和 fallback 组,失败次数会被记录,但不影响选择。未设置(0)时,测试失败绝不会排除任何策略。
expected-status:可选(默认值:空)。
expected-status=204
只有状态码符合预期的响应才算成功:单个状态码(204)、范围(200-299),或用 / 连接的两者组合(200/204/300-399)。返回其他状态码的策略会退出本轮测试,并计为一次失败。不属于以上形式的值会被忽略并给出警告,此时接受任何响应。仅在 url-test 组中生效。
idle-timeout:可选,秒。
idle-timeout = 120
当该策略组在超过此时长内未被使用(没有新连接从中选取策略)时,周期性的 URL 测试将暂停。该组再次被使用后,测试会恢复。此选项不会关闭任何连接。
同时支持:HIDDEN=true、filter=、exclude-filter=、policy-provider:Name。
回退组
按优先级选择一个可用的策略。可用性通过访问 URL 进行测试,就像自动 URL 测试组一样。前面定义的策略具有更高的优先级。每一轮都会同时测试所有成员,组会按书写顺序,使用在最近一轮中应答了的第一个成员。在还没有任何一轮完成时,以及某一轮没有任何成员应答之后,它使用第一个成员。一轮的结果在这一轮结束时才生效——所有成员都应答了就立即结束,否则在 timeout 到时结束——所以组不会在一轮进行到一半时更换成员。只有某一轮改变了正在使用的成员才算切换:此时策略组主策略已更改通知会给出切换前后实际在用的成员,interrupt-exist-connections 会关闭原成员上的连接。
FallbackGroup = fallback, ProxySOCKS5, ProxySOCKS5TLS, url = http://www.google.com/generate_204
参数
url:可选
指定要测试的 URL;与 url-test 组一样,探测是向该 URL 所在主机的 80 端口发送的明文 HTTP GET,自带 test-url= 的成员会改为在那个 URL 上探测。省略时,将使用默认的探测 URL http://www.gstatic.com/generate_204。[General] 中的 proxy-test-url 会替换所有未写 url 的组的这一默认值。
interval:可选,秒(默认值:600 秒)。
策略重新测试的频率。语义与自动 URL 测试组相同,唯一的例外是 idle-timeout——它和 expected-status 一样只属于 url-test:fallback 组没有空闲暂停,会一直按间隔测试下去。
timeout:可选,秒(默认值:5 秒)。
如果某个策略在超时时间内未完成,则放弃该策略。未写 timeout 或写成 0 时,如果设置了 [General] 中的 test-timeout,则使用它。
lazy / max-failed-times:可选。
与自动 URL 测试组相同。同时支持:HIDDEN=true、filter=、exclude-filter=、policy-provider:Name。
SSID 组
根据当前网络选择策略:Wi-Fi 名称、接入点、接口类型或路由器。类型也可以写作 subnet,即 Surge 现在使用的名称。
SSIDGroup = subnet, default = ProxyHTTP, cellular = ProxyHTTP, "Home WiFi" = DIRECT, SSID:Office* = ProxySOCKS5, TYPE:WIRED = DIRECT, ROUTER:192.168.1.1 = DIRECT
参数
default:必填。
当未找到匹配的 SSID 选项时使用的策略。
cellular:可选。
蜂窝网络下的策略。如果未提供,将使用默认策略。更准确地说,只要设备不在 Wi-Fi 上且没有成员命中,就使用它。
default为必填。成员是<选择器> = <策略>形式的配对,按顺序检查,第一个命中的生效。选择器可以是网络名称(含空格或冒号时加引号)、SSID:<名称>、BSSID:<地址>、TYPE:WIFI/TYPE:CELLULAR/TYPE:WIRED或ROUTER:<网关地址>;名称可以使用*和?通配符。MCCMNC:可以写,但永远不会命中。在 Apple TV 上,该组始终使用default。
负载均衡组
使用负载均衡策略将请求分配到多个代理上。
LBGroup = load-balance, ProxySOCKS5, ProxyHTTPS, url = http://www.google.com/generate_204, strategy = round-robin
参数
strategy:可选(默认值:round-robin)
指定负载均衡策略:
| 策略 | 描述 |
|---|---|
round-robin |
按顺序将请求均匀分配到所有代理 |
consistent-hashing |
将相同的主机名一致地路由到相同的代理 |
sticky-sessions |
持续为所有连接复用上一次选中的代理;该粘滞选择是全局的(而非按客户端区分),并在做出选择 600 秒后失效 |
url:可选
url = http://www.google.com/generate_204
Chute 会向该 URL 所在主机的 80 端口发送明文 HTTP GET 请求来测试代理的可用性。省略时,将使用默认的探测 URL http://www.gstatic.com/generate_204。只有当 max-failed-times 大于 0 时,测试结果才会影响选择;在默认值 0 下,不健康的代理不会被排除。[General] 中的 proxy-test-url 会替换所有未写 url 的组的这一默认值。
interval:可选,秒(默认值:600 秒)。
interval = 300
重新测试代理可用性的频率。0 等同于不写。
timeout:可选,秒(默认值:5 秒)。
timeout = 3
可用性测试请求的超时时间。未写 timeout 或写成 0 时,如果设置了 [General] 中的 test-timeout,则使用它。
lazy:可选(true/false,默认值:false)。
与自动 URL 测试组相同:在该组首次被使用之前不会开始测试。
max-failed-times:可选(默认值:0,禁用)。
max-failed-times = 3
连续测试失败达到该次数后,代理会被标记为不健康并被排除出负载均衡。在默认值 0 下,测试结果绝不会排除任何代理。如果所有代理都不健康,则会重新使用全部代理。
HIDDEN:可选(true/false,默认值:false)。
HIDDEN = true
启用后,各应用都不再列出该策略组:Chute Mac 的菜单栏菜单和主窗口的代理标签页、Chute iOS 及其 Today Widget、Chute tvOS、Chute Android、Chute Dashboard 以及 Web 控制台都不显示它。规则和其他策略组照常使用它。当前正被选中的隐藏组——例如全局模式正在使用的那个——仍会列出并打勾,让你看得到正在用的是什么。HTTP 控制 API 把全局指向某个 select 组时,各应用的全局列表(平时不含 select 组)也会列出这个组并打勾。HTTP 控制 API 仍返回全部策略组,每个组都带 "hidden": true 或 false。
该键按惯例写作大写,但匹配时不区分大小写,因此 hidden=true 同样有效。同样适用于 select、url-test、fallback 和 ssid 组。
注意:
interrupt-exist-connections参数现在是一个全局[General]设置。请参阅 杂项选项。
随机组
Shadowrocket 的 random 组:每个新连接随机选择一个成员。
RandomGroup = random, ProxyA, ProxyB, ProxyC
每个连接以相同的概率在成员中选择,与之前的连接无关。UDP 只在能中继 UDP 的成员中选择;一个都没有时,该组不中继 UDP,按 udp-policy-not-supported-behaviour 处理。成员的写法与 select 组相同,包括 policy-provider: 引用,成员自己的 underlying-proxy 会保留。它没有可切换的选择:Web 控制台和 HTTP 控制 API 会列出它的成员,但拒绝切换选择,default= 也不起作用。HIDDEN=true 可以像隐藏其他组一样隐藏它。
中继组
按书写顺序把成员串成一条路径。第一个成员直接连接(或经由它自己的 underlying-proxy),之后的每个成员都经由它前面的成员到达,最后一个成员连接目标——与 Clash 和 mihomo 的顺序相同。
RelayGroup = relay, Entry, Exit
经过 RelayGroup 的连接从设备到 Entry,从 Entry 到 Exit,再从 Exit 到目标;目标看到的来源是 Exit。
中继组至少需要两个成员,写法与 select 组相同;成员可以是策略,也可以是另一个策略组。第一个成员可以使用任何协议。之后的每个成员都要经由它前面的成员连到自己的服务器,因此必须是可以串联的类型——见 underlying-proxy;如果某个成员(或成员策略组当前选中的策略)不能串联,连接会被拒绝并记录日志,绝不直接发送。在中继组内,之后的成员自己的 underlying-proxy 会被忽略:它前面的成员就是它的路径。成员中的另一个中继组会在这个位置按它自己的成员展开,整条路径最多 8 跳;成员策略组当前选中的如果是另一个中继组,它的跳无法在连接时拼接进来,连接会被拒绝并记录日志。第一个成员之后的策略只能经由前面的成员到达,Chute 不会直接 ping 它们。WireGuard、AmneziaWG 和 SSH 只保持一条经由自己上游的连接,所以它们可以是第一个成员,但不能是之后的成员。当最后一个成员的 UDP 能经由它前面的成员发出时,中继组也承载 UDP,规则与 underlying-proxy 相同:VMess、VLESS、Trojan 或 AnyTLS 出口经由任何成员都可以,Shadowsocks、SOCKS5、Hysteria2、TUIC 或 MASQUE 出口则要求前面的成员承载 UDP。否则,发往它的 UDP 按 udp-policy-not-supported-behaviour 处理。它没有健康检查,也没有可选择的成员。
订阅与成员参数
以下参数适用于 select、url-test、fallback 和 load-balance 组(underlying-proxy 适用于除 SSID 组外的所有组):
[Proxy Group]
Airport = select, policy-path=https://example.com/nodes.list, update-interval=86400, policy-regex-filter="^(HK|JP) \d{1,2}$"
Everything = url-test, include-all-proxies=true
Streaming = fallback, HK-Node, include-other-group=Airport, policy-regex-filter="^HK"
policy-path=<URL>(Surge)用订阅填充组成员:Chute 会把它转成一个隐藏的format=auto代理提供者,其interval就是该组的update-interval(默认 86400)。policy-regex-filter=只保留名称匹配的节点。这个隐藏的提供者不会出现在任何提供者列表中,也不会写入文件;组的这一行按你写的原样保存。include-all-proxies=true加入[Proxy]段中的所有策略,include-other-group=<组>(可写多次)递归加入另一个组的成员。两者都在整份配置读完后展开;出现循环时会被截断,未知的组名只给出提示。保存的是你自己列出的成员。include-other-group带过来的是另一个组的成员和提供者,而不是它的过滤条件:提供者供给的节点按引入方这个组自己的filter=、policy-regex-filter=和exclude-type=过滤,这就是上面的 Streaming 要自己设一个过滤条件的原因——不设的话,Streaming 会拿到 Airport 订阅里的每一个节点。exclude-type=Shadowsocks|Vmess把整类协议挡在提供者贡献的成员之外——常见理由是客户端无法用它们承载 UDP。多个名字用|分隔,大小写不敏感,并按别名识别,所以ss与Shadowsocks指的是同一类型。它不影响你自己列出的成员,保存配置时会原样写回。underlying-proxy=<策略>(Surge Mac 6.9 / iOS 5.22)让整组的代理成员经由同一个上游:每个直接列出的、来自policy-path、include-all-proxies或include-other-group的代理策略,都以派生策略「成员名 (via 上游)」出现在组里,经由该上游连接,并取代成员自己的underlying-proxy。原来的策略在别处照旧使用。成员是策略组的不受影响(它可以写自己的underlying-proxy),DIRECT和REJECT原样保留。若组经由它自己串联,经过它的连接会被拒绝并记录日志。external-policy-modifier="键=值,…"(Surge)覆盖经policy-path导入的每个策略的这些参数,例如external-policy-modifier="test-url=http://apple.com/,tfo=true"。它只作用于订阅导入的策略;要让整组经由上游,请用上面的underlying-proxy。- 参数按引号外的逗号切分,所以含逗号的正则(比如上面那个)必须加引号。
- Chute 不认识的参数,如
evaluate-before-use、no-alert、icon-url或persistent,会被保留并写回,但不起作用。
代理提供者
代理提供者允许你从外部来源(文件或 URL)导入代理列表。在 [Proxy Provider] 段中定义:
[Proxy Provider]
MyProvider = url=https://example.com/proxies.yaml, interval=3600
参数
| 参数 | 必填 | 描述 |
|---|---|---|
type |
否 | http(默认)或 file。规则集另有 inline 形态,写在 [Ruleset <名称>] 段里;代理提供者没有内联形态,这里写 type=inline 不会带来任何成员 |
url |
type=http 时必填 |
获取代理列表的 URL |
path |
type=file 时必填 |
代理列表的本地文件路径 |
interval |
否 | 缓存时限(秒)(默认:86400)。每次加载策略时——引擎启动时和重新加载配置时——比这更旧的缓存副本会在后台重新拉取;引擎运行期间不会刷新任何内容。0 永远不刷新缓存副本,但没有缓存时仍会做一次初始拉取;负值则永远不会拉取,除非存在上次成功的缓存,否则该提供者一直不生效 |
format |
否 | 载荷格式:native 或 surge 读取 [Proxy] 风格的行列表;auto 或不写时按内容判断;mihomo-yaml 读取 YAML 文档,若载荷明显是行列表则改按行列表读取 |
filter |
否 | 用于包含匹配代理名称的过滤正则表达式 |
exclude-filter |
否 | 用于排除匹配代理名称的过滤正则表达式 |
underlying-proxy |
否 | 该提供者的每个节点都经由这个策略或策略组连接(mihomo 的 override: dialer-proxy),取代节点自己的上游。见 underlying-proxy |
policy |
否 | 下载列表时经由的策略或策略组(mihomo 的 proxy:);若是策略组,使用下载开始时它选中的策略。不写或写 DIRECT 时直接下载;名称未定义时拒绝下载,而不是改为直接下载 |
YAML 载荷是 mihomo 风格的文档,包含
proxies:(或payload:)列表;行列表载荷则每行一个[Proxy]风格的策略,例如Name = trojan, example.com, 443, password=…。
代理提供者在策略组中通过 policy-provider: 前缀引用:
[Proxy Group]
MyGroup = select, policy-provider:MyProvider
本页为英文版的翻译。如内容有出入,以英文版为准。