Импорт

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 всё равно записывается, но не подключится к серверу, которому нужен этот плагин. Outbound trojan получает 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="…" в кавычках со всеми ключами; запись с кавычкой или запятой отмечается в отчёте и отбрасывается. Устаревший outbound 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 и новее) тоже преобразуются: endpoint wireguard становится политикой wireguard с собственным разделом [WireGuard <tag>], где allowed_ips его пира становятся allowed-ips раздела, а первый endpoint tailscale — разделом [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 у endpoint wireguard тоже сохраняется, и его туннель идёт через UDP-ретрансляцию этого вышестоящего узла; endpoint tailscale с 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, вариант WebSocket v2ray-http-upgrade, max-early-data для WebSocket и extra в XHTTP (XMUX / download-settings). Исключение — исходящее соединение sing-box, у которого transport.type равен httpupgrade или quic: для него не выдаётся ничего и ни о чём не сообщается, так что такие outbound после импорта проверьте вручную.
  • Рабочий режим mode в Clash — это переключатель времени выполнения в Chute, а не ключ конфигурации; профиль в режиме global или direct преобразуется в режим правил с предупреждением.
  • YAML читается стандартным парсером, поэтому якоря и ключ слияния << работают. Значение, записанное как многострочный скаляр, сворачивается в одну строку, поскольку перевод строки разорвал бы строку конфигурации, в которую оно попадает.
  • Профиль, в котором имена политик — заполнители {...} (то, что генератор подписок выдаёт до собственной подстановки), назван шаблоном: импорт говорит об этом один раз, а не только перечисляет каждую ссылку на заполнитель как неопределённую политику.
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

Эта страница — перевод английской версии. При расхождениях приоритет имеет английская версия.

results matching ""

    No results matching ""