インポート
Chuteは他のクライアント向けに書かれたプロキシ設定をインポートできます。受け付ける入力は2種類あります: 単一ノードの共有リンク(ss://、vmess://など)と、Clash/mihomo YAMLまたはsing-box JSON形式のプロファイル全体です。どちらもネイティブのChute設定に変換されます — 変換後に得られるのは[Proxy]、[Proxy Group]、[Rule]セクションを持つ通常のChuteプロファイルであり、Chuteが解釈し続ける外部形式のファイルではありません。
http://およびhttps://アドレスが共有リンクとして扱われることはありません。これらはサブスクリプションアドレスです: まず内容がダウンロードされ、その本文の内容に応じてインポートされます。
共有リンク
共有リンク — 単独のリンク、または本文がリンクの一覧になっているサブスクリプション — をインポートできるのはChute Macだけです。Chute iOSには共有リンクのインポートがありません: 初回ガイドで、ss://、vmess://、vless://、trojan://、hysteria2://、socks5://、ssh://のリンクを載せたQRコードをスキャンしてサーバーを1台設定できますが、リンクから取り出すのはほぼサーバーのアドレス、ポート、認証情報だけです — ポートの無いリンクには下の表のデフォルトポートが使われます。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という形式です。例外は2つあります: vmess://はbase64エンコードされたJSONオブジェクト(add / ps / scy / net / aidというフィールド名を使うv2rayN形式)を含み、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で1層だけ包んでいても構いません。パースできた行はそれぞれポリシーになり、名前が重複した場合は2、3…というサフィックスが付くため、ルールやグループから各ノードを個別に指定できます。パースできなかった行は警告として報告されますが、ペイロードの残りはそのままインポートされます。インポートが失敗するのは、何ひとつ変換できなかった場合のみです。
上の表にないスキームのリンクは共有リンクとして認識されません。既知のスキームでも必須フィールドが欠けているリンクは、そのスキーム名を示すメッセージとともに拒否されます。
サポートされるパラメータ
読み取られるのは以下のクエリパラメータのみです。リンク内のそれ以外のものは無視されます。
以下でいう「クエリリンク」とは、設定をクエリ文字列で運ぶすべてのスキーム、つまりvless://、trojan://、hysteria2://、tuic://、anytls://、socks5://、ssh://を指します。ss://とvmess://はそれぞれ専用のパーサーで読み取られ、表のあとで説明します。
| パラメータ | 適用対象 | 変換先 | |
|---|---|---|---|
sni、peer、servername |
クエリリンク | sni |
|
alpn(カンマ区切り) |
クエリリンク | alpn(値は`\ |
`で連結されます) — 読み取るのはTUIC、Hysteria2、MASQUEのポリシーだけです。共通パラメータを参照してください |
fp |
クエリリンク | fingerprint(uTLSのClientHelloプロファイル) |
|
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、およびsni / servernameからのserver-name= |
|
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だけなので、Shadowsocksのリンクに書かれたsni、alpn、fp、allowInsecure、security、type=は無視されます。vmess://にはそもそもクエリがなく、同じ設定をJSON本文のsni、host、alpn、fp、net、path、tlsの各フィールドから取ります。また、トランスポートの3行 — ws、grpc、xhttp — はhysteria2://、tuic://、anytls://のリンクには届きません。これらのポリシーは独自のオプションとTLS関連のものだけで書かれ、各プロトコルが自前のトランスポートを持っているからです。
Shadowsocksのpluginの値はname;key=value;…として読み取られます。obfs-local / simple-obfs / obfsはobfsとobfs_paramになります。v2ray-pluginはWebSocket上のShadowsocksになります: ws=true、pathはws-path、hostはws-headersのHost、tlsはtls=trueになり、sniにも同じhostが設定されます。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とともに破棄されます。v2ray-pluginのそれ以外のオプションは<path>.plugin-opts.<key>: option has no KLNEKit equivalent and was droppedとともに破棄されます。それ以外のプラグインは警告を出して破棄されます: ポリシー自体は書き出されますが、そのプラグインを必要とするサーバーには接続できません。
注意: VMessの
aid(alterId)が0以外の場合は警告として報告されます。ChuteはVMess AEADのみに対応しているため、レガシーなMD5ハンドシェイクを要求するサーバーでは認証できません。
プロファイルのインポート
認識される形式は3つです:
| 形式 | 処理 |
|---|---|
| ネイティブのChute、Surge、Shadowrocketプロファイル | 変換ステップなしでそのまま使用されます(SurgeとShadowrocketのプロファイルを参照) |
| Clash / mihomo YAML | ネイティブ設定に変換されます |
| sing-box JSON | ネイティブ設定に変換されます |
形式は内容から検出され、ファイル名はヒントとしてのみ使用されます。{で始まる内容は、ファイル名が何であってもsing-box JSONとして扱われます(.yamlとして保存されたsing-boxプロファイルもYAMLとしてパースできてしまうため、名前だけでは信頼できません)。それ以外の場合、拡張子.confはネイティブ、.jsonはsing-box、.yaml / .ymlはClashを意味します。使用できるファイル名がない場合 — 例えばサブスクリプションの本文 — は、最初の意味のある行で決まります: #!MANAGED-CONFIGまたは[Section]ヘッダーはネイティブ、proxies:、proxy-groups:、rules:、proxy-providers:、rule-providers:はClashを意味します。それ以外はネイティブとして扱われます。アドレスが返す内容(ダウンロードでもサブスクリプションでも)は本文で判定されます。アドレスから取った名前が効くのは本文に上記の目印が一つもない場合だけなので、.confで終わるアドレスがClashを返しても変換されます。
パースはできてもその方言を定義するセクションを1つも含まないドキュメントは、何もインポートしていないのに成功と報告するのではなく拒否されます: Clash YAMLにはproxies、proxy-groups、rules、proxy-providers、rule-providersのいずれかが少なくとも1つ必要で、sing-box JSONにはoutbounds、endpoints、routeが必要です。
変換できないエントリが1つあってもインポート全体が失敗することはありません。 各プロキシ、グループ、ルールはそれぞれ個別に変換され、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 となりログに記録されます。type: directのエイリアスを指すdialer-proxyは直接接続になります。プロキシプロバイダーの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がプロトコル自体はサポートしているのにスキップされるものが2つあります:masqueプロキシはmihomoのフィールド構成が異なるため、tailscaleプロキシは[Tailscale]セクションで一度だけ設定し、組み込みのTAILSCALEポリシーを通して使用するためです。type: httpsはありません: HTTPSプロキシはmihomoの書き方どおりtls: true付きのtype: httpで、type: httpsはサポートされないプロキシタイプとして報告されます。 - mihomoの2つのフィンガープリントキーは意味が異なるため区別されます:
client-fingerprintはfingerprint(uTLSのClientHelloプロファイル)になり、fingerprintはcert-fingerprint-sha256(証明書のピン留め)になります。 udp: falseはudp-relay=falseに、tfoはtfo=trueになります。有効化されたsmuxブロックは引き継がれません — Chuteのmuxは独自のフレーミングを使い、mihomoやsing-boxのサーバーはそれを読めないためです — その旨がインポート時に示されます:<path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off。ssプロキシのpluginは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になります。mihomoのデフォルトHostであるbing.comは引き継がれません:hostがなければポリシー自身のデフォルトが使われます。それ以外のプラグインは報告されて破棄されます。ssプロキシのudp-over-tcp: trueはudp-over-tcp=trueになり、バージョンも必ず書き出されます:udp-over-tcp-versionがあればその値、なければ1です。mihomoのデフォルトは旧形式のフレーミングで、Chuteのデフォルトは2だからです。udp: falseの場合、mihomoと同じくそのプロキシはUDPを中継しません。trojanプロキシには常にtls=trueが付きます: mihomoのTrojanは常にTLSなので、プロファイル中のtls: falseは無視されます。wireguardプロキシはallowed-ipsを保持し、Chuteはそれを適用します — WireGuard設定を参照してください。sshプロキシのhost-keyは引用符付きのserver-fingerprintになります。リストの場合はすべての鍵をまとめた1つのserver-fingerprint="…"になり、引用符やカンマを含む項目はポリシー行に書けないため、報告されて破棄されます。- 値を1つだけ取るフィールドがリストやマッピングで書かれている場合、そのフィールドはないものとして扱われます。必須のフィールドであれば、その項目は報告されてスキップされます。
- グループタイプ
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は宛先の解決済みアドレスを最大5つまで同時に試し、それ以外では最初の1つに接続します — インポート時にはその旨を伝え、単なる欠落としては報告しません。 - ルールタイプは名前が異なる場合に変更されます:
MATCH→FINAL、DST-PORT→DEST-PORT、SRC-IP-CIDR→SRC-IP。REJECT-DROPとREJECT-TINYGIFは、どちらも独自の動作を持つChuteの組み込みポリシーなのでそのまま保持され、PASSまたはCOMPATIBLEを対象とするルールはスキップされます。 - インラインの
rule-provider(payloadリストを持つtype: inline)は同等の具体的なルールに展開されます。Chuteの[Rule Provider]行はペイロードを埋め込めないためです。 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になります — 2つのリスナーがバインドするアドレスです。*はすべてのアドレスを意味します。allow-lanも有効な場合、Chuteのallow-wifi-accessによってバインドはいずれにせよすべてのアドレスへ広がるため、インポート時にその旨を伝えます。狭いほうのバインドを保ちたい場合はallow-wifi-accessを外してください。authenticationは認証情報1件につき1行のhttp-authになり、同じ2つのリスナーを保護します。ユーザー名とパスワードの間に:がないエントリは報告のうえ破棄されます。external-controller-corsがexternal-http-corsになるのは、許可するオリジンがもともと「すべて」の場合だけです(*、またはリストそのものがない場合)。Chuteのこのスイッチは全か無かなので、特定のオリジンを挙げている設定ではオフのままとなり、その理由が伝えられます — オンにすれば、設定が1つのオリジンにだけ与えたアクセスをすべてのオリジンに渡すことになるからです。allow-private-networkに対応するものはなく、そのヘッダーは送信されません。- mihomoはプロセスの完全一致とグロブ一致を2つのルールタイプに分けていますが、Chuteには1つしかなく、それはグロブのほうです。そのため
PROCESS-NAME-WILDCARDとPROCESS-PATH-WILDCARDはPROCESS-NAMEとPROCESS-PATHになり、*と?の読み方は同じです。どちらも含まないリテラルは引き続き完全一致します。 tunは、Chuteに同じキーがあるものだけが対応付けられます:dns-hijackはhijack-dns(mihomoのany:53は*: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は1つの集合にまとめられ、各エントリの書き方に応じて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はキーごとに1つの[Host]エントリになり、rule-set:のキーはプロバイダーがhttpかfileのものであればセット指定の形RULE-SET:<プロバイダー> = server:…になります。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変換に関する注意
- 変換されるアウトバウンドタイプ:
shadowsocks、vmess、vless、trojan、hysteria2、tuic、anytls、shadowtls、wireguard、http、socks、ssh。selectorとurltestはselectとurl-testのポリシーグループになります。shadowsocksのpluginは、obfs-local(simple-obfsやobfsという表記も可)ならobfsとobfs_paramに変換され、v2ray-pluginならplugin_optsの文字列(tls;host=…;path=…)が共有リンクと同じように変換されます(警告のパスはplugin-optsではなくplugin_optsになります)。それ以外は報告されて破棄され、アウトバウンド自体は書き出されますが、そのプラグインを必要とするサーバーには接続できません。trojanアウトバウンドがtls=trueになるのは、sing-boxと同じくtls.enabledが設定されているときだけです。設定されていないアウトバウンドは平文のTrojanとしてインポートされます — サーバーが本当に平文でない限りtls=trueを追加してください。 - アウトバウンドの中身: タイプが
xhttpまたはsplithttpのtransportは、xhttp=trueとxhttp-path、xhttp-host、xhttp-mode、xhttp-headersになります。有効なtls.echはech=trueになり、そのconfigはech-config=になります。REALITYのpublic_keyはpublic-keyになります。これがないアウトバウンドは、REALITYのハンドシェイクが成功しないため、警告付きで変換されます。SSHのhost_keyリストは、すべての鍵をまとめた引用符付きのserver-fingerprint="…"1つになり、引用符やカンマを含む項目は報告されて破棄されます。旧形式のwireguardアウトバウンドは、local_addressリストをself-ipとself-ip-v6(アドレスファミリーごとに最初のアドレス)として、pre_shared_keyをpreshared-keyとして、reservedを引用符付きのreserved="a,b,c"として保持します。peersリストは、Chuteが1つのピアしか設定しないため、報告されて破棄されます。 endpoints(sing-box 1.11以降)も変換されます:wireguardエンドポイントは専用の[WireGuard <tag>]セクションを持つwireguardポリシーになり(ピアのallowed_ipsはそのセクションのallowed-ipsになります)、最初のtailscaleエンドポイントは組み込みのTAILSCALEポリシーから使う[Tailscale]セクションになります。その他のエンドポイントタイプは警告とともにスキップされます。セクション名はポリシー名から空白と角括弧を取り除いたものです。設定行のフォーマットはsection-name=に合わせる際に空白を落とすためです。取り除いた結果が衝突する2つのポリシーには、-2、-3…というサフィックスが付きます。- ダイヤル関連のフィールドはmihomoと同じように対応付けられます:
tcp_fast_openはtfo=true、network: tcpはudp-relay=falseになります。shadowsocksアウトバウンドのudp_over_tcp(true、または{"enabled": true, "version": 1})はudp-over-tcp=trueになり、udp-over-tcp-version=1はバージョン1のときだけ書き出されます。sing-boxのデフォルトであるバージョン2は、Chuteのデフォルトでもあります。有効なmultiplexは意図的に引き継ぎません: sing-boxは独自のパディングを伴うsmux / yamux / h2muxをネゴシエートしますが、Chuteのmuxは独自のフレーミングを使い、sing-boxのサーバーはそれを読めないため、アウトバウンドは多重化なしで変換され、その旨の警告が出ます。detourは有効なunderlying-proxy=参照になります。ネストしたdetourは複数のホップになり、循環・参照欠落はfail-closedになります。wireguardエンドポイントのdetourも保持され、そのトンネルはその上流のUDPリレーを通ります。direct以外のdetourを持つtailscaleエンドポイントはインポートされず、それを参照する箇所はfail-closedとなり、警告が出ます。 route.rule_set:inlineのルールセットは[Ruleset <tag>]セクションになり、remoteとlocalのルールセットはformat=sing-box-source付きの[Rule Provider]行(type=http/type=file)になります。コンパイル済みのバイナリ形式のルールセットは警告とともにスキップされます。同じルールセットのソース形式(.jsonまたはYAML)を指定してください。この経路でのコンパイル済み形式は.srsで、format: binaryか、formatがなくパスが.srsで終わることから判定されます。.mrsを見分けるのはClashのrule-provider経路だけで、そちらではmihomoも同じように拡張子から形式を推測します。macOSでは、配布元がソース形式のペイロードを提供している場合にインポーターがURLをそちらへ書き換えます。iOS、Apple TV、Androidでは行いません — バイナリで配布されるセットは、そもそもこれらのプラットフォームが読み込める大きさをはるかに超えているからです。以前のバージョンでインポートしたプロファイルはこれらのルールセットをformat=mihomo-yamlとして書き出しており、ルールを1つも読み込めませんでしたが、現在は再インポートせずに読み込まれます。リモートのルールセットはsing-boxと同じ経路でダウンロードされます。download_detour、http_client(http_clientsのタグまたはインラインのクライアント)、またはroute.default_http_clientを通り、どれもなければデフォルトのアウトバウンド(route.final)を通ります。その経路がプロバイダーのpolicy=になり、directに解決されるものは何も追加しません。- sing-boxの時間指定は単位ごと読み取られます:
update_interval: 3dは3日で、d、h、m、s、msのいずれも解釈されます。単位を解釈できない間隔は既定の1日に戻っていましたが、7dと書いたプロファイルが求めているのはそれではありません。 - ルートルールは
actionキーに従います:route/bypassは指定されたアウトバウンドを使用し、rejectはREJECT(method: dropはREJECT-DROP)になります。hijack-dns、sniff、resolveはChuteが[General]から制御するため、何も出力しません。sing-boxと同様に、1つのルール内で同じ種類のマッチ条件はいずれかが一致すればよく、種類の異なる条件はすべて一致する必要があります。domain、domain_suffix、domain_keyword、domain_regex、ip_cidr、geoip、ip_is_privateが1つの種類で、portとport_range、source_ip_cidrとsource_ip_is_private、source_portとsource_port_rangeがそれぞれ別の種類、それ以外のマッチ条件はそれぞれ単独の種類です。1種類だけのルールは値ごとに1行になり、複数種類のルールは1つの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はどこに現れてもそのルールの条件の1つで、type: logicalや反転したルールの中でも同じです(論理ルール参照)。1つのルールに複数のタグがある場合は互いに選択肢になります。そのタグの1つがインポートできなかったセットを指している場合、そのタグだけが通知とともに破棄され、ルールは残りを保ちます — マッチ範囲はその分狭くなります。ルール全体が破棄されるのは、指定されたタグがすべて失敗したとき、またはrule_setがtype: logicalや反転したルールの中にあるときだけです。後者では選択肢を1つ落とすと式の残りのマッチ範囲が変わってしまうからです。Chuteに対応するものがないマッチ条件は、同じ種類の条件が他に残っていれば警告とともにその条件だけが破棄され(ルールのマッチ範囲は狭くなります)、残っていなければ、マッチ範囲の広いルールに変換されるのではなく、警告とともにルール全体が破棄されます。 - どのDNSルールにも該当しない名前すべてに答えるDNSサーバー —
dns.final、finalが無ければ最初のサーバー — は、種類に応じた[General]のDNSキーになります。そのdetourは#proxy=<ポリシー>サフィックスとして書かれ、localサーバーはsystemと書かれます。proxy-dns-serverは書き出されません。その他のサーバーは、dns.rulesから作られる[Host]エントリを通して使われ、localサーバーはserver:system、通常、DoH、DoQ、DoH3サーバーのdetourは#proxy=<ポリシー>サフィックスとして書かれます。DoTサーバーの[Host]エントリにはこれを付けられないため、そこではdetourが警告とともに破棄されます。rule_set全体を1つのリゾルバーへ振り向けるDNSルールは、セット指定のRULE-SET:<タグ> = server:…形式になります — ただしrule_setがそのルールの唯一のマッチ条件である場合に限ります。sing-boxは種類の異なるマッチ条件がすべて成り立つことを求めますが、[Host]のキーが持てる条件は1つだけだからです。インポートできなかったセットを指すルールにはエントリが作られません。そのルートルールが書き出されないのと同じ理由です。
SurgeとShadowrocketのプロファイル
SurgeやShadowrocketのプロファイルは、変換ステップなしで直接読み込まれます。Chuteはそれぞれの方言の書き方を受け付けるので、貼り付けたプロファイルはそのまま使えます。Chuteのネイティブのキーと異なるもの、または互換性のために追加されたものは次のとおりです:
- サブスクリプショングループ。 Surgeの
policy-path=<url>(update-interval=、policy-regex-filter=とともに)はURLからグループのメンバーを読み込み、include-all-proxies=trueとinclude-other-group=<名前>はすべてのプロキシや別のグループのメンバーを加えます。no-alertやicon-urlなど、Chuteが使わないグループパラメータはプロファイルの保存時に保持されます。Shadowrocketのuse=trueは、グループに列挙された名前がプロキシではなくサブスクリプションであることを示し、各名前はプロキシプロバイダーとして読み込まれます。Shadowrocketのrandomはランダムグループになります。Chuteが実装していないタイプのグループ(Surgeのexternalなど)はメンバーを保持したままselectとして動作し、通知が出ます。ポリシーグループを参照してください。 - 組み込みポリシー。 Shadowrocketの
PROXYは、プロファイルが独自のProxyを定義していない限り、グローバルプロキシモードで選択されているポリシーを指します。REJECTの各派生(REJECT-DROP、REJECT-TINYGIF、REJECT-DICTなど)は名前どおりに動作します。組み込みポリシーを参照してください。 - ルール。
DST-PORT、ポート範囲、IPv4/IPv6/DOMAIN/SIMPLEを値とするHOSTNAME-TYPE、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。 Shadowrocketの
direct-dns-server、proxy-dns-server、fallback-dns-server、dns-direct-system、dns-fallback-system(fallback-dns-serverにsystemを追加し、プロファイルに明示された値とマージします)、always-ip-address、およびssid:<名前> = server:…形式の[Host]行。Surgeのencrypted-dns-server、allow-dns-svcb、[Host] <ドメイン> = script:<名前>、server:force-syslib。DNSサーバーとローカルDNSマッピングを参照してください。 - 一般。
proxy-test-urlとtest-timeout(url-test、fallback、load-balanceグループのデフォルト)、udp-policy-not-supported-behaviour、encrypted-dns-skip-cert-verification、そして外部HTTPコントローラーのキーに対応付けられるhttp-api/http-api-web-dashboard。その他オプションを参照してください。 - プロキシ。
tuic-v5キーワード、およびpeer = (…)で書かれた[WireGuard <name>]セクション。プロキシサーバーとWireGuard設定を参照してください。 - HTTP。
header-replace-regex、ボディ書き換えのhttp-request/http-response形式、data-type=・status-code=・header="Key: value|…"を使う[Map Local]、URL書き換えのreject-array/reject-tinygif、[MITM]のh2・hostname-disabled・auto-quic-block。ヘッダー書き換え、ボディ書き換え、モックレスポンス、URL書き換え、HTTPS復号を参照してください。 - スクリプトとモジュール。
[Script]のcronexp=、type=generic、event-name=。モジュールの#!system_version、#!REQUIREMENT、#!IOS-ONLY/#!MACOS-ONLY/#!TVOS-ONLY、およびモジュールの[General]での%APPEND%/%INSERT%。#!system_versionと#!REQUIREMENTは記録されるだけです: Chuteはモジュールからそれらを読み取りますが、表示するアプリは無く、どちらもモジュールが読み込まれるかどうかを左右しません。JavaScriptスクリプトとモジュールを参照してください。 - Chuteが実装していないセクション —
[Keystore]、[Port Forwarding]、[Testing]、[DHCP]、[Snell Server]、[Panel]、[Ponte]、[MTProto]— は、それぞれ通知を1件記録して読み込まれ、保存時にはそのまま書き戻されます。[Tailscale <name>]は[Tailscale]として読み込まれます。設定を参照してください。
利用できないもの: Chuteが実装していないプロトコルを指定した[Proxy]行は設定エラーではありません。そのポリシーは通知とともに破棄され、行は保存時にそのまま保持され、そのポリシーへの参照はダングリングになります — 実行時はDIRECTに漏れるのではなくREJECTへfail-closedします。この方法で認識されるプロトコルは、Surgeのsnell、external、h2-connect、trust-tunnel、Shadowrocketのhysteria(v1)、juicity、sudoku、openconnect、mieru、brook、lua、http2、http3、relay、subscribe、およびtailscaleです。tailscaleはChuteが[Tailscale]セクションで一度設定し、組み込みのTAILSCALEポリシーを通じて使用します。Chuteに対応するもののない[General]キーも同様に通知とともに無視され、その行は書かれたまま保持されます。
制限事項
- プロキシチェーンはTCPとUDPを運びます。mihomoの
dialer-proxyとsing-boxのdetourはunderlying-proxy参照になり、Clashのrelayグループはホップの順序を保ったままリレーグループとして残り、プロバイダーのダウンロード経路(mihomoのproxy:、sing-boxのdownload_detourまたはhttp_client)はそのpolicy=になります。循環、存在しない参照、UDPを運ばない上流の上のQUICまたはWireGuardのレッグは拒否してログに記録し、直接送信しません。udp-over-tcpを使うShadowsocksノードは、そのような上流の上でもUDPを運べます。 - Chuteに同等のものがないオプションは、黙って無視されるのではなく警告とともに破棄されます: プロキシ単位の
ip-version、interface-name、routing-mark、mptcp、packet-encoding、global-padding、authenticated-length、encryption、およびss以外のプロキシのudp-over-tcp/udp-over-tcp-version。グループ単位の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。mihomoのsrc修飾子を持つルールも、誤ったエンドポイントでマッチしないようにスキップされます。 GEOSITEと、ISOの国コードではないGEOIPのカテゴリは、mihomoのgeoデータファイル内のセットを指しますが、Chuteはそれを持っていません。GEOIP,privateとGEOIP,lanは、どのプラットフォームでも組み込みのプライベートアドレスのセットであるRULE-SET,LANになります — ダウンロードは発生しません。それ以外はインポートを実行した場所によります。macOSではルールがRULE-SET,geosite-<タグ>(またはgeoip-<タグ>)になり、そのセット向けに公開されているYAMLのペイロードを指す[Rule Provider]行が併せて生成されます。この行は他の行と同じように向き先を変えたり削除したりできます。iOS、Apple TV、Androidでは、これらのセットはそのプラットフォームが変換できる大きさを超えているため、ルールはその旨のメッセージとともに破棄されます — 残したい場合はデスクトップでプロファイルをインポートしてください。ISOの国コードであれば、引き続き同梱のGeoIPデータベースが使われ、セットは要りません。- Chuteが自身で管理するプロトコルの詳細は引き継がれません: Hysteria2のポートホッピング(
ports)、TUICのheartbeat、AnyTLSのセッションプール調整、WireGuardのpeersリスト(単一のピアが設定されます)、workers。 - Chuteが実装していないトランスポートは、変換されるのではなく報告されます:
h2、http難読化、httpupgrade、v2ray-http-upgradeのWebSocketバリアント、WebSocketのmax-early-data、XHTTPのextra(XMUX / download-settings)。ただしsing-boxのアウトバウンドでtransport.typeがhttpupgradeまたはquicのものは例外で、何も出力されず報告もされません。インポート後にそれらのアウトバウンドを手で確認してください。 - Clashの動作
modeはChuteでは設定キーではなくランタイムのスイッチです。globalまたはdirectモードのプロファイルは、警告とともにルールモードに変換されます。 - YAMLは標準のパーサーで読み取られるため、アンカーや
<<マージキーが機能します。複数行スカラーで書かれた値は1行に折りたたまれます。改行があると、その値が入る設定行が分割されてしまうためです。 - ポリシー名が
{...}のプレースホルダーになっているプロファイル — サブスクリプション生成ツールが置換前に出力する形 — は、テンプレートであると1度明示されます。プレースホルダーへの参照を「未定義のポリシー」として並べるだけではありません。
本ページは英語版からの翻訳です。内容に相違がある場合は、英語版が優先されます。