Импорт
Chute может импортировать конфигурацию прокси, написанную для других клиентов. Принимаются два вида входных данных: ссылки для обмена для отдельных узлов (ss://, vmess://, …) и целые профили в формате Clash/mihomo YAML или sing-box JSON. И то и другое преобразуется в нативную конфигурацию Chute — в результате вы получаете обычный профиль Chute с разделами [Proxy], [Proxy Group] и [Rule], а не чужой файл, который 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:// содержит JSON-объект в кодировке base64 (формат 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 (профиль ClientHello uTLS) |
|
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 | См. ниже |
Значение plugin в Shadowsocks читается как name;key=value;…. obfs-local / simple-obfs / obfs превращаются в obfs и obfs_param; v2ray-plugin в своем (используемом по умолчанию) режиме websocket превращается в ws=true с ws-path и ws-headers. Любой другой плагин вызывает предупреждение и не переносится — получившаяся политика не подключится к серверу, который его требует.
Внимание: Ненулевое значение
aid(alterId) в VMess отмечается предупреждением. Chute поддерживает только VMess AEAD, и сервер, все еще требующий устаревшего рукопожатия MD5, не пройдет аутентификацию.
Импорт профилей
Распознаются три формата:
| Формат | Обработка |
|---|---|
| Нативный профиль Chute/Surge | Используется как есть, без этапа преобразования |
| Clash / mihomo YAML | Преобразуется в нативную конфигурацию |
| sing-box JSON | Преобразуется в нативную конфигурацию |
Формат определяется по содержимому, а имя файла используется только как подсказка. Содержимое, начинающееся с {, считается sing-box JSON независимо от того, как называется файл (профиль sing-box, сохраненный как .yaml, все равно разбирается как 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 означают разное и не смешиваются:
client-fingerprintпревращается вfingerprint(профиль ClientHello uTLS), а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) разворачивается в эквивалентные конкретные правила, поскольку строка[Rule Provider]в Chute не может содержать встроенную полезную нагрузку. - Общие ключи сопоставляются там, где есть эквивалент:
mixed-portстановится HTTP-портомport(для SOCKS5 нужен собственныйsocks-port),allow-lan—allow-wifi-access,log-levelсопоставляется сloglevel,external-controller/secretстановятся параметрами внешнего HTTP-контроллера, а включенныйsniffer—sniffing-enabled.
Замечания по преобразованию sing-box
- Преобразуемые типы исходящих соединений (outbound):
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для локальных; всегда читаются как классические списки правил в формате mihomo YAML). Набор правил в двоичном формате.srsотклоняется — Chute читает только текстовые полезные нагрузки правил. - Правила маршрутизации следуют ключу
action:route/bypassиспользуют указанное исходящее соединение,rejectпревращается вREJECT, аhijack-dns,sniffиresolveне порождают ничего, поскольку Chute управляет ими из[General]. - Настройки
multiplexиdns.rules(маршрутизация DNS по доменам) не имеют эквивалента и отмечаются как отброшенные.
Ограничения
- Цепочки прокси не реализованы.
dialer-proxyв mihomo,detourв sing-box и группыrelayв Clash — все они описывают цепочку; ни одна из них не приводит к передаче трафика по цепочке в 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. Правило с модификаторомsrcиз mihomo также пропускается, вместо того чтобы сопоставляться не с той конечной точкой.sub-rulesиз mihomo (вложенные деревья правил) отбрасываются. - Детали протоколов, которыми Chute управляет самостоятельно, не переносятся: перескок портов в Hysteria2 (
ports),heartbeatв TUIC, настройка пула сессий AnyTLS, спискиpeersв WireGuard (настраивается один пир) иworkers. - Транспорты, которые Chute не реализует, отмечаются в отчете вместо преобразования:
h2, обфускацияhttp,httpupgrade, вариант WebSocketv2ray-http-upgrade,max-early-dataдля WebSocket иextraв XHTTP (XMUX / download-settings). - Рабочий режим
modeв Clash — это переключатель времени выполнения в Chute, а не ключ конфигурации; профиль в режимеglobalилиdirectпреобразуется в режим правил с предупреждением. - YAML читается стандартным парсером, поэтому якоря и ключ слияния
<<работают. Значение, записанное как многострочный скаляр, сворачивается в одну строку, поскольку перевод строки разорвал бы строку конфигурации, в которую оно попадает.