导入

Chute 可以导入为其他客户端编写的代理配置。它接受两类输入:单节点的分享链接(ss://、vmess:// 等),以及 Clash/mihomo YAML 或 sing-box JSON 格式的完整配置文件。两者都会被转换成原生的 Chute 配置——你最终得到的是一份带有 [Proxy]、[Proxy Group] 和 [Rule] 段的普通 Chute 配置文件,而不是一个由 Chute 持续解释执行的外部文件。

http:// 和 https:// 地址永远不会被当作分享链接。它们是订阅地址:内容会先被下载下来,再根据正文的实际内容进行导入。


分享链接——单条链接,或者正文是一串分享链接的订阅——目前只有 Chute Mac 能导入。Chute iOS 没有分享链接导入:它的首次引导可以从扫到的二维码里设置一台服务器,二维码里得是 ss://、vmess://、vless://、trojan://、hysteria2://、socks5:// 或 ssh:// 链接,而且基本上只取服务器地址、端口和凭据——没写端口的链接按下表的默认端口处理。Chute tvOS 与 Chute Android 不读取分享链接。

协议头 生成的策略类型 默认端口
ss:// ss 8388
vmess:// vmess 443
vless:// vless 443
trojan:// trojan 443
hysteria2://、hy2:// hysteria2 443
tuic:// tuic 443
anytls:// anytls 443
socks5://、socks:// socks5 1080
ssh:// ssh 22

大多数链接采用 userinfo@host:port?query#name 的形式。有两个例外:vmess:// 承载的是一个 base64 编码的 JSON 对象(v2rayN 格式,字段名为 add / ps / scy / net / aid),而 ss:// 同时接受 SIP002(base64(method:password)@host:port)和更早的整体编码形式 base64(method:password@host:port)。Base64 负载可以不带填充,也可以使用 URL 安全字母表。

trojan://password@example.com:443?sni=example.com&alpn=h2,http/1.1#Tokyo%20Node

会转换为:

[Proxy]
Tokyo Node = trojan, example.com, 443, password=password, tls=true, sni=example.com, alpn=h2|http/1.1

# 之后的文本会经过百分号解码,成为策略名称;vmess:// 则改为从 ps 字段取名。没有名称的链接以 host:port 命名。配置格式保留的字符——=、,、[、]、"、制表符和换行符——在名称中会被替换成空格。

Trojan、Hysteria2、TUIC 和 AnyTLS 都是仅支持 TLS 的协议,因此即使链接中没有写明,也会补上 tls=true。

多条链接。一份内容可以是多条以换行分隔的分享链接,外层还可以再套一层 base64。每一行只要能解析就会生成一个策略,重复的名称会加上 2、3 …… 后缀,这样规则和策略组仍然可以逐个指向每个节点。无法解析的行会以警告形式报告,内容中的其余部分照常导入;只有在完全没有任何内容能被转换时,导入才会失败。

协议头不在上表中的链接不会被识别为分享链接。协议头已知但缺少必填字段的链接会被拒绝,并给出指明该协议头的提示信息。

只有下列查询参数会被读取;链接中的其他内容都会被忽略。

下文的「查询式链接」指所有把设置放在查询字符串里的协议头:vless://、trojan://、hysteria2://、tuic://、anytls://、socks5:// 和 ssh://。ss:// 和 vmess:// 由各自的解析器读取,放在表格之后说明。

参数 适用于 转换为
sni、peer、servername 查询式链接 sni
alpn(以逗号分隔) 查询式链接 alpn(各值以 `\ ` 连接)——只有 TUIC、Hysteria2 和 MASQUE 策略会读它,见通用参数
fp 查询式链接 fingerprint(uTLS ClientHello 指纹)
allowInsecure、insecure、skip-cert-verify 查询式链接 skip-cert-verify=true
security=tls、xtls、reality 查询式链接 tls=true;在 socks5:// 上它会选中 socks5-tls 策略类型
pbk、sid REALITY reality=true、public-key、short-id,以及取自 sni / servername 的 server-name=
flow VLESS xtls=true、flow
type/network=ws + path、host 查询式链接 ws=true、ws-path、ws-headers=Host:…
type/network=grpc + serviceName、servicename(或 path) 查询式链接 grpc=true、grpc-service-name
type/network=xhttp 或 splithttp + path、host、mode 查询式链接 xhttp=true、xhttp-path、xhttp-host、xhttp-mode
obfs、obfs-password(也认 obfs_password)、up、down Hysteria2 同名选项
plugin=… Shadowsocks 见下文

ss:// 只从查询里读 plugin,别的都不读,所以写进 Shadowsocks 链接里的 sni、alpn、fp、allowInsecure、security 和 type= 都会被忽略。vmess:// 根本没有查询字符串:同样这些设置取自它 JSON 内容里的 sni、host、alpn、fp、net、path 和 tls 字段。而那三行传输方式——ws、grpc、xhttp——永远不会落到 hysteria2://、tuic:// 或 anytls:// 链接上:这些策略用的是它们自己的选项加上 TLS 那几项,因为每个协议都自带传输层。

Shadowsocks 的 plugin 值按 name;key=value;… 解析。obfs-local / simple-obfs / obfs 会转换成 obfs 和 obfs_param。v2ray-plugin 会转换成走 WebSocket 的 Shadowsocks:ws=true,path 成为 ws-path,host 成为 ws-headers 里的 Host,tls 成为 tls=true 并把 sni 设为同一个 host;mux 为 0、false、no 或 off 时写成 ws-mux=false,其他取值保持默认。它的 quic 模式没有对应实现:插件会被丢弃,并给出警告 <path>.plugin: Shadowsocks plugin 'v2ray-plugin' in quic mode has no KLNEKit equivalent; the proxy will not connect without it。它的其他选项会被丢弃,警告为 <path>.plugin-opts.<key>: option has no KLNEKit equivalent and was dropped。其他插件都会产生警告并被丢弃:策略照常写出,但无法连接到需要该插件的服务器。

注意:非零的 VMess aid(alterId)会以警告形式报告。Chute 只支持 VMess AEAD,仍然要求旧版 MD5 握手的服务器无法通过认证。


配置文件导入

可以识别三种格式:

格式 处理方式
原生 Chute、Surge 或 Shadowrocket 配置文件 直接使用,不做转换——见 Surge 与 Shadowrocket 配置文件
Clash / mihomo YAML 转换为原生配置
sing-box JSON 转换为原生配置

格式由内容判定,文件名只作为参考。以 { 开头的内容一律按 sing-box JSON 处理,无论文件叫什么名字(存成 .yaml 的 sing-box 配置照样能按 YAML 解析,所以单靠文件名并不可靠)。除此之外,.conf 扩展名表示原生格式,.json 表示 sing-box,.yaml / .yml 表示 Clash。当没有可用的文件名时——例如订阅返回的正文——由第一行有意义的内容决定:#!MANAGED-CONFIG 或者 [Section] 段头表示原生格式,而 proxies:、proxy-groups:、rules:、proxy-providers: 或 rule-providers: 表示 Clash。其他情况一律按原生格式处理。地址提供的内容——下载的或订阅的——按正文判定:从地址取出的名字只在正文里没有上述任何标记时才起作用,所以以 .conf 结尾、却提供 Clash 的地址照样会被转换。

如果一份文档能够解析,却不包含任何一个用来定义其方言的段,它会被拒绝,而不是被报告成一次什么都没导入的成功导入:Clash YAML 至少需要 proxies、proxy-groups、rules、proxy-providers 或 rule-providers 之一,sing-box JSON 则需要 outbounds、endpoints 或 route。

单个无法转换的条目绝不会导致整次导入失败。每个代理、策略组和规则都会被独立转换;在 Chute 中没有对应实现的会被跳过并报告出来。转换结果包含转换后的配置、一份警告列表,以及一份被跳过的源字段列表。同样的警告也会以注释的形式写进转换后的文本,紧挨着它们来源的那一段:

[Proxy]
HK 01 = ss, example.com, 8388, aes-128-gcm, password
# KL-CONVERT-WARNING [proxies[3]]: proxy type 'snell' was skipped — Snell is a Surge-proprietary protocol KLNEKit does not implement

最后,转换后的文本会再用 Chute 自己的解析器重新解析一遍。解析器拒绝的行会被注释成 # KL-CONVERT-DROPPED: … 并报告出来,因此一份 95% 可转换的配置文件仍然能够导入并运行。

会破坏配置格式的节点名称会被改写:, 变成空格,= 变成 -,改写之后若与其他名称冲突,则加上数字后缀。策略组成员和规则的目标策略会同步改写,因此每一处引用仍然指向同一个节点。direct 代理/出站会映射到内置的 DIRECT,reject / block / dns 则映射到 REJECT。

注意:转换得到的配置文件是一份静态快照。Chute 重新下载订阅时会按原生配置文件解析,因此需要经过转换的配置文件在保存时不带自动更新 URL,也不会自行刷新。

Clash / mihomo 转换说明

注意:dialer-proxy 会转换成 underlying-proxy。导入的引用会生效:策略的连接——TCP,以及协议允许时的 UDP——通过指定的上游建立,嵌套引用会形成多跳。缺失或循环引用会按拒绝处理(fail-closed),并写入日志。指向 type: direct 别名的 dialer-proxy 按直连处理。代理提供者的 override: dialer-proxy 会转换成该提供者的 underlying-proxy,override 里的其他键仍会被丢弃并给出警告。规则提供者或代理提供者的 proxy: 会变成它的 policy=,因此该提供者和在 mihomo 中一样经由这个策略下载。

  • 会被转换的代理类型:ss、ssr、vmess、vless、trojan、http、socks5、hysteria2、tuic、anytls、wireguard、ssh。Chute 没有实现的类型——snell、hysteria(v1)、mieru、juicity、shadowquic、trusttunnel、openvpn、sudoku、vmess-http——会被跳过,并给出指明该协议的警告。还有两种类型虽然 Chute 支持对应的协议,但同样会被跳过:masque 代理,因为 mihomo 的字段布局不同;以及 tailscale 代理,它在 [Tailscale] 段中统一配置,并通过内置的 TAILSCALE 策略使用。没有 type: https:HTTPS 代理按 mihomo 的写法是带 tls: true 的 type: http,type: https 会被报告为不支持的代理类型。
  • mihomo 的两个 fingerprint 键含义不同,转换时会区分开:client-fingerprint 转换为 fingerprint(uTLS ClientHello 指纹),fingerprint 转换为 cert-fingerprint-sha256(证书固定)。
  • udp: false 转换为 udp-relay=false,tfo 转换为 tfo=true。启用的 smux 块不会带过来——Chute 的 mux 用的是自己的帧格式,mihomo 或 sing-box 服务端读不了——导入时会说明这一点:<path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off。
  • ss 代理的 plugin 按它的 plugin-opts 转换:obfs(也写作 simple-obfs、obfs-local)转为 obfs 和 obfs_param;v2ray-plugin 的转换与分享链接相同——mode、tls、host、path 和 mux 按那里的说明处理,headers 转为 ws-headers,其中的 Host 取代 host,skip-cert-verify 转为 skip-cert-verify=true。mihomo 默认的 Host bing.com 不会照搬:没有 host 时,使用策略自己的默认值。其他插件会被报告并丢弃。
  • ss 代理的 udp-over-tcp: true 转为 udp-over-tcp=true,并总是写明版本:有 udp-over-tcp-version 时照写,没写时写 1,因为 mihomo 默认使用旧版帧格式,而 Chute 默认是 2。udp: false 时该代理仍不中继 UDP,与 mihomo 一致。
  • trojan 代理一律加上 tls=true:mihomo 的 Trojan 总是走 TLS,所以配置里的 tls: false 会被忽略。wireguard 代理会保留它的 allowed-ips,Chute 会按它执行——见 WireGuard 配置。
  • ssh 代理的 host-key 会转成加引号的 server-fingerprint。写成列表时,所有密钥合成一个 server-fingerprint="…";含有引号或逗号的项无法写进策略行,会被报告并丢弃。
  • 只接受单个值的字段如果写成了列表或映射,会被当作没写;如果该字段是必填的,这一项会被报告并跳过。
  • 策略组类型 select、url-test、fallback 和 load-balance 会连同它们的健康检查选项一起转换。relay 组保留为 relay 组,成员顺序不变:第一个成员直接连接,最后一个成员连接目标。use: 成员会转换成 policy-provider:<name> 引用,include-all / include-all-proxies / include-all-providers 会展开成显式的成员列表。
  • filter 和 exclude-filter 会以带引号的形式保留,但包含逗号或引号的表达式无法在配置行的格式中保存下来,会被丢弃并给出警告。
  • 策略组的 exclude-type 会被原样带过为 exclude-type=:列出的代理类型不会进入提供者提供的成员。tcp-concurrent 没有对应开关——在平台允许的地方,Chute 本就会对一个目的地的多个解析地址(最多五个)并发竞速,其余平台则连接第一个——导入时会这样说明,而不是当成单纯的丢失。
  • 名称不同的规则类型会被重命名:MATCH → FINAL、DST-PORT → DEST-PORT、SRC-IP-CIDR → SRC-IP。REJECT-DROP 和 REJECT-TINYGIF 原样保留,因为两者都是行为各不相同的 Chute 内置策略;目标为 PASS 或 COMPATIBLE 的规则会被跳过。
  • 内联的 rule-provider(type: inline 加上 payload 列表)会展开成等价的具体规则,因为 Chute 的 [Rule Provider] 行无法内嵌 payload。
  • SUB-RULE,(condition),name 规则及其指定的 sub-rules: 映射会展开成普通规则:分支 name 中的每条规则变为 AND,((condition),(rule)),POLICY,分支里的 MATCH,X 变为 condition,X。分支中的 SUB-RULE 会把自己的条件叠加到外层条件上,最多嵌套 8 层。缺失的分支,或绕回正在展开的分支的引用,会被跳过并给出转换警告。
  • 有对应项的通用键会被映射过来:mixed-port 转换为 HTTP 的 port(SOCKS5 需要单独的 socks-port),allow-lan 转换为 allow-wifi-access,log-level 映射到 loglevel,external-controller/secret 转换为外部 HTTP 控制器选项,启用的 sniffer 转换为 sniffing-enabled。
  • bind-address 转换为 interface 与 socks-interface,也就是两个监听器绑定的地址,* 表示所有地址。若同时开启了 allow-lan,Chute 的 allow-wifi-access 仍会把绑定放宽到所有地址,导入时会说明这一点:要保留更窄的绑定,请去掉 allow-wifi-access。
  • authentication 转换为每条凭据一行 http-auth,守护的是同样这两个监听器。用户名与密码之间没有 : 的条目会被报告并丢弃。
  • external-controller-cors 仅在允许来源本就是「任意」时(*,或根本没写列表)转换为 external-http-cors。Chute 的这个开关是全有全无的,所以写了具体来源的配置会保持关闭并说明原因——打开它等于把只授予一个来源的访问权交给所有来源。allow-private-network 没有对应项,该响应头不会发送。
  • mihomo 把进程的精确匹配与通配匹配拆成两种规则类型,Chute 只有一种,而它就是通配那种。因此 PROCESS-NAME-WILDCARD 与 PROCESS-PATH-WILDCARD 转换为 PROCESS-NAME 与 PROCESS-PATH,对 * 与 ? 的理解一致;不含通配符的字面量仍然是精确匹配。
  • tun 在 Chute 有同名键的地方会映射过去:dns-hijack 转为 hijack-dns(mihomo 的 any:53 改写成 *:53),route-address 转为 tun-included-routes,route-exclude-address 转为 tun-excluded-routes。stack、auto-route、auto-detect-interface、auto-redirect、mtu、strict-route、endpoint-independent-nat、device、inet4-address、inet6-address、udp-timeout 和 gso 只会被报告——这些由 Chute 自己决定。
  • DNS 块的映射如下。hosts 转为 [Host] 条目,列表里的每个地址都保留。nameserver 与 fallback 合并成一组,按各条目的写法分别写成 dns-server、doh、dot、doq 或 doh3——Chute 会同时查询所有配置的解析器,单独的 fallback 池无从「回落」,导入时会这样说明。direct-nameserver 与 proxy-server-nameserver 转为 direct-dns-server 与 proxy-dns-server。fake-ip-filter 转为 always-real-ip。nameserver-policy 按每个键转成一条 [Host] 条目;rule-set: 键在该提供者是 http 或 file 类型时转成按集合作键的形式 RULE-SET:<provider> = server:…,geosite: 键则被丢弃并给出警告。
  • 同样在 DNS 块里:use-system-hosts: false 转换为 read-etc-hosts = false。use-hosts: false 没有对应项——[Host] 表始终生效——会被报告。fake-ip-filter-mode: whitelist 会反转过滤语义,而 always-real-ip 表达不了,因此该列表仍按黑名单处理并在导入时说明。default-nameserver 用于引导解析器自身主机名的解析,Chute 走系统解析器完成这一步,导入时会给出可以改写成的 [Host] 行。

sing-box 转换说明

  • 会被转换的出站类型:shadowsocks、vmess、vless、trojan、hysteria2、tuic、anytls、shadowtls、wireguard、http、socks、ssh。selector 和 urltest 会转换成 select 和 url-test 策略组。shadowsocks 的 plugin 中,obfs-local(也写作 simple-obfs 或 obfs)会转换成 obfs 和 obfs_param;v2ray-plugin 的 plugin_opts 字符串(tls;host=…;path=…)按分享链接的方式转换,只是警告里的路径写作 plugin_opts 而不是 plugin-opts;其他插件会被报告并丢弃,出站照常写出,但无法连接到需要该插件的服务器。trojan 出站只有设置了 tls.enabled 才会得到 tls=true,与 sing-box 一致;没有设置的出站会按明文 Trojan 导入——除非服务器确实是明文,否则请补上 tls=true。
  • 出站内部:类型为 xhttp 或 splithttp 的 transport 会转成 xhttp=true,以及 xhttp-path、xhttp-host、xhttp-mode 和 xhttp-headers。启用的 tls.ech 转成 ech=true,它的 config 转成 ech-config=。REALITY 的 public_key 转为 public-key;缺少它的出站照常转换但会给出警告,因为它的 REALITY 握手不可能成功。SSH 的 host_key 列表转成一个带引号的 server-fingerprint="…",包含全部密钥;含有引号或逗号的项会被报告并丢弃。旧式 wireguard 出站的 local_address 列表转成 self-ip 和 self-ip-v6(每个地址族取第一个地址),pre_shared_key 转成 preshared-key,reserved 转成带引号的 reserved="a,b,c";peers 列表会被报告并丢弃,因为 Chute 只配置一个对等节点。
  • endpoints(sing-box 1.11 起)也会转换:wireguard endpoint 转成一个 wireguard 策略及其对应的 [WireGuard <tag>] 段,对等节点的 allowed_ips 成为该段的 allowed-ips;第一个 tailscale endpoint 转成 [Tailscale] 段,通过内置的 TAILSCALE 策略使用。其他类型的 endpoint 会被跳过并给出警告。段名是把策略名里的空白和方括号去掉之后的结果,因为配置行格式在匹配 section-name= 时会丢掉空格;去掉之后会撞名的两个策略,后者会加上 -2、-3 …… 后缀。
  • 拨号字段的映射与 mihomo 路径一致:tcp_fast_open 转为 tfo=true,network: tcp 转为 udp-relay=false。shadowsocks 出站的 udp_over_tcp——true 或 {"enabled": true, "version": 1}——转为 udp-over-tcp=true,只有版本 1 时才写出 udp-over-tcp-version=1:sing-box 的默认版本 2 也是 Chute 的默认值。启用的 multiplex 是有意不带过来的:sing-box 协商的是它自己那套带填充的 smux / yamux / h2mux,而 Chute 的 mux 用的是自己的帧格式,sing-box 服务端读不了,所以该出站转换后不带多路复用,并给出警告说明。detour 转为有效的 underlying-proxy= 引用;嵌套 detour 会形成多跳,循环和缺失引用会按拒绝处理(fail-closed)。wireguard endpoint 的 detour 同样保留,它的隧道经由该上游的 UDP 中继;带有非 direct detour 的 tailscale endpoint 不会被导入,引用它的地方按缺失处理(fail-closed),同样给出警告。
  • route.rule_set:inline 规则集转为 [Ruleset <tag>] 段;remote 和 local 规则集转为带 format=sing-box-source 的 [Rule Provider] 行(type=http / type=file)。编译成二进制格式的规则集会被跳过并给出警告:请改用同一规则集的 source(.json 或 YAML)版本。这条路径上的二进制格式是 .srs,通过 format: binary 或没写 format 且路径以 .srs 结尾来识别;.mrs 只在 Clash 的 rule-provider 路径上嗅探,因为 mihomo 也是那样按扩展名推断格式的。在 macOS 上,只要发布方同时提供了 source 载荷,导入器会把 URL 改指过去;iOS、Apple TV 与 Android 上则不会,因为以二进制发布的那些规则集本来就远超这些平台能加载的体积。旧版本导入的配置把这些规则集写成了 format=mihomo-yaml,从中加载不到任何规则;现在无需重新导入即可加载。远程规则集按 sing-box 的方式下载:经由它的 download_detour、http_client(http_clients 中的标签或内联客户端)或 route.default_http_client,都没有时经由默认出站(route.final)。这条路径会成为该提供者的 policy=;解析为 direct 的则不添加。
  • sing-box 的时长会连单位一起读取:update_interval: 3d 就是三天,d、h、m、s、ms 都认。单位解析不出来时会回落到默认的一天——对一份写着 7d 的配置来说,这并不是它要的。
  • 路由规则依据 action 键处理:route/bypass 使用其指定的出站,reject 转换为 REJECT(method: drop 转为 REJECT-DROP),而 hijack-dns、sniff 和 resolve 不会生成任何内容,因为 Chute 是通过 [General] 控制这些行为的。与 sing-box 相同,同一条规则里同类匹配项之间是「或」,不同类之间必须同时满足:domain、domain_suffix、domain_keyword、domain_regex、ip_cidr、geoip 和 ip_is_private 为一类;port 与 port_range 为一类,source_ip_cidr 与 source_ip_is_private 为一类,source_port 与 source_port_range 也为一类;其余每个匹配项各自成一类。只有一类的规则按每个取值拆成一行,含多类的规则转为一条 AND 规则——{"network": "udp", "port": 443} 转为 AND,((DEST-PORT,443),(PROTOCOL,udp))。带前导点的 domain_suffix(.cn)转为 DOMAIN-SUFFIX,cn。type: logical 规则转为 AND / OR / NOT,invert 会把整条规则包进 NOT,port_range(a:b)与 source_port_range 转为端口区间。rule_set 出现在哪里都是该规则的一个条件,type: logical 与取反规则内部同样如此(见逻辑规则);同一条规则上的多个 tag 互为「或」。其中某个 tag 指向的规则集没能导入时,该 tag 会被丢弃并记录提示,规则保留其余部分——它因此匹配得更少。只有当这条规则引用的每个 tag 都失败,或者这个 rule_set 位于 type: logical 或取反规则内部(在那里丢掉一个分支会改变表达式其余部分的匹配范围)时,整条规则才会被丢弃。Chute 无对应项的匹配项:同类中还有其他匹配项时,只丢弃它并给出警告(规则因此匹配得更少);否则整条规则丢弃并给出警告,而不会被转换成一条匹配范围更大的规则。
  • 应答所有未被 DNS 规则认领的名字的那台 DNS 服务器——dns.final,未写 final 时为第一台——转为 [General] 中对应种类的 DNS 键,它的 detour 写成 #proxy=<策略> 后缀,local 服务器写成 system;不会写出 proxy-dns-server。其他服务器经由 dns.rules 转成的 [Host] 条目使用,其中 local 服务器写作 server:system,普通、DoH、DoQ 或 DoH3 服务器的 detour 写成 #proxy=<策略> 后缀;DoT 服务器的 [Host] 条目不能带该后缀,所以它的 detour 在那里会被丢弃并给出警告。把整个 rule_set 路由到某台解析器的 DNS 规则会转为按集合作键的形式 RULE-SET:<标签> = server:…——但仅限 rule_set 是该规则唯一匹配器的情况,因为 sing-box 要求不同种类的匹配器同时成立,而一个 [Host] 键只能承载一个条件。引用了未能导入成功的集合的规则不会写出条目,理由与它的路由规则被丢弃时相同。

Surge 与 Shadowrocket 配置文件

Surge 或 Shadowrocket 配置文件会被直接读取,不经过转换。Chute 接受各自方言的写法,粘贴过来的配置可以照常使用;下面列出的是与 Chute 原生键不同、或为兼容而加入的写法:

  • 订阅组。 Surge 的 policy-path=<url>(以及 update-interval= 和 policy-regex-filter=)从 URL 加载组成员;include-all-proxies=true 和 include-other-group=<名称> 会加入所有代理或另一个组的成员。Chute 不使用的组参数(如 no-alert、icon-url)在保存配置时会保留。Shadowrocket 的 use=true 表示组里列出的名字是订阅而非代理,每个名字都按代理提供者读取。Shadowrocket 的 random 会成为随机组。Chute 未实现的组类型(如 Surge 的 external)保留成员并按 select 运行,同时记录提示。见策略组。
  • 内置策略。 Shadowrocket 的 PROXY 表示全局代理模式下选中的策略,除非配置里自己定义了 Proxy;每个 REJECT 变体(REJECT-DROP、REJECT-TINYGIF、REJECT-DICT 等)都按其名称行事。见内置策略。
  • 规则。 DST-PORT、端口区间、取值为 IPv4 / IPv6 / DOMAIN / SIMPLE 的 HOSTNAME-TYPE、IP-ASN,AS…、FINAL,<策略>,dns-failed、notification-text= 以及 [Ruleset <name>] 段——见规则。与 Surge 一样,模块规则排在配置自身的规则之前。
  • 通用(Shadowrocket)。 update-url 指的是配置自身的更新地址,也就是 Surge 写在 #!MANAGED-CONFIG 头里的那个,Chute 两种写法都读。同时存在时以头部为准,因为只有头部还能携带 interval 与 strict。update-url 这一行本身会原样保存,所以 Shadowrocket 的配置存回去仍是 Shadowrocket 的配置。close-if-proxy-chain-missing 会被保留,但 Chute 总是像它取 true 时那样,拒绝上游缺失的串联策略。Shadowrocket 只在应用中设置的前置代理,在 Chute 中写作 global-underlying-proxy。
  • DNS。 Shadowrocket 的 direct-dns-server、proxy-dns-server、fallback-dns-server、dns-direct-system、dns-fallback-system(会把 system 追加到 fallback-dns-server,与配置里显式写的合并)、always-ip-address,以及 ssid:<名称> = server:… 形式的 [Host] 行;Surge 的 encrypted-dns-server、allow-dns-svcb、[Host] <域名> = script:<名称> 和 server:force-syslib。见 DNS 服务器与本地 DNS 映射。
  • 通用。 proxy-test-url 和 test-timeout(url-test、fallback 与 load-balance 组的默认值)、udp-policy-not-supported-behaviour、encrypted-dns-skip-cert-verification,以及映射到外部 HTTP 控制器键的 http-api / http-api-web-dashboard。见杂项选项。
  • 代理。 tuic-v5 关键字,以及用 peer = (…) 写法的 [WireGuard <name>] 段。见代理服务器与 WireGuard 配置。
  • HTTP。 header-replace-regex、Body 重写的 http-request / http-response 写法、带 data-type=、status-code= 和 header="Key: value|…" 的 [Map Local]、URL 重写的 reject-array / reject-tinygif,以及 [MITM] 的 h2、hostname-disabled 和 auto-quic-block。见 Header 重写、Body 重写、模拟响应、URL 重写与 HTTPS 解密。
  • 脚本与模块。 [Script] 中的 cronexp=、type=generic 和 event-name=;模块的 #!system_version、#!REQUIREMENT、#!IOS-ONLY / #!MACOS-ONLY / #!TVOS-ONLY,以及模块 [General] 中的 %APPEND% / %INSERT%。其中 #!system_version 和 #!REQUIREMENT 只做记录:Chute 从模块里读出来,但没有任何应用显示它们,两者也都不决定模块是否加载。见 JavaScript 脚本与模块。
  • Chute 未实现的段——[Keystore]、[Port Forwarding]、[Testing]、[DHCP]、[Snell Server]、[Panel]、[Ponte]、[MTProto]——加载时各记录一条提示,保存时原样写回;[Tailscale <name>] 按 [Tailscale] 读取。见配置。

不可用的部分:写了 Chute 未实现协议的 [Proxy] 行不是配置错误。该策略会被丢弃并记一条提示,保存时原行按原样保留,对它的引用变为悬空——运行期按拒绝处理(fail-closed)落到 REJECT,不会漏成 DIRECT。按这种方式识别的协议有:Surge 的 snell、external、h2-connect、trust-tunnel;Shadowrocket 的 hysteria(v1)、juicity、sudoku、openconnect、mieru、brook、lua、http2、http3、relay、subscribe;以及 tailscale——Chute 在 [Tailscale] 段里配置一次,通过内置的 TAILSCALE 策略使用。Chute 没有对应项的 [General] 键同样会被忽略并记录提示,其所在行按原样保留。


限制

  • 代理链承载 TCP 和 UDP。mihomo 的 dialer-proxy 和 sing-box 的 detour 会变成 underlying-proxy 引用,Clash 的 relay 组保留为中继组,各跳顺序不变,提供者的下载路径(mihomo 的 proxy:、sing-box 的 download_detour 或 http_client)会变成它的 policy=。循环、缺失引用,以及经由不承载 UDP 的上游的 QUIC 或 WireGuard 链路会被拒绝并记录,而不会直接发送;使用 udp-over-tcp 的 Shadowsocks 节点经由这样的上游同样能承载 UDP。
  • 在 Chute 中没有对应项的选项会被丢弃并给出警告,而不是默默忽略:代理级别的 ip-version、interface-name、routing-mark、mptcp、packet-encoding、global-padding、authenticated-length 和 encryption,以及 ss 以外代理上的 udp-over-tcp / udp-over-tcp-version;策略组级别的 disable-udp、interface-name 和 routing-mark;以及通用键 geodata-mode、geox-url、find-process-mode、unified-delay、tproxy-port、redir-port 等。策略组的 icon 是例外:它只是图片,不改变任何流量,因此会被默默丢弃。
  • 没有对应项的规则类型会被跳过:IP-SUFFIX、SRC-IP-SUFFIX、SRC-GEOIP、SRC-IP-ASN、DSCP、UID、PROCESS-PATH-REGEX、IP-ACCEPT 和 REMATCH-NAME。带有 mihomo src 修饰符的规则同样会被跳过,以免匹配到错误的端点。
  • GEOSITE,以及那些不是 ISO 国家码的 GEOIP 分类,指的是 mihomo geo 数据文件里的集合,而 Chute 不携带这些文件。GEOIP,private 和 GEOIP,lan 在所有平台上都转为内置的私有地址集合 RULE-SET,LAN,不需要下载。其余的则取决于导入在哪里进行:在 macOS 上,规则会转为 RULE-SET,geosite-<tag>(或 geoip-<tag>),并在旁边合成一条指向该集合所发布的 YAML 载荷的 [Rule Provider] 行,你可以像改别的行一样改指或删掉它。在 iOS、Apple TV 与 Android 上,规则会被丢弃并给出说明,因为这些集合大于平台能转换的规模——要保留它们,请在桌面上导入这份配置。ISO 国家码仍然走内置的 GeoIP 数据库,不需要任何集合。
  • 由 Chute 自行管理的协议细节不会被带过来:Hysteria2 的端口跳跃(ports)、TUIC 的 heartbeat、AnyTLS 的会话池调优、WireGuard 的 peers 列表(只会配置单个 peer)以及 workers。
  • Chute 未实现的传输方式只会被报告,不会被转换:h2、http 混淆、httpupgrade、v2ray-http-upgrade 这种 WebSocket 变体、WebSocket 的 max-early-data,以及 XHTTP 的 extra(XMUX / download-settings)。transport.type 为 httpupgrade 或 quic 的 sing-box 出站是例外:既不会生成任何内容,也不会有任何报告,所以导入之后请手动检查这些出站。
  • Clash 的运行 mode 在 Chute 中是一个运行时开关,而不是配置键;处于 global 或 direct 模式的配置文件会转换为规则模式,并给出警告。
  • YAML 使用标准解析器读取,因此锚点和 << 合并键都可以使用。写成多行标量的值会被折叠到一行,因为换行符会把它所在的那一行配置切断。
  • 若配置里的策略名是 {...} 这样的占位符——订阅生成器在自己替换之前输出的形态——导入会明确说明这是模板,而不是只把每一处占位符引用报成「策略未定义」。
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

本页为英文版的翻译。如内容有出入,以英文版为准。

results matching ""

    No results matching ""