导入
Chute 可以导入为其他客户端编写的代理配置。它接受两类输入:单节点的分享链接(ss://、vmess:// 等),以及 Clash/mihomo YAML 或 sing-box JSON 格式的完整配置文件。两者都会被转换成原生的 Chute 配置——你最终得到的是一份带有 [Proxy]、[Proxy Group] 和 [Rule] 段的普通 Chute 配置文件,而不是一个由 Chute 持续解释执行的外部文件。
http:// 和 https:// 地址永远不会被当作分享链接。它们是订阅地址:内容会先被下载下来,再根据正文的实际内容进行导入。
分享链接
| 协议头 | 生成的策略类型 | 默认端口 |
|---|---|---|
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://[email protected]: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 …… 后缀,这样规则和策略组仍然可以逐个指向每个节点。无法解析的行会以警告形式报告,内容中的其余部分照常导入;只有在完全没有任何内容能被转换时,导入才会失败。
协议头不在上表中的链接不会被识别为分享链接。协议头已知但缺少必填字段的链接会被拒绝,并给出指明该协议头的提示信息。
支持的参数
只有下列查询参数会被读取;链接中的其他内容都会被忽略。
| 参数 | 适用于 | 转换为 | |
|---|---|---|---|
sni、peer、servername |
全部 | sni |
|
alpn(以逗号分隔) |
全部 | alpn(各值以 `\ |
` 连接) |
fp |
全部 | fingerprint(uTLS ClientHello 指纹) |
|
allowInsecure、insecure、skip-cert-verify |
全部 | skip-cert-verify=true |
|
security=tls、xtls、reality |
全部 | tls=true |
|
pbk、sid |
REALITY | reality=true、public-key、short-id |
|
flow |
VLESS | xtls=true、flow |
|
type/network=ws + path、host |
全部 | ws=true、ws-path、ws-headers=Host:… |
|
type/network=grpc + 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、up、down |
Hysteria2 | 同名选项 | |
plugin=… |
Shadowsocks | 见下文 |
Shadowsocks 的 plugin 值按 name;key=value;… 解析。obfs-local / simple-obfs / obfs 会转换成 obfs 和 obfs_param;v2ray-plugin 在其(默认的)websocket 模式下会转换成 ws=true 以及 ws-path 和 ws-headers。其他插件都会产生警告,并且不会被带过来——生成的策略无法连接到需要该插件的服务器。
注意:非零的 VMess
aid(alterId)会以警告形式报告。Chute 只支持 VMess AEAD,仍然要求旧版 MD5 握手的服务器无法通过认证。
配置文件导入
可以识别三种格式:
| 格式 | 处理方式 |
|---|---|
| 原生 Chute/Surge 配置文件 | 直接使用,不做转换 |
| 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。其他情况一律按原生格式处理。
如果一份文档能够解析,却不包含任何一个用来定义其方言的段,它会被拒绝,而不是被报告成一次什么都没导入的成功导入: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。Chute 会解析并保留该选项,但并未实现代理链——带有该选项的策略会记录一条警告,并直接连接自己的服务器。在 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策略使用。 - mihomo 的两个 fingerprint 键含义不同,转换时会区分开:
client-fingerprint转换为fingerprint(uTLS ClientHello 指纹),fingerprint转换为cert-fingerprint-sha256(证书固定)。 udp: false转换为udp-relay=false,tfo转换为tfo=true,启用的smux块转换为mux=true。- 策略组类型
select、url-test、fallback和load-balance会连同它们的健康检查选项一起转换。relay组会被跳过——它属于链式转发,而链式转发并未实现。use:成员会转换成policy-provider:<name>引用,include-all/include-all-proxies/include-all-providers会展开成显式的成员列表。 filter和exclude-filter会以带引号的形式保留,但包含逗号或引号的表达式无法在配置行的格式中保存下来,会被丢弃并给出警告。- 名称不同的规则类型会被重命名:
MATCH→FINAL、DST-PORT→DEST-PORT、SRC-IP-CIDR→SRC-IP。REJECT-DROP和REJECT-TINYGIF都归并为REJECT;目标为PASS或COMPATIBLE的规则会被跳过。 - 内联的
rule-provider(type: inline加上payload列表)会展开成等价的具体规则,因为 Chute 的[Rule Provider]行无法内嵌 payload。 - 有对应项的通用键会被映射过来:
mixed-port转换为 HTTP 的port(SOCKS5 需要单独的socks-port),allow-lan转换为allow-wifi-access,log-level映射到loglevel,external-controller/secret转换为外部 HTTP 控制器选项,启用的sniffer转换为sniffing-enabled。
sing-box 转换说明
- 会被转换的出站类型:
shadowsocks、vmess、vless、trojan、hysteria2、tuic、anytls、shadowtls、wireguard、http、socks、ssh。selector和urltest会转换成select和url-test策略组。 detour会因为与dialer-proxy相同的原因产生警告:出站链式转发并未实现,该出站会直接连接自己的服务器。route.rule_set条目会转换成[Rule Provider]行(远程使用type=http,本地使用type=file,一律按 classical 形式的 mihomo YAML 规则列表读取)。二进制.srs格式的规则集会被拒绝——Chute 只能读取文本形式的规则内容。- 路由规则依据
action键处理:route/bypass使用其指定的出站,reject转换为REJECT,而hijack-dns、sniff和resolve不会生成任何内容,因为 Chute 是通过[General]控制这些行为的。 multiplex设置和dns.rules(按域名的 DNS 路由)没有对应项,会被报告为已丢弃。
限制
- 代理链并未实现。 mihomo 的
dialer-proxy、sing-box 的detour和 Clash 的relay组描述的都是链式转发;它们在 Chute 中都不会产生链式流量。 - 在 Chute 中没有对应项的选项会被丢弃并给出警告,而不是默默忽略:代理级别的
ip-version、interface-name、routing-mark和mptcp;策略组级别的exclude-type、disable-udp、interface-name、routing-mark和icon;以及通用键bind-address、tcp-concurrent、geodata-mode、geox-url、find-process-mode、unified-delay、authentication、tproxy-port、redir-port等。 - 没有对应项的规则类型会被跳过:
GEOSITE、IP-SUFFIX、SRC-IP-SUFFIX、SRC-GEOIP、SRC-IP-ASN、DSCP、UID、SUB-RULE、PROCESS-PATH-REGEX、PROCESS-NAME-WILDCARD、PROCESS-PATH-WILDCARD和IP-ACCEPT。带有 mihomosrc修饰符的规则同样会被跳过,以免匹配到错误的端点。mihomo 的sub-rules(嵌套规则树)会被丢弃。 - 由 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)。 - Clash 的运行
mode在 Chute 中是一个运行时开关,而不是配置键;处于global或direct模式的配置文件会转换为规则模式,并给出警告。 - YAML 使用标准解析器读取,因此锚点和
<<合并键都可以使用。写成多行标量的值会被折叠到一行,因为换行符会把它所在的那一行配置切断。