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.
Liens de partage
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.
Paramètres pris en charge
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-proxyest converti enunderlying-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. Undialer-proxyqui nomme un aliastype: directest une connexion directe. Leoverride: dialer-proxyd'un fournisseur de proxy devient l'underlying-proxydu fournisseur ; les autres clés d'overridesont toujours abandonnées avec un avertissement. Leproxy:d'un fournisseur de règles ou de proxy devient sonpolicy=: 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 proxymasque, car la disposition des champs mihomo diffère, et un proxytailscale, qui se configure une seule fois dans la section[Tailscale]et s'utilise via la politique intégréeTAILSCALE. Il n'y a pas detype: https: un proxy HTTPS est untype: httpavectls: true, comme mihomo l'écrit, ettype: httpsest 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-fingerprintdevientfingerprint(le profil ClientHello uTLS) etfingerprintdevientcert-fingerprint-sha256(un épinglage de certificat). udp: falsedevientudp-relay=falseettfodevienttfo=true. Un blocsmuxactivé n'est pas repris — lemuxde 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
plugind'un proxyssest converti depuis sesplugin-opts:obfs(aussisimple-obfs,obfs-local) enobfsetobfs_param, etv2ray-plugincomme pour un lien de partage —mode,tls,host,pathetmuxcomme décrit là-bas,headersenws-headers, où unHostprend la place dehost, etskip-cert-verifyenskip-cert-verify=true. Le Host par défaut de mihomo,bing.com, n'est pas recopié : sanshost, c'est la valeur par défaut de la politique qui s'applique. Tout autre plugin est signalé et abandonné. - Le
udp-over-tcp: trued'un proxyssdevientudp-over-tcp=true, toujours avec une version :udp-over-tcp-versiontel qu'indiqué, ou1quand il est absent, car la valeur par défaut de mihomo est l'ancien cadrage alors que celle de Chute est 2. Avecudp: false, le proxy ne relaie toujours pas d'UDP, comme dans mihomo. - Un proxy
trojanreçoit toujourstls=true: le Trojan de mihomo passe toujours par TLS, si bien qu'untls: falsedans le profil est ignoré. Un proxywireguardconserve sesallowed-ips, que Chute applique — voir Configuration WireGuard. - Le
host-keyd'un proxysshdevient unserver-fingerprintentre guillemets. Une liste devient un seulserver-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,fallbacketload-balancesont convertis avec leurs options de vérification d'état. Un grouperelayreste un grouperelay, avec ses membres dans le même ordre : le premier est joint directement et le dernier se connecte à la destination. Les membresuse:deviennent des référencespolicy-provider:<name>, etinclude-all/include-all-proxies/include-all-providerssont développés en une liste explicite de membres. filteretexclude-filtersont 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-typed'un groupe est repris tel quel sous la formeexclude-type=: les types de proxy nommés sont écartés des membres qu'un fournisseur apporte.tcp-concurrentn'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-DROPetREJECT-TINYGIFsont conservés, car ce sont deux politiques intégrées de Chute au comportement propre ; une règle visantPASSouCOMPATIBLEest ignorée. - Un
rule-provideren ligne (type: inlineavec une listepayload) 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),nameet le mappagesub-rules:qu'elle nomme sont développés en règles ordinaires : chaque règle de la branchenamedevientAND,((condition),(rule)),POLICY, et leMATCH,Xde la branche devientcondition,X. UnSUB-RULEdans 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-portdevient leportHTTP (SOCKS5 nécessite son propresocks-port),allow-landevientallow-wifi-access,log-levelest associé àloglevel,external-controller/secretdeviennent les options du contrôleur HTTP externe, et unsnifferactivé devientsniffing-enabled. bind-addressdevientinterfaceetsocks-interface— l'adresse sur laquelle les deux écouteurs se lient.*désigne toutes les adresses. Siallow-lanest également activé, leallow-wifi-accessde Chute élargit de toute façon la liaison à toutes les adresses, et l'import le signale : retirezallow-wifi-accesspour conserver la liaison la plus étroite.authenticationdevient une lignehttp-authpar 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-corsdevientexternal-http-corsuniquement 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-networkn'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-WILDCARDetPROCESS-PATH-WILDCARDdeviennent doncPROCESS-NAMEetPROCESS-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. tunest associé là où Chute a la même clé :dns-hijackdevienthijack-dns(leany:53de mihomo est réécrit en*:53),route-addressdevienttun-included-routesetroute-exclude-addressdevienttun-excluded-routes.stack,auto-route,auto-detect-interface,auto-redirect,mtu,strict-route,endpoint-independent-nat,device,inet4-address,inet6-address,udp-timeoutetgsosont signalés à la place — Chute en décide lui-même.- Le bloc DNS est associé comme suit.
hostsdevient des entrées[Host], en conservant toutes les adresses d'une liste.nameserveretfallbacksont fusionnés en un seul ensemble et écrits sousdns-server,doh,dot,doqoudoh3selon 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-nameserveretproxy-server-nameserverdeviennentdirect-dns-serveretproxy-dns-server.fake-ip-filterdevientalways-real-ip.nameserver-policydevient une entrée[Host]par clé ; une clérule-set:devient la forme indexée par jeuRULE-SET:<provider> = server:…lorsque le fournisseur est de typehttpoufile, et une clégeosite:est abandonnée avec un avertissement. - Toujours dans le bloc DNS :
use-system-hosts: falsedevientread-etc-hosts = false.use-hosts: falsen'a pas d'équivalent — la table[Host]est toujours consultée — et est signalé.fake-ip-filter-mode: whitelistinverse le filtre, ce qu'always-real-ipne sait pas exprimer ; la liste est donc conservée comme liste noire et l'import le dit.default-nameserveramorce 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.selectoreturltestdeviennent des groupes de politiquesselecteturl-test. Unpluginshadowsocksest converti pourobfs-local(aussi écritsimple-obfsouobfs), enobfsetobfs_param, et pourv2ray-plugin, dont la chaîneplugin_opts(tls;host=…;path=…) se convertit comme celle d'un lien de partage, ses avertissements nommantplugin_optset nonplugin-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 sortietrojanne reçoittls=trueque si sontls.enabledest défini, comme dans sing-box ; sans lui, elle est importée comme un Trojan en clair — ajouteztls=true, sauf si le serveur parle vraiment en clair. - À l'intérieur d'une sortie : un
transportde typexhttpousplithttpdevientxhttp=trueavecxhttp-path,xhttp-host,xhttp-modeetxhttp-headers. Untls.echactivé devientech=true, et sonconfigdevientech-config=. Lepublic_keyde REALITY devientpublic-key; une sortie qui n'en a pas est convertie avec un avertissement, car sa négociation REALITY ne peut pas aboutir. Une listehost_keySSH devient un seulserver-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 sortiewireguardconserve sa listelocal_addresssous forme deself-ipetself-ip-v6(la première adresse de chaque famille), sonpre_shared_keysous forme depreshared-keyet sonreservedsous forme dereserved="a,b,c"entre guillemets ; une listepeersest signalée et abandonnée, car Chute configure un seul pair. - Les
endpoints(sing-box 1.11 et suivants) sont aussi convertis : un endpointwireguarddevient une politiquewireguardavec sa propre section[WireGuard <tag>], lesallowed_ipsde son pair devenant lesallowed-ipsde la section, et le premier endpointtailscaledevient la section[Tailscale], utilisée via la politique intégréeTAILSCALE. 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îtsection-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_opendevienttfo=trueetnetwork: tcpdevientudp-relay=false. Leudp_over_tcpd'une sortieshadowsocks—true, ou{"enabled": true, "version": 1}— devientudp-over-tcp=true,udp-over-tcp-version=1n'étant écrit que pour la version 1 : la valeur par défaut de sing-box, la version 2, est aussi celle de Chute. Unmultiplexactivé n'est délibérément pas repris : sing-box négocie smux / yamux / h2mux avec son propre remplissage, tandis que lemuxde 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.detourdevient une référenceunderlying-proxy=active ; les detours imbriqués forment plusieurs sauts, tandis que les cycles et références absentes échouent en mode fail-closed. Ledetourd'un endpointwireguardest conservé lui aussi, et son tunnel passe par le relais UDP de cet amont ; un endpointtailscaledont ledetourn'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èglesinlinedevient une section[Ruleset <tag>], et les jeuxremoteetlocaldeviennent des lignes[Rule Provider](type=http/type=file) avecformat=sing-box-source. Un jeu au format binaire compilé est ignoré avec un avertissement : pointez plutôt vers la version source (.jsonou YAML) du même jeu. Sur ce chemin, le format compilé est.srs, détecté depuisformat: binaryou depuis un chemin se terminant par.srslorsqueformatest omis ;.mrsn'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 enformat=mihomo-yamlet 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 sondownload_detour, sonhttp_client(une étiquette dehttp_clientsou un client en ligne) ouroute.default_http_client, et, à défaut, par la sortie par défaut (route.final). Cette route devient lepolicy=du fournisseur ; une route qui se résout endirectn'ajoute rien.- Une durée sing-box conserve son unité :
update_interval: 3dvaut trois jours, etd,h,m,setmssont 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 écrivant7d. - Les règles de routage suivent la clé
action:route/bypassutilisent la sortie nommée,rejectdevientREJECT(method: dropdevientREJECT-DROP), ethijack-dns,sniffetresolvene 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,geoipetip_is_privateforment une sorte ;portetport_rangeune autre, de même quesource_ip_cidretsource_ip_is_private, etsource_portetsource_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ègleAND—{"network": "udp", "port": 443}devientAND,((DEST-PORT,443),(PROTOCOL,udp)). Undomain_suffixécrit avec un point initial (.cn) devientDOMAIN-SUFFIX,cn. Les règlestype: logicaldeviennentAND/OR/NOT,invertenveloppe toute la règle dansNOT, etport_range(a:b) etsource_port_rangedeviennent des plages de ports. Unrule_setest un critère de plus de la règle, où qu'il apparaisse, y compris dans une règletype: logicalou 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 lerule_setse trouve dans une règletype: logicalou 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 quandfinaln'est pas défini — devient la clé DNS de[General]correspondant à son type ; sondetours'écrit comme suffixe#proxy=<policy>et un serveurlocalcommesystem;proxy-dns-servern'est pas écrit. Les autres serveurs sont atteints par les entrées[Host]que deviennent lesdns.rules, le serveurlocals'y écrivantserver:systemet ledetourd'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 unrule_setentier vers un seul résolveur devient la forme indexée par jeu,RULE-SET:<tag> = server:…— mais uniquement lorsquerule_setest 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 (avecupdate-interval=etpolicy-regex-filter=) charge les membres d'un groupe depuis une URL ;include-all-proxies=trueetinclude-other-group=<name>ajoutent tous les proxys, ou les membres d'un autre groupe. Les paramètres de groupe que Chute n'utilise pas, commeno-alertouicon-url, sont conservés à l'enregistrement du profil. Leuse=truede 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. Lerandomde Shadowrocket devient un groupe aléatoire. Un groupe d'un type que Chute n'implémente pas, commeexternalde Surge, conserve ses membres et fonctionne commeselect, avec un avis. Voir Groupe de politiques. - Politiques intégrées. Le
PROXYde Shadowrocket désigne la politique sélectionnée en mode proxy global, sauf si le profil définit son propreProxy; 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-TYPEavecIPv4/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-urlnomme 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 porterintervaletstrict. La ligneupdate-urlelle-même survit à l'enregistrement, de sorte qu'un profil Shadowrocket reste enregistré comme un profil Shadowrocket.close-if-proxy-chain-missingest conservé, mais Chute refuse toujours une politique chaînée dont l'amont manque, comme le fait sa valeurtrue. Le proxy frontal de Shadowrocket (前置代理), réglé uniquement dans son app, s'écritglobal-underlying-proxydans Chute. - DNS. Les clés Shadowrocket
direct-dns-server,proxy-dns-server,fallback-dns-server,dns-direct-system,dns-fallback-system(qui ajoutesystemàfallback-dns-server, en le fusionnant avec celui que le profil déclare lui-même) etalways-ip-address, ainsi que les lignes[Host]de la formessid:<name> = server:…; les clés Surgeencrypted-dns-server,allow-dns-svcb,[Host] <domain> = script:<name>etserver:force-syslib. Voir Serveur DNS et Mappage DNS local. - Général.
proxy-test-urlettest-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 quehttp-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 avecpeer = (…). Voir Serveur proxy et Configuration WireGuard. - HTTP.
header-replace-regex, la formehttp-request/http-responsede la réécriture de corps,[Map Local]avecdata-type=,status-code=etheader="Key: value|…", la réécriture d'URLreject-array/reject-tinygif, eth2,hostname-disabledetauto-quic-blockdans[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=genericetevent-name=dans[Script];#!system_version,#!REQUIREMENT,#!IOS-ONLY/#!MACOS-ONLY/#!TVOS-ONLY, et%APPEND%/%INSERT%dans le[General]d'un module.#!system_versionet#!REQUIREMENTsont 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-proxyde mihomo et ledetourde sing-box deviennent des référencesunderlying-proxy, les groupesrelayde 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_detourouhttp_clientde sing-box) devient sonpolicy=. 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 avecudp-over-tcptransporte 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-lengthetencryption, ainsi queudp-over-tcp/udp-over-tcp-versionsur tout proxy autre quess; par groupe,disable-udp,interface-nameetrouting-mark; et les clés généralesgeodata-mode,geox-url,find-process-mode,unified-delay,tproxy-port,redir-portet d'autres. L'icond'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-ACCEPTetREMATCH-NAME. Une règle portant le modificateursrcde mihomo est également ignorée, plutôt que d'établir une correspondance sur le mauvais point de terminaison. GEOSITEet les catégoriesGEOIPqui 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,privateetGEOIP,landeviennentRULE-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 devientRULE-SET,geosite-<tag>(ougeoip-<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), leheartbeatTUIC, le réglage du pool de sessions AnyTLS, les listespeersWireGuard (un seul pair est configuré) etworkers. - Les transports que Chute n'implémente pas sont signalés au lieu d'être convertis :
h2, l'obfuscationhttp,httpupgrade, la variante WebSocketv2ray-http-upgrade,max-early-datade WebSocket, etextrade XHTTP (XMUX / download-settings). Une sortie sing-box dont letransport.typevauthttpupgradeouquicfait 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
modede fonctionnement de Clash est un interrupteur d'exécution dans Chute, et non une clé de configuration ; un profil en modeglobaloudirectest 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.