Импорт
Chute может импортировать конфигурацию прокси, написанную для других клиентов. Принимаются два вида входных данных: ссылки для обмена для отдельных узлов (ss://, vmess://, …) и целые профили в формате Clash/mihomo YAML или sing-box JSON. И то и другое преобразуется в нативную конфигурацию Chute — в результате вы получаете обычный профиль Chute с разделами [Proxy], [Proxy Group] и [Rule], а не чужой файл, который Chute продолжает интерпретировать.
Адреса http:// и https:// никогда не считаются ссылками для обмена. Это адреса подписок: сначала загружается содержимое, а затем оно импортируется в соответствии с тем, чем окажется тело ответа.
Ссылки для обмена
Ссылки для обмена — одиночную ссылку или подписку, тело которой состоит из списка таких ссылок, — импортирует только Chute Mac. В Chute iOS импорта ссылок для обмена нет: мастер первого запуска может настроить один сервер по отсканированному QR-коду со ссылкой 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:// содержит JSON-объект в кодировке base64 (формат 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 (профиль ClientHello uTLS) |
|
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, а также server-name= из sni / servername |
|
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 и больше ничего, поэтому sni, alpn, fp, allowInsecure, security и type=, вписанные в ссылку Shadowsocks, игнорируются. У vmess:// запроса нет вовсе: те же настройки он берёт из полей sni, host, alpn, fp, net, path и tls своего тела JSON. А три транспортные строки — ws, grpc, xhttp — никогда не доходят до ссылок hysteria2://, tuic:// и anytls://: эти политики записываются собственными параметрами и параметрами TLS, поскольку каждый из этих протоколов несёт свой транспорт сам.
Значение plugin в Shadowsocks читается как name;key=value;…. obfs-local / simple-obfs / obfs превращаются в obfs и obfs_param. v2ray-plugin превращается в Shadowsocks поверх WebSocket: ws=true, path — в ws-path, host — в Host в ws-headers, а tls — в tls=true с sni, равным тому же хосту; 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. Любой другой плагин вызывает предупреждение и отбрасывается: политика всё равно записывается, но не подключится к серверу, которому нужен этот плагин.
Внимание: Ненулевое значение
aid(alterId) в VMess отмечается предупреждением. Chute поддерживает только VMess AEAD, и сервер, все ещё требующий устаревшего рукопожатия MD5, не пройдёт аутентификацию.
Импорт профилей
Распознаются три формата:
| Формат | Обработка |
|---|---|
| Нативный профиль Chute, Surge или Shadowrocket | Используется как есть, без этапа преобразования — см. Профили Surge и Shadowrocket |
| 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. Все остальное считается нативным форматом. То, что отдаёт адрес, — загрузка или подписка — определяется по телу: имя, взятое из адреса, учитывается, только если в теле нет ни одного из этих признаков, так что адрес, оканчивающийся на .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), и это записывается в журнал.dialer-proxy, указывающий на псевдоним сtype: direct, означает прямое подключение.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-прокси — этоtype: httpсtls: true, как его пишет mihomo, аtype: httpsотмечается как неподдерживаемый тип прокси. - Два ключа отпечатков в mihomo означают разное и не смешиваются:
client-fingerprintпревращается вfingerprint(профиль ClientHello uTLS), аfingerprint— вcert-fingerprint-sha256(закрепление сертификата). udp: falseпревращается вudp-relay=false, аtfo— вtfo=true. Включённый блокsmuxне переносится —muxв Chute использует собственный кадровый формат, который сервер mihomo или sing-box прочитать не может, — и импорт сообщает об этом:<path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off.pluginпроксиssпреобразуется из его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. Host по умолчанию из mihomo,bing.com, не копируется: безhostдействует собственное значение политики по умолчанию. Любой другой плагин отмечается в отчёте и отбрасывается.udp-over-tcp: trueу проксиssстановитсяudp-over-tcp=true, всегда с версией:udp-over-tcp-versionкак указано, либо1, если он не задан, потому что по умолчанию mihomo использует старый кадровый формат, а Chute — версию 2. Приudp: falseпрокси, как и в mihomo, по-прежнему не передаёт UDP.- Прокси
trojanвсегда получаетtls=true: Trojan в mihomo всегда работает через TLS, поэтомуtls: falseв профиле игнорируется. Проксиwireguardсохраняет своиallowed-ips, которые Chute соблюдает, — см. Конфигурация WireGuard. host-keyпроксиsshстановится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) разворачивается в эквивалентные конкретные правила, поскольку строка[Rule Provider]в Chute не может содержать встроенную полезную нагрузку. - Правило
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, тоallow-wifi-accessв Chute всё равно расширит привязку на все адреса, о чём импорт и сообщает: чтобы сохранить более узкую привязку, уберитеallow-wifi-access.authenticationпревращается в одну строкуhttp-authна каждую пару учётных данных, защищающую те же два слушателя. Запись без:между пользователем и паролем отмечается в отчёте и отбрасывается.external-controller-corsстановитсяexternal-http-corsтолько если разрешённые источники и так «любые» (*или списка нет вовсе). Переключатель Chute работает по принципу «всё или ничего», поэтому в профиле, называющем конкретные источники, он остаётся выключенным, а импорт объясняет почему: включить его — значит отдать всем источникам доступ, который профиль дал одному. Уallow-private-networkэквивалента нет, и этот заголовок не отправляется.- mihomo разделяет точное и шаблонное (glob) сопоставление процессов на два типа правил; у Chute он один — шаблонный. Поэтому
PROCESS-NAME-WILDCARDиPROCESS-PATH-WILDCARDстановятсяPROCESS-NAMEиPROCESS-PATH, которые читают*и?так же. Литерал без того и другого по-прежнему совпадает точно. tunотображается там, где у Chute есть такой же ключ:dns-hijackстановитсяhijack-dns(any:53из mihomo переписывается в*: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 опрашивает все настроенные резолверы сразу, поэтому отдельному запасному пулу не от чего откатываться, о чём импорт и сообщает.direct-nameserverиproxy-server-nameserverстановятсяdirect-dns-serverиproxy-dns-server.fake-ip-filterстановитсяalways-real-ip.nameserver-policyпревращается в одну запись[Host]на каждый ключ; ключrule-set:становится формой с ключом-наборомRULE-SET:<provider> = server:…, если провайдер имеет типhttpилиfile, а ключ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
- Преобразуемые типы исходящих соединений (outbound):
shadowsocks,vmess,vless,trojan,hysteria2,tuic,anytls,shadowtls,wireguard,http,socks,ssh.selectorиurltestстановятся группами политикselectиurl-test.pluginуshadowsocksпреобразуется дляobfs-local(пишется такжеsimple-obfsилиobfs) — вobfsиobfs_param, и дляv2ray-plugin, чья строкаplugin_opts(tls;host=…;path=…) преобразуется так же, как у ссылки для обмена, только в его предупреждениях стоитplugin_opts, а неplugin-opts; любой другой плагин отмечается в отчёте и отбрасывается, а outbound всё равно записывается, но не подключится к серверу, которому нужен этот плагин. Outboundtrojanполучаетtls=true, только если у него заданtls.enabled, как и в sing-box; без этого он импортируется как Trojan без шифрования — добавьтеtls=true, если сервер на самом деле не работает открытым текстом. - Внутри outbound:
transportтипаxhttpилиsplithttpстановитсяxhttp=trueсxhttp-path,xhttp-host,xhttp-modeиxhttp-headers. Включённыйtls.echстановитсяech=true, а егоconfig—ech-config=.public_keyв REALITY становитсяpublic-key; outbound без него преобразуется с предупреждением, поскольку его рукопожатие REALITY не может завершиться успешно. Списокhost_keyу SSH становится однимserver-fingerprint="…"в кавычках со всеми ключами; запись с кавычкой или запятой отмечается в отчёте и отбрасывается. Устаревший outboundwireguardсохраняет свой списокlocal_addressкакself-ipиself-ip-v6(первый адрес каждого семейства),pre_shared_key— какpreshared-key, аreserved— какreserved="a,b,c"в кавычках; списокpeersотмечается в отчёте и отбрасывается, поскольку Chute настраивает единственный пир. endpoints(sing-box 1.11 и новее) тоже преобразуются: endpointwireguardстановится политикойwireguardс собственным разделом[WireGuard <tag>], гдеallowed_ipsего пира становятсяallowed-ipsраздела, а первый endpointtailscale— разделом[Tailscale], который используется через встроенную политикуTAILSCALE. Прочие типы endpoint пропускаются с предупреждением. Имя раздела — это имя политики с вырезанными пробельными символами и квадратными скобками, поскольку формат строк конфигурации отбрасывает пробелы при сопоставлении сsection-name=; две политики, которые после вырезания совпали бы, получают суффиксы-2,-3…- Поля подключения отображаются так же, как для mihomo:
tcp_fast_openстановитсяtfo=true, аnetwork: tcp—udp-relay=false.udp_over_tcpисходящего соединенияshadowsocks—trueили{"enabled": true, "version": 1}— становитсяudp-over-tcp=true, аudp-over-tcp-version=1записывается только для версии 1: версия 2, используемая sing-box по умолчанию, — это и значение по умолчанию в Chute. Включённыйmultiplexнамеренно не переносится: sing-box согласовывает smux / yamux / h2mux со своим собственным заполнением (padding), аmuxв Chute использует собственный кадровый формат, который сервер sing-box прочитать не может, поэтому исходящее соединение преобразуется без мультиплексирования, о чём сообщает предупреждение.detourстановится активной ссылкойunderlying-proxy=; вложенные detour образуют несколько переходов, а циклы и отсутствующие ссылки безопасно отклоняются (fail-closed).detourу endpointwireguardтоже сохраняется, и его туннель идёт через UDP-ретрансляцию этого вышестоящего узла; endpointtailscaleсdetour, отличным от direct, не импортируется, а ссылки на него безопасно отклоняются (fail-closed) с предупреждением. route.rule_set: набор правилinlineстановится разделом[Ruleset <tag>], а наборыremoteиlocal— строками[Rule Provider](type=http/type=file) сformat=sing-box-source. Набор правил в скомпилированном двоичном формате пропускается с предупреждением: укажите вместо него версию того же набора в формате source (.jsonили YAML). На этом пути скомпилированный формат —.srs, он определяется поformat: binaryили по пути, оканчивающемуся на.srs, еслиformatне указан;.mrsраспознаётся только на пути провайдеров правил Clash, где mihomo точно так же выводит формат из расширения. На macOS импортёр переписывает 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используют названный outbound,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или инвертированного (см. Логическое правило); несколько тегов в одном правиле являются альтернативами. Когда один из этих тегов называет набор, который не удалось импортировать, тег отбрасывается с уведомлением, а правило сохраняет остальные — оно тогда совпадает с меньшим. Правило целиком отбрасывается, только если не удалось загрузить все названные им наборы или еслиrule_setстоит внутри правилаtype: logicalлибо инвертированного, где отбрасывание одной альтернативы изменило бы то, чему соответствует остальная часть выражения. Условие без аналога в Chute отбрасывается с предупреждением, если остаётся другое условие того же вида (правило тогда совпадает с меньшим); иначе правило отбрасывается целиком с предупреждением, а не превращается в правило, совпадающее с большим. - DNS-сервер, отвечающий на все имена, которые не забирает ни одно DNS-правило, —
dns.final, а еслиfinalне задан, первый сервер, — становится DNS-ключом[General]для своего вида; егоdetourзаписывается суффиксом#proxy=<политика>, а серверlocal— какsystem;proxy-dns-serverне записывается. Остальные серверы используются через записи[Host], в которые превращаютсяdns.rules; там серверlocalзаписывается какserver:system, аdetourобычного, DoH-, DoQ- или DoH3-сервера — суффиксом#proxy=<политика>; запись[Host]DoT-сервера такой суффикс нести не может, поэтому его detour там отбрасывается с предупреждением. DNS-правило, направляющее целыйrule_setна один резолвер, превращается в форму с ключом-наборомRULE-SET:<tag> = server:…— но только еслиrule_setявляется единственным условием правила, потому что sing-box требует одновременного выполнения условий разных видов, а ключ[Host]несёт лишь одно условие. Правило, называющее набор, который не удалось импортировать, записи не получает — по той же причине, по которой её не получило бы и его правило маршрутизации.
Профили Surge и Shadowrocket
Профиль Surge или Shadowrocket читается напрямую, без этапа преобразования. Chute принимает написания каждого диалекта, поэтому вставленный профиль продолжает работать; вот те, что отличаются от собственных ключей Chute или добавлены ради совместимости:
- Группы-подписки.
policy-path=<url>из Surge (сupdate-interval=иpolicy-regex-filter=) загружает участников группы по URL;include-all-proxies=trueиinclude-other-group=<имя>добавляют все прокси или участников другой группы. Параметры групп, которые Chute не использует, напримерno-alertилиicon-url, сохраняются при сохранении профиля.use=trueиз Shadowrocket помечает группу, перечисленные имена которой — подписки, а не прокси; каждое имя читается как провайдер прокси.randomиз Shadowrocket становится группой Random. Группа типа, который Chute не реализует, напримерexternalиз Surge, сохраняет участников и работает какselect, с уведомлением. См. Группа политик. - Встроенные политики.
PROXYиз Shadowrocket обозначает политику, выбранную в режиме глобального прокси, если профиль не определяет собственныйProxy; каждая разновидность REJECT (REJECT-DROP,REJECT-TINYGIF,REJECT-DICTи т. д.) ведёт себя так, как говорит её имя. См. Встроенные политики. - Правила.
DST-PORT, диапазоны портов,HOSTNAME-TYPEсо значениямиIPv4/IPv6/DOMAIN/SIMPLE,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.
direct-dns-server,proxy-dns-server,fallback-dns-server,dns-direct-system,dns-fallback-system(добавляетsystemвfallback-dns-server, объединяясь с тем, что профиль объявил сам) иalways-ip-addressиз Shadowrocket, а также строки[Host]видаssid:<имя> = server:…;encrypted-dns-server,allow-dns-svcb,[Host] <домен> = script:<имя>иserver:force-syslibиз Surge. См. DNS-сервер и Локальное сопоставление DNS. - Общие.
proxy-test-urlиtest-timeout(значения по умолчанию для групп url-test, fallback и load-balance),udp-policy-not-supported-behaviour,encrypted-dns-skip-cert-verification, а такжеhttp-api/http-api-web-dashboard, которые отображаются на ключи внешнего HTTP-контроллера. См. Прочие параметры. - Прокси. Ключевое слово
tuic-v5и раздел[WireGuard <name>], записанный черезpeer = (…). См. Прокси-сервер и Конфигурация WireGuard. - HTTP.
header-replace-regex, форма перезаписи телаhttp-request/http-response,[Map Local]сdata-type=,status-code=иheader="Key: value|…",reject-array/reject-tinygifв перезаписи URL, а такжеh2,hostname-disabledиauto-quic-blockв[MITM]. См. Перезапись заголовков, Перезапись тела, Имитация ответов, Перезапись URL и Расшифровка HTTPS. - Скрипты и модули.
cronexp=,type=genericиevent-name=в[Script];#!system_version,#!REQUIREMENT,#!IOS-ONLY/#!MACOS-ONLY/#!TVOS-ONLY, а также%APPEND%/%INSERT%в[General]модуля.#!system_versionи#!REQUIREMENTтолько запоминаются: Chute считывает их из модуля, ни одно приложение их не показывает, и ни одна из них не решает, загрузится ли модуль. См. JavaScript-скриптинг и Модули. - Разделы, которые Chute не реализует, —
[Keystore],[Port Forwarding],[Testing],[DHCP],[Snell Server],[Panel],[Ponte],[MTProto]— загружаются с одним уведомлением на каждый и сохраняются без изменений;[Tailscale <name>]читается как[Tailscale]. См. Конфигурация.
Недоступно: строка [Proxy] с протоколом, который Chute не реализует, не является ошибкой конфигурации. Политика отбрасывается с уведомлением, строка при сохранении остаётся ровно как написана, а ссылки на эту политику становятся висячими — во время выполнения они безопасно уходят в REJECT (fail-closed), а не утекают в DIRECT. Так распознаются snell, external, h2-connect и trust-tunnel из Surge; hysteria (v1), juicity, sudoku, openconnect, mieru, brook, lua, http2, http3, relay и subscribe из Shadowrocket; а также tailscale, который Chute настраивает один раз в разделе [Tailscale] и использует через встроенную политику TAILSCALE. Ключ [General] без аналога в Chute так же игнорируется с уведомлением, а его строка остаётся как написана.
Ограничения
- Цепочки прокси передают TCP и UDP.
dialer-proxyв mihomo иdetourв sing-box становятся ссылкамиunderlying-proxy, группыrelayв Clash остаются группами Relay с тем же порядком переходов, а путь загрузки провайдера (proxy:в mihomo,download_detourилиhttp_clientв sing-box) становится егоpolicy=. Циклы, отсутствующие ссылки и переходы QUIC или WireGuard через вышестоящий узел без UDP отклоняются и записываются, а не отправляются напрямую; узел Shadowsocks сudp-over-tcpпередаёт свой UDP и через такой вышестоящий узел. - Параметры, не имеющие эквивалента в Chute, отбрасываются с предупреждением, а не молча: у прокси —
ip-version,interface-name,routing-mark,mptcp,packet-encoding,global-padding,authenticated-lengthиencryption, а такжеudp-over-tcp/udp-over-tcp-versionу любого прокси, кромеss; у групп —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. Правило с модификаторомsrcиз mihomo также пропускается, вместо того чтобы сопоставляться не с той конечной точкой. GEOSITEи те категорииGEOIP, которые не являются кодами стран ISO, называют наборы в файлах гео-данных mihomo, которых у Chute нет.GEOIP,privateиGEOIP,lanна всех платформах превращаются во встроенный набор частных адресовRULE-SET,LAN— без всякой загрузки. Остальное зависит от того, где выполняется импорт: на macOS правило становитсяRULE-SET,geosite-<tag>(илиgeoip-<tag>), и рядом синтезируется строка[Rule Provider], указывающая на YAML-нагрузку, опубликованную для этого набора, — её можно перенаправить или удалить, как любую другую строку. На iOS, Apple TV и Android правило отбрасывается с сообщением об этом, потому что такие наборы больше, чем платформа способна преобразовать, — чтобы их сохранить, импортируйте профиль на настольной системе. Код страны ISO по-прежнему идёт во встроенную базу GeoIP, и никакого набора ему не нужно.- Детали протоколов, которыми 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). Исключение — исходящее соединение sing-box, у которогоtransport.typeравенhttpupgradeилиquic: для него не выдаётся ничего и ни о чём не сообщается, так что такие outbound после импорта проверьте вручную. - Рабочий режим
modeв Clash — это переключатель времени выполнения в Chute, а не ключ конфигурации; профиль в режимеglobalилиdirectпреобразуется в режим правил с предупреждением. - YAML читается стандартным парсером, поэтому якоря и ключ слияния
<<работают. Значение, записанное как многострочный скаляр, сворачивается в одну строку, поскольку перевод строки разорвал бы строку конфигурации, в которую оно попадает. - Профиль, в котором имена политик — заполнители
{...}(то, что генератор подписок выдаёт до собственной подстановки), назван шаблоном: импорт говорит об этом один раз, а не только перечисляет каждую ссылку на заполнитель как неопределённую политику.
Эта страница — перевод английской версии. При расхождениях приоритет имеет английская версия.