Importation

Chute peut importer des configurations de proxy écrites pour d'autres clients. Deux types d'entrées sont acceptés : les liens de partage de nœud unique (ss://, vmess://, …) et les profils entiers au format YAML Clash/mihomo ou JSON sing-box. Les deux sont convertis en configuration Chute native — ce que vous obtenez ensuite est un profil Chute ordinaire avec des sections [Proxy], [Proxy Group] et [Rule], et non un fichier étranger que Chute continuerait d'interpréter.

Les adresses http:// et https:// ne sont jamais traitées comme des liens de partage. Ce sont des adresses d'abonnement : le contenu est d'abord téléchargé, puis importé selon ce que le corps se révèle être.


Les liens de partage — un lien isolé, ou un abonnement dont le corps en est une liste — ne sont importés que par Chute Mac. Chute iOS n'a pas d'import de liens de partage : son guide de premier lancement peut configurer un serveur à partir d'un QR code scanné portant un lien ss://, vmess://, vless://, trojan://, hysteria2://, socks5:// ou ssh://, et n'en retient guère que l'adresse du serveur, le port et les identifiants — un lien sans port reçoit le port par défaut du tableau ci-dessous. Chute tvOS et Chute Android ne lisent pas les liens de partage.

Schéma Type de politique obtenu Port par défaut
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

La plupart des liens adoptent la forme userinfo@host:port?query#name. Deux font exception : vmess:// transporte un objet JSON encodé en base64 (le format v2rayN, avec les noms de champ add / ps / scy / net / aid), et ss:// accepte à la fois le format SIP002 (base64(method:password)@host:port) et l'ancienne forme à corps entier base64(method:password@host:port). Les charges utiles base64 peuvent être sans remplissage et utiliser l'alphabet compatible URL.

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

se convertit en :

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

Le texte après # est décodé de son encodage pourcent (%xx) et devient le nom de la politique ; vmess:// le prend plutôt dans le champ ps. Un lien sans nom est nommé host:port. Les caractères réservés par le format de configuration — =, ,, [, ], ", tabulation et retour à la ligne — sont remplacés par des espaces dans le nom.

Trojan, Hysteria2, TUIC et AnyTLS sont des protocoles exclusivement TLS ; tls=true est donc ajouté même lorsque le lien ne le précise pas.

Liens multiples. Une charge utile peut contenir plusieurs liens de partage séparés par des retours à la ligne, éventuellement enveloppés dans une couche externe de base64. Chaque ligne analysable devient une politique, et les noms répétés reçoivent un suffixe 2, 3… afin que les règles et les groupes puissent toujours désigner chaque nœud individuellement. Les lignes non analysables sont signalées comme avertissements pendant que le reste de la charge utile est tout de même importé ; l'importation n'échoue que si rien n'a pu être converti.

Un lien dont le schéma ne figure pas dans le tableau ci-dessus n'est pas reconnu comme un lien de partage. Un lien au schéma connu mais dont des champs requis manquent est rejeté avec un message nommant ce schéma.

Seuls les paramètres de requête ci-dessous sont lus ; tout le reste d'un lien est ignoré.

Par « liens à requête », on entend ci-dessous tous les schémas qui portent leurs réglages dans une chaîne de requête : vless://, trojan://, hysteria2://, tuic://, anytls://, socks5:// et ssh://. ss:// et vmess:// sont lus par leurs propres analyseurs et sont traités après le tableau.

Paramètre S'applique à Converti en
sni, peer, servername Liens à requête sni
alpn (séparé par des virgules) Liens à requête alpn (valeurs jointes par `\ `) — lu par les seules politiques TUIC, Hysteria2 et MASQUE, voir Paramètres communs
fp Liens à requête fingerprint (le profil ClientHello uTLS)
allowInsecure, insecure, skip-cert-verify Liens à requête skip-cert-verify=true
security=tls, xtls, reality Liens à requête tls=true ; sur socks5://, cela sélectionne le type de politique socks5-tls
pbk, sid REALITY reality=true, public-key, short-id, ainsi que server-name= depuis sni / servername
flow VLESS xtls=true, flow
type/network=ws + path, host Liens à requête ws=true, ws-path, ws-headers=Host:…
type/network=grpc + serviceName, servicename (ou path) Liens à requête grpc=true, grpc-service-name
type/network=xhttp ou splithttp + path, host, mode Liens à requête xhttp=true, xhttp-path, xhttp-host, xhttp-mode
obfs, obfs-password (aussi obfs_password), up, down Hysteria2 Mêmes noms d'option
plugin=… Shadowsocks Voir ci-dessous

ss:// ne lit que plugin dans la requête, et rien d'autre : sni, alpn, fp, allowInsecure, security et type= écrits dans un lien Shadowsocks sont donc ignorés. vmess:// n'a pas de requête du tout : il prend les mêmes réglages dans les champs sni, host, alpn, fp, net, path et tls de son corps JSON. Et les trois lignes de transport — ws, grpc, xhttp — n'atteignent jamais un lien hysteria2://, tuic:// ou anytls:// : ces politiques s'écrivent avec leurs propres options et les seules options TLS, chacun de ces protocoles portant son propre transport.

Une valeur plugin Shadowsocks est lue sous la forme nom;clé=valeur;…. obfs-local / simple-obfs / obfs deviennent obfs et obfs_param. v2ray-plugin devient Shadowsocks sur WebSocket : ws=true, path en ws-path, host en Host dans ws-headers, et tls en tls=true avec sni réglé sur ce même hôte ; un mux valant 0, false, no ou off devient ws-mux=false, toute autre valeur garde la valeur par défaut. Son mode quic n'a pas d'équivalent : le plugin est abandonné avec l'avertissement <path>.plugin: Shadowsocks plugin 'v2ray-plugin' in quic mode has no KLNEKit equivalent; the proxy will not connect without it. Toute autre de ses options est abandonnée avec <path>.plugin-opts.<key>: option has no KLNEKit equivalent and was dropped. Tout autre plugin produit un avertissement et est abandonné : la politique est tout de même écrite, mais elle ne pourra pas se connecter à un serveur qui exige ce plugin.

Remarque : un aid (alterId) VMess non nul est signalé par un avertissement. Chute ne parle que VMess AEAD, et un serveur exigeant encore l'ancienne poignée de main MD5 n'authentifiera pas la connexion.


Importation de profil

Trois formats sont reconnus :

Format Traitement
Profil Chute, Surge ou Shadowrocket natif Utilisé tel quel, sans étape de conversion — voir Profils Surge et Shadowrocket
YAML Clash / mihomo Converti en configuration native
JSON sing-box Converti en configuration native

Le format est détecté à partir du contenu, le nom de fichier ne servant que d'indice. Un contenu commençant par { est traité comme du JSON sing-box quel que soit le nom du fichier (un profil sing-box enregistré en .yaml s'analyse tout de même comme du YAML, le nom seul ne peut donc pas faire foi). Sinon, une extension .conf signifie natif, .json signifie sing-box, et .yaml / .yml signifie Clash. Lorsqu'aucun nom de fichier exploitable n'est disponible — un corps d'abonnement, par exemple — la première ligne significative tranche : #!MANAGED-CONFIG ou un en-tête [Section] signifie natif, et proxies:, proxy-groups:, rules:, proxy-providers: ou rule-providers: signifie Clash. Tout le reste est traité comme natif. Ce que sert une adresse — un téléchargement ou un abonnement — est jugé sur son corps : le nom tiré de l'adresse ne compte que si le corps ne montre aucun de ces marqueurs, si bien qu'une adresse se terminant par .conf qui sert du Clash est tout de même convertie.

Un document qui s'analyse mais ne contient aucune des sections définissant son dialecte est rejeté plutôt que signalé comme une importation réussie de rien du tout : le YAML Clash nécessite au moins l'un de proxies, proxy-groups, rules, proxy-providers ou rule-providers, et le JSON sing-box nécessite outbounds, endpoints ou route.

Une seule entrée non convertible ne fait jamais échouer l'importation. Chaque proxy, groupe et règle est converti individuellement ; ceux qui n'ont pas d'équivalent Chute sont ignorés et signalés. Le résultat comprend la configuration convertie, une liste d'avertissements et une liste des champs source ignorés. Ces mêmes avertissements sont également inscrits dans le texte converti sous forme de commentaires, à côté de la section dont ils proviennent :

[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

Enfin, le texte converti est réanalysé par l'analyseur propre à Chute. Toute ligne rejetée par l'analyseur est mise en commentaire sous la forme # KL-CONVERT-DROPPED: … et signalée, de sorte qu'un profil convertible à 95 % s'importe et fonctionne tout de même.

Les noms de nœud sont réécrits lorsqu'ils casseraient le format de configuration : , devient une espace et = devient -, et un nom entrant alors en collision avec un autre reçoit un suffixe numérique. Les membres de groupe et les destinations de règles sont réécrits en conséquence, afin que chaque référence continue de désigner le même nœud. Les proxys/sorties direct sont associés à la politique intégrée DIRECT, et reject / block / dns à REJECT.

Remarque : un profil converti est un instantané statique. Chute retélécharge un abonnement et l'analyse comme un profil natif ; un profil ayant dû être converti est donc enregistré sans URL de mise à jour automatique et ne s'actualisera pas de lui-même.

Notes de conversion Clash / mihomo

Remarque : dialer-proxy est converti en underlying-proxy. La référence importée est active : les connexions de la politique — TCP, et UDP là où les protocoles le permettent — passent par l'amont nommé et les références imbriquées forment plusieurs sauts. Les références absentes ou cycliques échouent en mode fail-closed et sont consignées. Un dialer-proxy qui nomme un alias type: direct est une connexion directe. Le override: dialer-proxy d'un fournisseur de proxy devient l'underlying-proxy du fournisseur ; les autres clés d'override sont toujours abandonnées avec un avertissement. Le proxy: d'un fournisseur de règles ou de proxy devient son policy= : le fournisseur est téléchargé par cette politique, comme dans mihomo.

  • Types de proxy convertis : ss, ssr, vmess, vless, trojan, http, socks5, hysteria2, tuic, anytls, wireguard, ssh. Les types pour lesquels Chute n'a pas d'implémentation — snell, hysteria (v1), mieru, juicity, shadowquic, trusttunnel, openvpn, sudoku, vmess-http — sont ignorés avec un avertissement nommant le protocole. Deux autres sont ignorés bien que Chute prenne en charge le protocole : un proxy masque, car la disposition des champs mihomo diffère, et un proxy tailscale, qui se configure une seule fois dans la section [Tailscale] et s'utilise via la politique intégrée TAILSCALE. Il n'y a pas de type: https : un proxy HTTPS est un type: http avec tls: true, comme mihomo l'écrit, et type: https est signalé comme type de proxy non pris en charge.
  • Les deux clés d'empreinte de mihomo désignent des choses différentes et sont maintenues distinctes : client-fingerprint devient fingerprint (le profil ClientHello uTLS) et fingerprint devient cert-fingerprint-sha256 (un épinglage de certificat).
  • udp: false devient udp-relay=false et tfo devient tfo=true. Un bloc smux activé n'est pas repris — le mux de Chute utilise un cadrage qui lui est propre, qu'un serveur mihomo ou sing-box ne sait pas lire — et l'import le dit : <path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off.
  • Le plugin d'un proxy ss est converti depuis ses plugin-opts : obfs (aussi simple-obfs, obfs-local) en obfs et obfs_param, et v2ray-plugin comme pour un lien de partage — mode, tls, host, path et mux comme décrit là-bas, headers en ws-headers, où un Host prend la place de host, et skip-cert-verify en skip-cert-verify=true. Le Host par défaut de mihomo, bing.com, n'est pas recopié : sans host, c'est la valeur par défaut de la politique qui s'applique. Tout autre plugin est signalé et abandonné.
  • Le udp-over-tcp: true d'un proxy ss devient udp-over-tcp=true, toujours avec une version : udp-over-tcp-version tel qu'indiqué, ou 1 quand il est absent, car la valeur par défaut de mihomo est l'ancien cadrage alors que celle de Chute est 2. Avec udp: false, le proxy ne relaie toujours pas d'UDP, comme dans mihomo.
  • Un proxy trojan reçoit toujours tls=true : le Trojan de mihomo passe toujours par TLS, si bien qu'un tls: false dans le profil est ignoré. Un proxy wireguard conserve ses allowed-ips, que Chute applique — voir Configuration WireGuard.
  • Le host-key d'un proxy ssh devient un server-fingerprint entre guillemets. Une liste devient un seul server-fingerprint="…" contenant toutes les clés ; une entrée contenant un guillemet ou une virgule ne peut pas être écrite dans la ligne de politique : elle est signalée et abandonnée.
  • Un champ qui n'accepte qu'une valeur mais qui est écrit sous forme de liste ou de mapping est considéré comme absent ; si le champ est obligatoire, l'entrée est signalée et ignorée.
  • Les types de groupe select, url-test, fallback et load-balance sont convertis avec leurs options de vérification d'état. Un groupe relay reste un groupe relay, avec ses membres dans le même ordre : le premier est joint directement et le dernier se connecte à la destination. Les membres use: deviennent des références policy-provider:<name>, et include-all / include-all-proxies / include-all-providers sont développés en une liste explicite de membres.
  • filter et exclude-filter sont repris entre guillemets, mais un motif contenant une virgule ou un guillemet ne peut pas survivre au format de ligne de configuration et est abandonné avec un avertissement.
  • L'exclude-type d'un groupe est repris tel quel sous la forme exclude-type= : les types de proxy nommés sont écartés des membres qu'un fournisseur apporte. tcp-concurrent n'a pas d'interrupteur propre — là où la plateforme le permet, Chute met en concurrence jusqu'à cinq adresses résolues d'une destination, et se connecte à la première ailleurs — et l'import le dit, au lieu de le signaler comme une simple perte.
  • Les types de règles sont renommés lorsque les noms diffèrent : MATCH → FINAL, DST-PORT → DEST-PORT, SRC-IP-CIDR → SRC-IP. REJECT-DROP et REJECT-TINYGIF sont conservés, car ce sont deux politiques intégrées de Chute au comportement propre ; une règle visant PASS ou COMPATIBLE est ignorée.
  • Un rule-provider en ligne (type: inline avec une liste payload) est développé en règles concrètes équivalentes, puisqu'une ligne [Rule Provider] de Chute ne peut pas intégrer de charge utile.
  • Une règle SUB-RULE,(condition),name et le mappage sub-rules: qu'elle nomme sont développés en règles ordinaires : chaque règle de la branche name devient AND,((condition),(rule)),POLICY, et le MATCH,X de la branche devient condition,X. Un SUB-RULE dans une branche empile sa condition sur celles qui l'entourent, jusqu'à 8 niveaux. Une branche absente, ou qui ramène à une branche en cours de développement, est ignorée avec un avertissement de conversion.
  • Les clés générales sont associées lorsqu'un équivalent existe : mixed-port devient le port HTTP (SOCKS5 nécessite son propre socks-port), allow-lan devient allow-wifi-access, log-level est associé à loglevel, external-controller/secret deviennent les options du contrôleur HTTP externe, et un sniffer activé devient sniffing-enabled.
  • bind-address devient interface et socks-interface — l'adresse sur laquelle les deux écouteurs se lient. * désigne toutes les adresses. Si allow-lan est également activé, le allow-wifi-access de Chute élargit de toute façon la liaison à toutes les adresses, et l'import le signale : retirez allow-wifi-access pour conserver la liaison la plus étroite.
  • authentication devient une ligne http-auth par identifiant, protégeant ces deux mêmes écouteurs. Une entrée sans : entre l'utilisateur et le mot de passe est signalée puis abandonnée.
  • external-controller-cors devient external-http-cors uniquement lorsque les origines autorisées sont déjà « toutes » (*, ou aucune liste du tout). L'interrupteur de Chute est tout ou rien : un profil qui nomme des origines précises le laisse donc désactivé et s'en voit expliquer la raison — l'activer donnerait à toutes les origines l'accès que le profil n'accordait qu'à une seule. allow-private-network n'a pas d'équivalent et l'en-tête n'est pas envoyé.
  • mihomo sépare la correspondance exacte et la correspondance par glob des processus en deux types de règles ; Chute n'en a qu'un, et c'est celui par glob. PROCESS-NAME-WILDCARD et PROCESS-PATH-WILDCARD deviennent donc PROCESS-NAME et PROCESS-PATH, qui lisent * et ? de la même façon. Un littéral qui ne contient ni l'un ni l'autre continue de correspondre exactement.
  • tun est associé là où Chute a la même clé : dns-hijack devient hijack-dns (le any:53 de mihomo est réécrit en *:53), route-address devient tun-included-routes et route-exclude-address devient tun-excluded-routes. stack, auto-route, auto-detect-interface, auto-redirect, mtu, strict-route, endpoint-independent-nat, device, inet4-address, inet6-address, udp-timeout et gso sont signalés à la place — Chute en décide lui-même.
  • Le bloc DNS est associé comme suit. hosts devient des entrées [Host], en conservant toutes les adresses d'une liste. nameserver et fallback sont fusionnés en un seul ensemble et écrits sous dns-server, doh, dot, doq ou doh3 selon la graphie de chaque entrée — Chute interroge tous les résolveurs configurés à la fois, un pool de repli distinct n'a donc rien sur quoi se replier, et l'import le dit. direct-nameserver et proxy-server-nameserver deviennent direct-dns-server et proxy-dns-server. fake-ip-filter devient always-real-ip. nameserver-policy devient une entrée [Host] par clé ; une clé rule-set: devient la forme indexée par jeu RULE-SET:<provider> = server:… lorsque le fournisseur est de type http ou file, et une clé geosite: est abandonnée avec un avertissement.
  • Toujours dans le bloc DNS : use-system-hosts: false devient read-etc-hosts = false. use-hosts: false n'a pas d'équivalent — la table [Host] est toujours consultée — et est signalé. fake-ip-filter-mode: whitelist inverse le filtre, ce qu'always-real-ip ne sait pas exprimer ; la liste est donc conservée comme liste noire et l'import le dit. default-nameserver amorce les noms d'hôte des résolveurs eux-mêmes ; Chute les résout via le résolveur du système, et l'import renvoie plutôt à la ligne [Host] qui les épingle.

Notes de conversion sing-box

  • Types de sorties convertis : shadowsocks, vmess, vless, trojan, hysteria2, tuic, anytls, shadowtls, wireguard, http, socks, ssh. selector et urltest deviennent des groupes de politiques select et url-test. Un plugin shadowsocks est converti pour obfs-local (aussi écrit simple-obfs ou obfs), en obfs et obfs_param, et pour v2ray-plugin, dont la chaîne plugin_opts (tls;host=…;path=…) se convertit comme celle d'un lien de partage, ses avertissements nommant plugin_opts et non plugin-opts ; tout autre plugin est signalé et abandonné, et la sortie est tout de même écrite mais ne pourra pas se connecter à un serveur qui exige ce plugin. Une sortie trojan ne reçoit tls=true que si son tls.enabled est défini, comme dans sing-box ; sans lui, elle est importée comme un Trojan en clair — ajoutez tls=true, sauf si le serveur parle vraiment en clair.
  • À l'intérieur d'une sortie : un transport de type xhttp ou splithttp devient xhttp=true avec xhttp-path, xhttp-host, xhttp-mode et xhttp-headers. Un tls.ech activé devient ech=true, et son config devient ech-config=. Le public_key de REALITY devient public-key ; une sortie qui n'en a pas est convertie avec un avertissement, car sa négociation REALITY ne peut pas aboutir. Une liste host_key SSH devient un seul server-fingerprint="…" entre guillemets contenant toutes les clés ; une entrée contenant un guillemet ou une virgule est signalée et abandonnée. Une ancienne sortie wireguard conserve sa liste local_address sous forme de self-ip et self-ip-v6 (la première adresse de chaque famille), son pre_shared_key sous forme de preshared-key et son reserved sous forme de reserved="a,b,c" entre guillemets ; une liste peers est signalée et abandonnée, car Chute configure un seul pair.
  • Les endpoints (sing-box 1.11 et suivants) sont aussi convertis : un endpoint wireguard devient une politique wireguard avec sa propre section [WireGuard <tag>], les allowed_ips de son pair devenant les allowed-ips de la section, et le premier endpoint tailscale devient la section [Tailscale], utilisée via la politique intégrée TAILSCALE. Les autres types d'endpoint sont ignorés avec un avertissement. Le nom de la section est celui de la politique, espaces et crochets retirés, car le format de ligne de configuration supprime les espaces lorsqu'il reconnaît section-name= ; deux politiques qui entreraient en collision après ce retrait reçoivent un suffixe -2, -3…
  • Les champs de connexion se convertissent comme pour mihomo : tcp_fast_open devient tfo=true et network: tcp devient udp-relay=false. Le udp_over_tcp d'une sortie shadowsocks — true, ou {"enabled": true, "version": 1} — devient udp-over-tcp=true, udp-over-tcp-version=1 n'étant écrit que pour la version 1 : la valeur par défaut de sing-box, la version 2, est aussi celle de Chute. Un multiplex activé n'est délibérément pas repris : sing-box négocie smux / yamux / h2mux avec son propre remplissage, tandis que le mux de Chute utilise un cadrage qui lui est propre et qu'un serveur sing-box ne sait pas lire ; la sortie est donc convertie sans multiplexage, et un avertissement le dit. detour devient une référence underlying-proxy= active ; les detours imbriqués forment plusieurs sauts, tandis que les cycles et références absentes échouent en mode fail-closed. Le detour d'un endpoint wireguard est conservé lui aussi, et son tunnel passe par le relais UDP de cet amont ; un endpoint tailscale dont le detour n'est pas direct n'est pas importé, et les références vers lui échouent en mode fail-closed, avec un avertissement.
  • route.rule_set : un jeu de règles inline devient une section [Ruleset <tag>], et les jeux remote et local deviennent des lignes [Rule Provider] (type=http / type=file) avec format=sing-box-source. Un jeu au format binaire compilé est ignoré avec un avertissement : pointez plutôt vers la version source (.json ou YAML) du même jeu. Sur ce chemin, le format compilé est .srs, détecté depuis format: binary ou depuis un chemin se terminant par .srs lorsque format est omis ; .mrs n'est détecté que sur le chemin des fournisseurs de règles Clash, où mihomo déduit lui aussi le format de l'extension. Sous macOS, l'importateur réécrit l'URL vers la charge utile source publiée à côté lorsque l'éditeur en propose une ; sous iOS, Apple TV et Android, non, car les jeux publiés en binaire dépassent de toute façon largement ce que ces plateformes chargeront. Les profils importés par des versions antérieures écrivaient ces jeux en format=mihomo-yaml et n'en chargeaient aucune règle ; ils se chargent désormais sans nouvelle importation. Un jeu de règles distant est téléchargé comme sing-box le télécharge : par son download_detour, son http_client (une étiquette de http_clients ou un client en ligne) ou route.default_http_client, et, à défaut, par la sortie par défaut (route.final). Cette route devient le policy= du fournisseur ; une route qui se résout en direct n'ajoute rien.
  • Une durée sing-box conserve son unité : update_interval: 3d vaut trois jours, et d, h, m, s et ms sont toutes lues. Un intervalle dont l'unité n'était pas comprise retombait sur la valeur par défaut d'un jour — ce que ne demandait pas un profil écrivant 7d.
  • Les règles de routage suivent la clé action : route/bypass utilisent la sortie nommée, reject devient REJECT (method: drop devient REJECT-DROP), et hijack-dns, sniff et resolve ne produisent rien, car Chute les pilote depuis [General]. Comme dans sing-box, les critères d'une même sorte sont des alternatives au sein d'une règle, et des sortes différentes doivent toutes correspondre : domain, domain_suffix, domain_keyword, domain_regex, ip_cidr, geoip et ip_is_private forment une sorte ; port et port_range une autre, de même que source_ip_cidr et source_ip_is_private, et source_port et source_port_range ; tout autre critère est une sorte à lui seul. Une règle d'une seule sorte devient une ligne par valeur, une règle de plusieurs sortes une seule règle AND — {"network": "udp", "port": 443} devient AND,((DEST-PORT,443),(PROTOCOL,udp)). Un domain_suffix écrit avec un point initial (.cn) devient DOMAIN-SUFFIX,cn. Les règles type: logical deviennent AND / OR / NOT, invert enveloppe toute la règle dans NOT, et port_range (a:b) et source_port_range deviennent des plages de ports. Un rule_set est un critère de plus de la règle, où qu'il apparaisse, y compris dans une règle type: logical ou inversée (voir Règle logique) ; plusieurs tags sur une même règle sont des alternatives. Lorsque l'un de ces tags nomme un jeu qui n'a pas pu être importé, le tag est abandonné avec un avis et la règle conserve les autres — elle correspond alors à moins de choses. La règle entière n'est abandonnée que si tous les tags qu'elle nomme ont échoué, ou si le rule_set se trouve dans une règle type: logical ou inversée, où abandonner une alternative changerait ce à quoi le reste de l'expression correspond. Un critère sans équivalent dans Chute est abandonné avec un avertissement s'il reste un autre critère de sa sorte (la règle correspond alors à moins de choses) ; sinon la règle entière est abandonnée avec un avertissement, plutôt que convertie en une règle qui correspondrait à davantage.
  • Le serveur DNS qui répond à tout nom qu'aucune règle DNS ne revendique — dns.final, ou le premier serveur quand final n'est pas défini — devient la clé DNS de [General] correspondant à son type ; son detour s'écrit comme suffixe #proxy=<policy> et un serveur local comme system ; proxy-dns-server n'est pas écrit. Les autres serveurs sont atteints par les entrées [Host] que deviennent les dns.rules, le serveur local s'y écrivant server:system et le detour d'un serveur ordinaire, DoH, DoQ ou DoH3 comme suffixe #proxy=<policy> ; l'entrée [Host] d'un serveur DoT ne peut pas en porter, si bien que son detour y est abandonné avec un avertissement. Une règle DNS qui achemine un rule_set entier vers un seul résolveur devient la forme indexée par jeu, RULE-SET:<tag> = server:… — mais uniquement lorsque rule_set est le seul critère de la règle, car sing-box exige que les critères de types différents soient tous satisfaits, alors qu'une clé [Host] ne porte qu'une seule condition. Une règle qui nomme un jeu n'ayant pas pu être importé n'obtient aucune entrée, pour la même raison que sa règle de routage n'en obtiendrait pas.

Profils Surge et Shadowrocket

Un profil Surge ou Shadowrocket est lu directement, sans étape de conversion. Chute accepte les graphies de chaque dialecte, si bien qu'un profil collé continue de fonctionner ; voici celles qui diffèrent des clés natives de Chute ou ont été ajoutées pour la compatibilité :

  • Groupes d'abonnement. Le policy-path=<url> de Surge (avec update-interval= et policy-regex-filter=) charge les membres d'un groupe depuis une URL ; include-all-proxies=true et include-other-group=<name> ajoutent tous les proxys, ou les membres d'un autre groupe. Les paramètres de groupe que Chute n'utilise pas, comme no-alert ou icon-url, sont conservés à l'enregistrement du profil. Le use=true de Shadowrocket marque un groupe dont les noms listés sont des abonnements et non des proxys ; chaque nom est lu comme un fournisseur de proxy. Le random de Shadowrocket devient un groupe aléatoire. Un groupe d'un type que Chute n'implémente pas, comme external de Surge, conserve ses membres et fonctionne comme select, avec un avis. Voir Groupe de politiques.
  • Politiques intégrées. Le PROXY de Shadowrocket désigne la politique sélectionnée en mode proxy global, sauf si le profil définit son propre Proxy ; chaque variante de REJECT (REJECT-DROP, REJECT-TINYGIF, REJECT-DICT, …) se comporte comme son nom l'indique. Voir Politique intégrée.
  • Règles. DST-PORT, les plages de ports, HOSTNAME-TYPE avec IPv4 / IPv6 / DOMAIN / SIMPLE, IP-ASN,AS…, FINAL,<policy>,dns-failed, notification-text= et les sections [Ruleset <name>] — voir Règle. Comme dans Surge, les règles des modules passent avant les règles propres au profil.
  • Général (Shadowrocket). update-url nomme l'adresse de mise à jour du profil lui-même, celle que Surge écrit dans l'en-tête #!MANAGED-CONFIG ; Chute lit les deux. Un fichier qui porte les deux conserve l'en-tête, car seul l'en-tête peut aussi porter interval et strict. La ligne update-url elle-même survit à l'enregistrement, de sorte qu'un profil Shadowrocket reste enregistré comme un profil Shadowrocket. close-if-proxy-chain-missing est conservé, mais Chute refuse toujours une politique chaînée dont l'amont manque, comme le fait sa valeur true. Le proxy frontal de Shadowrocket (前置代理), réglé uniquement dans son app, s'écrit global-underlying-proxy dans Chute.
  • DNS. Les clés Shadowrocket direct-dns-server, proxy-dns-server, fallback-dns-server, dns-direct-system, dns-fallback-system (qui ajoute system à fallback-dns-server, en le fusionnant avec celui que le profil déclare lui-même) et always-ip-address, ainsi que les lignes [Host] de la forme ssid:<name> = server:… ; les clés Surge encrypted-dns-server, allow-dns-svcb, [Host] <domain> = script:<name> et server:force-syslib. Voir Serveur DNS et Mappage DNS local.
  • Général. proxy-test-url et test-timeout (les valeurs par défaut des groupes url-test, fallback et load-balance), udp-policy-not-supported-behaviour, encrypted-dns-skip-cert-verification, ainsi que http-api / http-api-web-dashboard, qui correspondent aux clés du contrôleur HTTP externe. Voir Options diverses.
  • Proxys. Le mot-clé tuic-v5, et une section [WireGuard <name>] écrite avec peer = (…). Voir Serveur proxy et Configuration WireGuard.
  • HTTP. header-replace-regex, la forme http-request / http-response de la réécriture de corps, [Map Local] avec data-type=, status-code= et header="Key: value|…", la réécriture d'URL reject-array / reject-tinygif, et h2, hostname-disabled et auto-quic-block dans [MITM]. Voir Réécriture d'en-tête, Réécriture de corps, Réponse simulée, Réécriture d'URL et Déchiffrement HTTPS.
  • Scripts et modules. cronexp=, type=generic et event-name= dans [Script] ; #!system_version, #!REQUIREMENT, #!IOS-ONLY / #!MACOS-ONLY / #!TVOS-ONLY, et %APPEND% / %INSERT% dans le [General] d'un module. #!system_version et #!REQUIREMENT sont seulement enregistrés : Chute les lit sur le module, aucune application ne les affiche, et aucun des deux ne conditionne le chargement du module. Voir Scriptage JavaScript et Module.
  • Sections que Chute n'implémente pas — [Keystore], [Port Forwarding], [Testing], [DHCP], [Snell Server], [Panel], [Ponte], [MTProto] — se chargent avec un avis chacune et sont réenregistrées inchangées ; [Tailscale <name>] est lu comme [Tailscale]. Voir Configuration.

Non disponible : une ligne [Proxy] nommant un protocole que Chute n'implémente pas n'est pas une erreur de configuration. La politique est abandonnée avec un avis, la ligne est conservée telle quelle à l'enregistrement, et les références à cette politique deviennent pendantes — elles échouent en mode fail-closed vers REJECT à l'exécution au lieu de fuir vers DIRECT. Les protocoles reconnus ainsi sont snell, external, h2-connect et trust-tunnel de Surge ; hysteria (v1), juicity, sudoku, openconnect, mieru, brook, lua, http2, http3, relay et subscribe de Shadowrocket ; ainsi que tailscale, que Chute configure une seule fois dans la section [Tailscale] et utilise via la politique intégrée TAILSCALE. Une clé [General] sans équivalent dans Chute est de même ignorée avec un avis tandis que sa ligne est conservée telle quelle.


Limitations

  • Le chaînage de proxys transporte le TCP et l'UDP. Le dialer-proxy de mihomo et le detour de sing-box deviennent des références underlying-proxy, les groupes relay de Clash restent des groupes de relais avec le même ordre de sauts, et la route de téléchargement d'un fournisseur (proxy: de mihomo, download_detour ou http_client de sing-box) devient son policy=. Les cycles, références absentes et sauts QUIC ou WireGuard sur un amont sans UDP sont refusés et consignés au lieu d'être envoyés directement ; un nœud Shadowsocks avec udp-over-tcp transporte son UDP sur un tel amont également.
  • Les options sans équivalent Chute sont abandonnées avec un avertissement plutôt que silencieusement : par proxy, ip-version, interface-name, routing-mark, mptcp, packet-encoding, global-padding, authenticated-length et encryption, ainsi que udp-over-tcp / udp-over-tcp-version sur tout proxy autre que ss ; par groupe, disable-udp, interface-name et routing-mark ; et les clés générales geodata-mode, geox-url, find-process-mode, unified-delay, tproxy-port, redir-port et d'autres. L'icon d'un groupe fait exception : c'est une illustration, elle ne change aucun trafic, et elle est abandonnée en silence.
  • Les types de règles sans équivalent sont ignorés : IP-SUFFIX, SRC-IP-SUFFIX, SRC-GEOIP, SRC-IP-ASN, DSCP, UID, PROCESS-PATH-REGEX, IP-ACCEPT et REMATCH-NAME. Une règle portant le modificateur src de mihomo est également ignorée, plutôt que d'établir une correspondance sur le mauvais point de terminaison.
  • GEOSITE et les catégories GEOIP qui ne sont pas des codes pays ISO désignent des jeux présents dans les fichiers de données géographiques de mihomo, que Chute n'embarque pas. GEOIP,private et GEOIP,lan deviennent RULE-SET,LAN, le jeu intégré des adresses privées, sur toutes les plateformes — sans téléchargement. Le reste dépend de l'endroit où l'import s'exécute : sous macOS, la règle devient RULE-SET,geosite-<tag> (ou geoip-<tag>) et une ligne [Rule Provider] est synthétisée à côté, pointant vers la charge utile YAML publiée pour ce jeu, que vous pouvez repointer ou supprimer comme n'importe quelle autre ligne. Sous iOS, Apple TV et Android, la règle est abandonnée avec un message qui le dit, car ces jeux sont plus gros que ce que la plateforme saura convertir — importez le profil sur un ordinateur de bureau pour les conserver. Un code pays ISO passe toujours par la base GeoIP intégrée et n'a besoin d'aucun jeu.
  • Les détails de protocole que Chute gère lui-même ne sont pas repris : le saut de port Hysteria2 (ports), le heartbeat TUIC, le réglage du pool de sessions AnyTLS, les listes peers WireGuard (un seul pair est configuré) et workers.
  • Les transports que Chute n'implémente pas sont signalés au lieu d'être convertis : h2, l'obfuscation http, httpupgrade, la variante WebSocket v2ray-http-upgrade, max-early-data de WebSocket, et extra de XHTTP (XMUX / download-settings). Une sortie sing-box dont le transport.type vaut httpupgrade ou quic fait exception : rien n'est émis pour elle et rien n'est signalé non plus — vérifiez donc ces sorties à la main après l'import.
  • Le mode de fonctionnement de Clash est un interrupteur d'exécution dans Chute, et non une clé de configuration ; un profil en mode global ou direct est converti en mode règles avec un avertissement.
  • Le YAML est lu avec un analyseur standard ; les ancres et la clé de fusion << fonctionnent donc. Une valeur écrite sous forme de scalaire multiligne est repliée sur une seule ligne, car un retour à la ligne scinderait la ligne de configuration où elle atterrit.
  • Un profil dont les noms de politique sont des marqueurs {...} — ce qu'un générateur d'abonnement produit avant sa propre substitution — est désigné comme un modèle : l'import le dit une fois, au lieu de se contenter de signaler chaque référence à un marqueur comme une politique non définie.
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

results matching ""

    No results matching ""