その他オプション
[General]
ipv6 = true
loglevel = notify
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
tun-included-routes = 192.168.1.12/32
共通オプション
完全なIPv6サポートを有効にする(デフォルト: true)
ipv6 = true
loglevel(デフォルト: warning)
loglevel = notify
none、fatal、warning、notify、info、verboseのいずれか。verboseを日常使用で有効にすることは推奨されません。パフォーマンスが大幅に低下するためです。
skip-proxy
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
iOS版とtvOS版では、ホスト名のエントリはトンネルのプロキシ除外リストに追加され、そこへの接続はChuteプロキシではなくChute TUNで処理されます。IPアドレスやCIDRのエントリはさらにトンネルの除外ルートにもなるため、その範囲へのトラフィックはChute TUNで処理されるのではなく、トンネルの外へ出ていきます。Chute AndroidもVPNモードでは同様です: システムHTTPプロキシがオンの間、ホスト名、*ワイルドカード、IPv4アドレスは、VPNがアプリに渡すプロキシの除外リストに加わります。Android 13以降では、IPアドレスやCIDRのエントリはすべてVPNの除外ルートになります(単独のアドレスは/32または/128のルート)。ループバックのエントリは外されます。ループバックのトラフィックがトンネルに入ることはないからです。macOS版では、「システムプロキシとして設定」が有効な場合にこれらの設定がシステムに適用されます。このオプションは一部のアプリとの互換性問題を修正するために使用されます。
- 単一のドメインを指定するには、ドメイン名を入力します(例: apple.com)。
- ドメイン上の全てのWebサイトを指定するには、ドメイン名の前にアスタリスクを使用します(例: *apple.com)。
- ドメインの特定の部分を指定するには、各部分を指定します(例: store.apple.com)。
- IPアドレスでホストまたはネットワークを指定するには、192.168.2.11のような特定のIPアドレス、または192.168.2.*や192.168.2.0/24のようなアドレス範囲を入力します。
注意: IPアドレスまたはアドレス範囲を入力した場合、そのアドレスを使用してそのホストに接続する場合にのみプロキシをバイパスでき、そのアドレスに解決されるドメイン名でホストに接続する場合にはバイパスできません。
プロキシサーバーのリッスン
interface = 127.0.0.1
port = 8118
socks-interface = 127.0.0.1
socks-port = 8119
interface / portはHTTPプロキシサーバーのリッスンアドレスとポートを制御します(デフォルト127.0.0.1:8118)。socks-interface / socks-portはSOCKS5プロキシサーバーを制御します(デフォルト127.0.0.1:8119)。
平文のhttp://リクエストでは、HTTPプロキシサーバーの1つの接続が運ぶのは1回のやり取りだけです。各レスポンスはConnection: close付きで送られ、送り終えると接続が閉じられるため、クライアントは次のリクエストを新しい接続で送ります。最初のリクエストの後ろにパイプライン化されたリクエストは破棄され、クライアントが新しい接続で送り直します。同じ接続で何度も往復する必要がある認証方式(NTLMやNegotiateなど)は、これを経由すると完了できません。復号しないCONNECTトンネルには影響しません。WebSocketのアップグレードは接続を維持し、101レスポンスの後はデータが両方向にそのまま流れます。
互換性エイリアス:
doh-serverとdoh-serviceはdohのエイリアスとして受け付けられます。http-listen/socks5-listen(例:0.0.0.0:6152、[::]:6153、またはポート番号のみ)は上記のinterface/port設定にマッピングされます。ワイルドカードのリッスンホスト(0.0.0.0、::、*)はallow-wifi-access = trueも設定します。
インバウンドプロキシ認証
http-auth = username:password
ChuteのHTTPおよびSOCKS5プロキシサーバーを使用する前に、クライアントに認証を要求します。この行を繰り返して複数の認証情報を許可できます。
HTTPプロキシは、有効な認証情報のないリクエスト — 通常のリクエストでもCONNECTでも — に407 Proxy Authentication RequiredとProxy-Authenticate: Basic realm="KLNEKit"で応答し、接続を閉じます。SOCKS5サーバーは同じ認証情報をSOCKS5のユーザー名/パスワード認証で受け取り、それを提示しない接続や認証に失敗した接続を閉じます。
システムリクエストをバイパス
bypass-system = true
有効にすると、Chuteはプッシュ、iCloudのゲートウェイ、キャプティブポータルの確認、OCSPなど、Appleのホスト名 18 件の固定リストをskip-proxyに追加し、さらにIP-CIDR,17.0.0.0/8,DIRECT,no-resolveをルールの後ろ、FINALの直前に追加します — そのため、17.0.0.0/8に先にマッチするあなた自身のルールがあれば、そちらが優先されます。プロセスによる判定は行われません。このオプションの実体は、その固定のホストとアドレスのリストであって、どのプロセスが出したリクエストかで絞り込むものではありません。
デフォルト:
true。
常に実IPを使用
always-real-ip = *.example.com, tracker.example.org
ChuteがハイジャックされたDNSクエリに対してフェイクIPアドレスを提供する場合(hijack-dnsを参照)、このカンマ区切りリストにマッチするホスト名には、代わりに常に実際に解決されたIPアドレスが返されます。ワイルドカードがサポートされています。always-ip-address(Shadowrocketの表記)もこのキーとして読み込まれます: 真偽値(true、yes、on、1)はすべてのホストを意味し、always-real-ip = *に書き換えられます。falseは破棄され、それ以外の値はホストのリストとして読まれます。保存時はalways-real-ipの表記になります。
システムのhostsファイルを読み込む
read-etc-hosts = false
システムのhostsファイルを[Host]テーブルに読み込むかどうか。falseにするとそのファイルを無視します。変更は再読み込み時に反映されます。ローカルDNSマッピングを参照してください。
デフォルト:
true。
既存の接続を中断
interrupt-exist-connections = true
有効にすると、任意のポリシーグループで選択されたポリシーを(URLテスト、フォールバック、ロードバランス、SSID、または手動選択によって)変更した際に、古いポリシーを使用していた既存の接続を正常に切断します。これにより、接続が古いプロキシに残り続けることなく、新しく選択されたプロキシを即座に使用するようになります。
これは接続が通過するすべてのポリシーグループに適用されます。ルールが指定するグループ、その中にネストされたグループ、チェーンされたポリシー(underlying-proxy)の上流グループ、そしてリレーグループのメンバーであるグループです。
影響を受ける各接続は、強制切断される前に3秒のタイムアウトで正常に閉じられます。
デフォルト:
false。これはグローバル設定であり、全てのポリシーグループに影響します。
Network Framework(macOS / iOS / tvOS)
network-framework = true
アウトバウンド接続にApple Network.frameworkを有効にします。Network.frameworkを使用すると、サポートされているプラットフォームでより良いパフォーマンスと最新のTLSスタック統合が得られます。
デフォルト: macOSでは
true、iOSとtvOSではfalse。
単純なホスト名を除外
exclude-simple-hostnames = true
有効にすると、単純なホスト名(ドットを含まない単一ラベル名、例: localhost)へのリクエストはプロキシルールをバイパスし、ローカルで解決されます。これにより、ローカルネットワーク名に対する不要なDNSルックアップを回避できます。これはmacOSのシステムプロキシ自体の「単純なホスト名を除外」設定です。Chute Macがシステムプロキシ設定に書き込むため、システムプロキシに従うアプリケーションにのみ適用されます — 拡張モードやTUNのトラフィックには適用されません。iOSとtvOSでは同じようにトンネルのプロキシ設定に書き込まれるため、単純なホスト名はskip-proxyのホスト名と同じく、ChuteプロキシではなくChute TUNで処理されます。Chute Androidはこのオプションを使いません。
Chute Macでは、初回起動時に一度だけ実行されるマイグレーションによってこのオプションがデフォルトで有効になります。ユーザーが明示的にオフに設定した場合は、その設定が尊重されます。
デフォルト:
false。
データベース記録を無効にする
disable-db-record = true
有効にすると、Chuteはトラフィックレコードのローカルデータベースへの書き込みを停止します。これによりパフォーマンスが向上しストレージ使用量が削減されますが、Chute Dashboardでトラフィック履歴が利用できなくなります。
デフォルト:
false。
メニューバー速度表示(Macのみ)
menu-bar-show-speed = true
有効にすると、Chute Macは現在のアップロードおよびダウンロード速度をメニューバーに表示します。
現在のエンジンではパースされるだけで効果はありません — Chute Macのどこもこのキーを読みません。メニューバーの速度表示を切り替えるのはメニュー項目の 接続速度を表示 で、その状態はアプリ自身の設定に保存されます。キー自体は設定の保存時にそのまま書き戻されます。
他のDNSサーバーをハイジャック
hijack-dns = 8.8.8.8:53
デフォルトでは、ChuteはChute DNSアドレス(198.18.0.2)に送信されたDNSクエリに対してのみフェイクIPアドレスを返します。標準DNSに送信されたクエリは単に転送されます。
一部のデバイスやソフトウェアは常にハードコードされたDNSサーバーを使用します(例えば、Google Speakersは常に8.8.8.8を使用します)。このオプションを使用してクエリをハイジャックし、フェイクIPアドレスを取得できます。
hijack-dns = *:53を使用して全てのDNSクエリをハイジャックすることもできます。
ポートのないエントリはポート 53 を意味し、hijack-dns = 8.8.8.8 は 8.8.8.8:53 と同じです。読み取れないエントリは通知とともにスキップされ、行の残りはそのまま適用されます。
フェイクIPはApple TV(tvOS 17 以降)でも利用できます。以前は無効化されていました。実機での検証は進行中です。
除外ルート
tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
Chute VIFはTCPおよびUDPプロトコルのみを処理できます。このオプションを使用して特定のIP範囲をバイパスし、全てのトラフィックを通過させます。
注意: このオプションはiOSとtvOSのパケットトンネルに適用され、指定した範囲はトンネルのIP設定の除外ルートになります。Android 13以降のChute Androidにも適用され、範囲はVPNの除外ルートになります — Android 11と12には除外ルートのAPIが無いため、そこでは無視されます。macOSでは、どちらの拡張モードタイプでも効果がありません — ヘルパーのutunもMacのNetwork Extensionも、ルートを除外しません。Chuteプロキシサーバーによって処理されるリクエストは影響を受けません。'skip-proxy'と'tun-excluded-routes'を組み合わせて、特定のHTTPトラフィックがChuteをバイパスするようにしてください。
このオプションはシステムエラーENOMEM(メモリを割り当てられません)を引き起こす可能性があります。これはiOSシステムのバグのようです。可能であればこのオプションを使用しないでください。
含めるルート
tun-included-routes = 192.168.1.12/32
デフォルトでは、Chute VIFインターフェースは自身をデフォルトルートとして宣言します。しかし、Wi-Fiインターフェースがより小さいルートを持っているため、一部のトラフィックがChute VIFインターフェースを通過しない場合があります。このオプションを使用してより小さいルートを追加します。
デフォルトルートだけでは足りない理由: システムはルートを順番ではなくプレフィックス長で選びます。物理インターフェース自身のオンリンクサブネット — たとえば192.168.1.0/24 — はトンネルの0.0.0.0/0より具体的なので、そのトラフィックはChuteに届きません。ここにエントリを書くと、さらに具体的なルートがインストールされ、そちらが選ばれます。これらのルートはデフォルトルートに追加されるものであり、トンネルが捕捉する範囲を狭めることはありません。
注意: プライベートアドレス範囲(
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)をまるごと並べるのは避けてください。通常は不要であり、システム自身のルーティングを乱すおそれがあります。Chuteはそうしたエントリも受け入れますが、警告をログに残します — ただしmacOSの拡張モードのNetwork Extension方式は、警告を残さずに受け入れます。このオプションを使う理由として多いのは、別のVPNアプリのトンネルが持つ範囲に到達したい場合です。注意: Chute自身の足元を切り落としてしまうようなエントリは拒否され、理由がログに残ります: ループバック、VIF自身のサブネット(
198.18.0.0/15とfd12:1:1:1::/64)、リンクローカル、マルチキャスト、ブロードキャスト、そしてプレフィックス長0です。macOSの拡張モードのHelper utun方式は、さらに現在のデフォルトゲートウェイを含むエントリも拒否します。Network Extension方式では、理由はChuteのログではなくシステムログに残ります。注意: iPhoneでは、ローカルネットワークを捕捉するかどうかをシステムが別途決めます。ここに挙げたローカルサブネットが効くのは、アプリの設定でローカルネットワークを含むも有効になっているときだけです — このスイッチはすべてのネットワークを含むがオンのときにしかオンにできません。別のアプリのトンネルが持つ範囲には、このスイッチは要りません。Chute tvOSにも同じスイッチがありますが、トンネルには適用されません。macOSではルートが直接インストールされるため、このようなゲートはありません。
注意: macOSでは、拡張モードのHelper utun方式がインターフェースの接続時にこれらのルートをインストールするため、リストを変更すると再読み込み時にインターフェースが接続し直されます。このオプションにはヘルパーのバージョン 0.8.6 以降が必要です — Chuteの更新後、ヘルパーの再インストールを求めるプロンプトを一度承認してください。承認しないと、Helper utun方式はヘルパーが実行されていないと報告します。
プロトコルスニッフィング
sniffing-enabled = true
sniffing-timeout = 100
Chuteは初期バイトを検査することで接続の実際のプロトコルを検出できます。これにより、非HTTPインバウンド接続でもPROTOCOL,TLS,Proxyのようなルールが正しく機能します。
sniffing-enabled(デフォルト: false)
sniffing-enabled = true
TCP接続のプロトコル検出を有効にします。拡張モードでは、同じスイッチにより、素のIPアドレス宛てのHTTP/3(QUIC)フローも名前で照合できます。ChuteはQUICのClientHelloからサーバー名を読み取り、DOMAIN系ルールはアドレスの代わりにその名前を見ます。同じフローの後続パケットはすべて最初のパケットの判定に従います。1 パケットに収まらない大きなClientHello(ポスト量子鍵交換では一般的)は、それを運ぶ各Initialパケットからフロー単位で再構成され(再構成後のhelloは最大 16 KiB)、名前も読み取られます。helloの残りが届くまでの間、そのフローのデータグラムは素のアドレスで送出されずに保留され、名前が読めた時点でその名前のポリシーに従ってまとめて送出されます — 分割されたhelloの最初の断片が残りと別経路をたどることはもうありません。歯止めは、待機 1 秒、1 フローあたり 8 データグラムまたは 16 KiB、同時に再構成中のフロー 64 本です。いずれかを超えたフロー、およびInitialパケットがいつまでもClientHelloを揃えられないフローは、従来どおりアドレスで照合されます。
sniffing-timeout(デフォルト: 100ms)
sniffing-timeout = 200
プロトコルを判断するために初期データを待つ最大時間(ミリ秒)。遅い接続でプロトコル検出が失敗する場合は、この値を増やしてください。
QUICのブロック
block-quic = auto
検出されたQUIC(HTTP/3を含む)トラフィックをChuteが拒否するかどうかを制御します。QUICはUDP上で動作するため、ChuteのHTTP MitMでは復号できません。QUICを拒否すると、対応するクライアントにTCPでの再試行を促し、TCPベースのプロキシ処理や、設定済みの場合はHTTPS復号を適用できるようになります。
| 値 | 動作 |
|---|---|
off |
QUICのグローバルブロックを適用しません(デフォルト)。検出されたQUICトラフィックは通常のルーティングルールに従います。 |
on |
DIRECTにルーティングされたトラフィックを含め、検出されたすべてのQUICフローを拒否します。 |
auto |
最終的なアウトバウンドポリシーがプロキシの場合にのみ、検出されたQUICを拒否します。DIRECTにルーティングされたトラフィックは許可され、REJECTにルーティングされたトラフィックはそのルールによって引き続き拒否されます。 |
all |
Surgeにおける on の表記です。 |
all-proxy、per-policy |
Surgeの表記で、どちらも auto として読み込まれます — Chuteにはポリシー単位のQUICブロックがないため、per-policy はプロキシ経由のすべてのQUICフローをブロックします。プロファイル保存時には書いたとおりの語が保持されます。 |
TUN経由のトラフィックでは、拒否されたQUICフローにICMP/ICMPv6 Port Unreachableメッセージを返すため、対応するクライアントはQUICのタイムアウトを待たずにTCPへフォールバックできます。
拒否されたQUICフローは、ルールがどのポリシーを選んだかにかかわらず、ポリシー
REJECTとして記録されます。
block-quicのQUIC検出は自動的に行われ、sniffing-enabledは必要ありません。sniffing-enabledはプロトコルスニッフィング — TCP上のTLSと、QUICフローのサーバー名 — を制御します。QUICフローをルール単位で処理する場合は、PROTOCOL,QUIC,...ルールを使用してください。
トンネル内でICMPに応答する
icmp-auto-reply = false
トンネルに入ってきたICMPエコー要求は — IPv4でもIPv6でも — Chute自身が応答します。応答はローカルで生成され、宛先には何も送られません。そのため、ルールが REJECT する宛先や停止中のホストも含め、どの宛先も応答を返すことになり、トンネル内で ping が成功しても宛先に到達できるかどうかは分かりません。false にすると応答をやめます。要求は端末の外へ中継されますが、その応答はトンネルを通って戻ってこないため、ping は決して応答されません。
デフォルト:
true。TUN経由で到着したトラフィックに適用されます。ICMPがプロキシされることはありません。
TUNをバイパス
bypass-tun = 192.168.0.0/16, 10.0.0.0/8
skip-proxyと似ていますが、TUN/VIFルーティングレベルで動作します。これらのIP範囲への接続はTUNインターフェースを完全にバイパスし、システムネットワークスタックを直接通過します。
注意: このオプションはiOSとtvOSのパケットトンネルに適用され、その範囲は
tun-excluded-routesと合わせてトンネルの除外ルートになります。Android 13以降のChute Androidでも同様です(Android 11と12では無視されます)。macOSでは、どちらの拡張モードタイプでも効果がありません。
拒否時にエラーページを表示
show-error-page-for-reject = true
有効にすると、Chuteは拒否されたリクエストに対してユーザーフレンドリーなエラーページを返します。これが適用されるのはHTTPプロキシのインバウンドから届いたリクエストだけで、このオプションがオフのとき、そうしたリクエストには代わりにHTTP/1.1 503 Service Unavailableが返されます。それ以外のインバウンドから来た拒否対象のリクエストは、どちらの場合も切断されます。
デフォルト:
false。
楽観的DNS
optimistic-dns = false
有効にすると、Chuteはバックグラウンドでレコードを更新しながら、キャッシュされたDNS結果を即座に返します。これにより、古いDNSレコードを返す可能性と引き換えに接続レイテンシが削減されます。無効にすると、TTLの切れたレコードは返されずに破棄され、問い合わせはアップストリームへ向かいます。バックグラウンドの更新は行われるため、次回の問い合わせはキャッシュから返されます。さらに、すべてのプラットフォームで、1 つの名前の複数アドレスへ同時に接続するかどうかも制御します。
デフォルト:
true。無効にするにはoptimistic-dns = falseを設定してください。
Wi-Fiアクセスを許可
allow-wifi-access = true
同じネットワーク上の他のデバイスからChuteのHTTP / SOCKS5プロキシポートに到達できるようにします。両方のリスナーのバインドアドレスを 0.0.0.0 に広げる動作です。Surge形式の設定(および sing-box インポート時の allow-lan マッピング)はこのフラグだけを持ち、interface は既定の 127.0.0.1 のままなので、フラグ自身がバインドアドレスを広げる必要があります。
このフラグと明示的なワイルドカード
interfaceは同じ意図の二通りの書き方で、Chuteは両者の和集合を取ります。すでに0.0.0.0と書かれた設定の動作は変わりません。フラグを変更すると両方のリスナーが再バインドされるため、アクセスの取り消しは再起動を待たずリロード時に反映されます。これらはプロキシポートであり、
http-authを設定しない限り認証はありません。自分の管理外のネットワークでは認証情報も設定してください。
管理設定
#!MANAGED-CONFIG https://example.com/config.conf interval=86400 strict=false
先頭行に #!MANAGED-CONFIG ヘッダーを持つ設定は、そのURLから自動的に再取得されます。ヘッダーのパラメータと更新の動作については管理設定を参照してください。
レプリカ / トラフィック記録
replica = true
[General] の replica キー(replica = true)がトラフィック記録を有効にします。[Replica] セクションはChute Dashboardに表示される内容のフィルタリングを担当し、そのキーはレプリカに記載されています。
iOS、tvOS、Androidでは、これに加えて有効なライセンスが必要です。ライセンスが無ければ
replica = trueでも何も取得されません。
外部コントローラーアクセス(Chute Dashboard)
external-controller-access = password@0.0.0.0:6155
Chute Dashboardが使用するリモートコントロールサーバーを起動します。値はpassword@host:portです。パスワードの前に任意でユーザー名を付けられます(user:password@host:port)。iOSとtvOSでは、付随するUSBチャンネルがport + 1で開かれます(macOSでは開かれません)。接続方法はChute Dashboardのページにあります。
HTTPコントロールAPIとWebコンソール
[General]
external-http-controller = 127.0.0.1:9090
external-http-secret = your-secret-token
external-http-ui = true
external-http-cors = false
Chuteは、ClashやSurgeのダッシュボードと同様の組み込みHTTPコントロールAPIとWebコンソールを提供します。APIはRESTエンドポイントを通じてエンジンステータス、トラフィック、接続、DNS、ポリシー制御、設定管理を公開します。
Surgeのhttp-api = <シークレット>@<ホスト>:<ポート>はexternal-http-controllerとexternal-http-secretとして読み込まれます。各部分を分けて書くこともできます: http-api-secret、http-api-ui、http-api-corsはそれぞれexternal-http-secret、external-http-ui、external-http-corsとして、http-api-web-dashboardもexternal-http-uiとして読み込まれ、設定はexternal-http-*キーで保存されます。http-api-tlsはサポートされておらず(コントローラーは平文HTTPで動作します)、通知が出るだけです。
external-http-controller(デフォルト: 無効)
external-http-controller = 127.0.0.1:9090
コンソールが配信中に常駐させるリクエストの上限はmacOSで 4 MB、iOS・tvOS・Androidで 1 MBです。
HTTPコントロールサーバーのアドレスとポート。ローカル限定にするには 127.0.0.1 を使います。ループバック以外のアドレス(例: 192.168.1.5:9090)にバインドする場合は external-http-secret の明示が必須です。指定がなければサーバーは起動を拒否し、何が足りないかをログに残します。
ワイルドカードアドレス(0.0.0.0、::、*)はこの検査ではループバック以外として扱われます。すべてのインターフェースで待ち受ける、つまりローカル限定の正反対だからです。受け付けられる書き方は 0.0.0.0:9090、*:9090(同じ意味)、IPv6なら [::]:9090 です — 裸の :::9090 は自動的に角括弧で囲まれます。解析できないアドレスは、コントローラーを黙って無効にする代わりに設定エラーとして報告されます。127.0.0.0/8 全体がループバックであり、127.0.0.1 だけではありません。
external-http-secret(デフォルト: 自動生成されたトークン)
external-http-secret = your-secret-token
API認証に使うBearerトークン。リクエストにはヘッダー Authorization: Bearer <secret> が必要です。トークンはこのヘッダーでのみ受け付けられ、クエリパラメータでは渡せません。比較は定数時間で行われます。認証失敗は 401 と {"ok": false, "error": {"code": "unauthorized", "message": "missing or invalid token"}} を返します。データを扱うルートはすべて保護されます: /api/*、Clash互換エイリアス、そしてChute Androidだけが引き続き提供する旧来のルート(/status、/policies、/dns、/recordsなど)で、これらもトークンをこのヘッダーでしか受け付けません。Chute Android自身のリモートダッシュボードは、現在は/api/*だけを使います。Webコンソールのページと静的アセット(/、/assets/…、Chute Androidではさらに /ui)にトークンは不要です(external-http-ui = false ではそれ自体が無くなり、ページは 404 になります)。
このキーが無い場合、Chuteは認証なしで配信するのではなくトークンを生成します。 生成されたトークンはChuteの共有フォルダー内の control-token に所有者のみ読み取り可能な権限で書き出されます — 設定ファイルの隣ではなく、iOSとtvOSではApp Groupコンテナ、Androidではアプリのプライベートデータディレクトリです。再起動後も使い回され、各アプリが表示します(Webコンソールを開くを参照)。コントロールAPIは接続データベースを渡すことができ、その記録には実行中に見たすべての URL・ヘッダー・プロセス名が含まれます。認証なしが既定であってよい理由はありません。
それでも認証なしで配信したい場合は、設定で明示してください:
external-http-secret = none
これが受け付けられるのはループバックへのバインドのときだけです。ループバック以外では、none もキー無しも不十分で、コントローラーは起動を拒否し、何が必要かを伝えます。
アップグレード時の注意: 「
external-http-secretが無い=認証なし」に依存していた場合、ローカルのスクリプトは401を受け取るようになります。アプリから生成トークンを読み取るか、external-http-secret = noneと書いて従来の動作を明示的に選んでください。
external-http-ui(デフォルト: true)
external-http-ui = true
有効にすると、Chuteはコントローラーアドレスで組み込みWebコンソールを提供します。Webコンソールは概要、接続管理、DNS検査、トラフィック監視、ポリシー制御、設定編集を提供します。APIを有効にしたままUIを無効にするにはfalseに設定します。
Webコンソールを開く
コンソールはコントローラーのアドレスで提供されます。各アプリはアドレスとトークンを渡してくれます — 自動生成されたトークンも含めてで、そうでなければ読む手段がありません:
- Chute Mac: メニューバー → Webコンソールを開く、およびWebコンソールのトークンをコピー。接続の詳細ウィンドウにも リクエストと履歴 があり、コンソールを開きます — 開くのはホームで、その接続そのものではありません。
- Chute iOS: コントロールパネル → Webコンソールの行 → 開く、アドレスをコピー、アクセストークンをコピー。
- Chute tvOS: コントロールパネルにはWebコンソールアドレス という独立した行があり、ホストとポートを表示します。選択すると、リスナーが他のデバイスから到達可能ならQRコードが表示されます — サインイン用トークンは画面ではなくコードの中にだけ入っています。コントローラーがループバックにバインドされている場合は代わりに説明が表示されます。ループバックのコンソールはスマートフォンから開けないからです。
- Chute Android: コントロールパネル → Webコンソールのアドレス → 開く または アドレスをコピー、そしてタップでコピーできる 生成されたアクセストークン の行。トークンが自分で設定したシークレットの場合はどちらの行も現れず、そのシークレットが表示されることはありません。
これらが示すアドレスはトークンをクエリパラメータとして含みます。ページは読み込み時にそれを消費してアドレスバーから取り除くため、リンクを開くだけでサインインが完了し、32 桁の 16 進数を書き写す必要はありません。
external-http-cors(デフォルト: false)
external-http-cors = true
APIレスポンスにCORS(Cross-Origin Resource Sharing)ヘッダーを有効にします。Webコンソールやサードパーティツールが異なるオリジンからAPIにアクセスする必要がある場合に便利です。
APIエンドポイント:
| メソッド | エンドポイント | 説明 |
|---|---|---|
GET |
/api/status |
ランタイムステータス、ポート、稼働時間 |
GET |
/api/traffic |
グローバルおよびポリシーごとのトラフィックカウンター |
GET |
/api/connections |
現在のアクティブな接続 |
DELETE |
/api/connections/:id |
接続を閉じる |
GET |
/api/connections/history |
履歴接続レコード |
GET |
/api/connections/processes |
プロセスごとの接続統計 |
GET |
/api/connections/:id/request |
接続のキャプチャされたリクエストデータ |
GET |
/api/connections/:id/response |
接続のキャプチャされたレスポンスデータ |
GET |
/api/dns |
DNSキャッシュレコード |
DELETE |
/api/dns/cache |
DNSキャッシュを消去 |
DELETE |
/api/dns/records/:domain |
単一のDNSレコードを削除 |
GET |
/api/config |
現在の設定 |
PUT |
/api/config |
設定を再読み込み |
POST |
/api/config/validate |
設定を解析してエラーを報告する(読み込みはしない) |
GET |
/api/policies |
ポリシーグループと現在の選択。各項目にhiddenが付き、hidden=trueのグループではtrue |
PUT |
/api/policies/:group |
ポリシーグループの選択を変更 |
PUT |
/api/mode |
アウトバウンドモードを設定 |
GET |
/api/features |
機能スイッチの状態 |
PUT |
/api/features/mitm |
MitMを切り替え |
PUT |
/api/features/record-traffic |
トラフィック記録を切り替え |
GET |
/api/rules |
マッチャーが実際にたどるルール表、各ルールの出どころ、命中した書き換えルール |
POST |
/api/rules/match |
リクエストがどこへ送られるか(実際には送らない) |
GET |
/api/logs |
最近のログエントリ |
GET |
/api/loglevel |
現在のログレベルと、書き出し中のセクション |
PUT |
/api/loglevel |
再起動せずにログレベルやセクションを変更 |
GET |
/api/health |
エンジンの健全性: 拒否数、世代、フットプリント、前回の終了 |
GET |
/api/events |
この実行で注目すべき出来事 |
GET |
/api/tailscale |
Tailscaleエンジンの現在の状態 |
GET |
/api/scripts |
オンデマンドで実行できるgenericスクリプトの一覧 |
POST |
/api/scripts/run |
genericスクリプトを名前で1つ実行 |
POST |
/api/diagnostics/ping |
ICMPまたはTCPによる到達性プローブ |
POST |
/api/diagnostics/dns-query |
実行中のリゾルバーでドメインを解決 |
POST |
/api/diagnostics/egress-probe |
アドレスを確認: Appleのエンジンではデバイス自身のアドレス、Androidのエンジンでは公開の出口アドレス |
POST |
/api/diagnostics/internet-test |
直接インターネットテスト: プロキシを通さずにinternet-test-urlを取得 |
POST |
/api/diagnostics/url-test/:policy |
ポリシーのレイテンシテストを実行 |
POST |
/api/diagnostics/bundle |
秘匿処理済みの診断アーカイブを作成 |
GET |
/api/connections/export |
接続をHAR 1.2 として書き出し |
GET |
/api/rewrites |
すべての書き換え・モックレスポンスのファミリーとMitMホスト一覧 |
GET |
/api/rewrites/:family |
1つのファミリーのルール |
POST |
/api/rewrites/:family |
ルールを追加 |
DELETE |
/api/rewrites/:family/:id |
ルールを削除 |
DELETE |
/api/rewrites/:family |
ファミリーをクリア |
GET |
/api/mitm/hosts |
現在復号しているホスト |
POST |
/api/mitm/hosts |
ホストを追加 |
DELETE |
/api/mitm/hosts/:host |
ホストを削除 |
DELETE |
/api/mitm/hosts |
一覧をクリア |
GET |
/api/rules/providers |
ルールプロバイダーとルールセット、およびそれぞれの状態(読み込めなかった理由を含む) |
エンドポイントの注意点:
GET /api/connectionsはlimit(正の整数、デフォルトおよび最大は1000)とcursor(カーソルより大きいidを持つ接続のみを返す)を受け付けます。レスポンスのdataにはconnections、total、page_size、has_moreが含まれ、さらにページがある場合はnext_cursorも含まれます。GET /api/connections/historyはlimit(デフォルト100、最大1000)とcursor/before(同義。両方を渡すと拒否されます)を受け付けます。GET /api/connections/:id/requestと.../responseは{"connection_id": <id>, "data": "<base64>"}を返します。2 MiBを超えるキャプチャは413を返します。GET /api/configは、機密値(http-auth、external-http-secret、ca-p12、ca-passphrase、WireGuardの鍵など)を<redacted>に置き換えた設定を返します — 結果をそのままPUT /api/configに送り返さないでください。プレースホルダーがそのまま設定に書き込まれてしまいます。GETとPUT /api/configは/api/configsとしても、またClashのエイリアス/configsとしても到達できます。PUT /api/configはJSON{"configuration": "<full text>"}、または生の設定テキストをリクエストボディとして受け付けます(上限1 MB)。成功するとエンジンが再読み込みされます — 実行されていなかった場合は起動します。PUT /api/policies/:groupは、ボディのキーpolicy、name、selected、selectのうち最初に存在するものから選択値を取ります。値はポリシー名でも、数値インデックスの文字列でも構いません。特殊なグループ名GLOBALはグローバル選択ポリシーを設定します。PUT /api/modeはJSON数値を必要とします:{"mode": 0}—0はルール、1は直接接続、2はプロキシです。PUT /api/features/mitmとPUT /api/features/record-trafficは{"enabled": true}を取ります。GET /api/logsはsince(Unix秒)を受け付けます。インメモリバッファは最新の1000エントリを保持し、各エントリは{timestamp, wall_time, level, section, message}です —timestampとwall_timeは同じUnix秒の値を持ち、時計が進まないときはエントリの順序が厳密に保たれるよう少しだけ前に進められます。GET /api/healthはエンジンが何を保持しているか、直近で何を理由に拒否したか、そして前回の実行がどう終わったか(clean、unclean、suspected_memory— トラブルシューティングを参照)を返します。GET /api/eventsはメモリ上のリングを返します。?persisted=1はこの実行の保存済み履歴を読み、記録が無効ならavailable: falseを返します。[Tailscale]セクションが無い場合、GET /api/tailscaleはstate: "idle"を返します。これはエラーではなく正常な答えです。POST /api/diagnostics/*の各プローブはクエリ文字列でもJSONボディでも引数を受け取り、10 秒で打ち切られ、必ず 1 回だけ応答します。url-test/:policyは定義されていないポリシー名を拒否し、REJECTを計測したりはしません。GET /api/scriptsは有効なgenericスクリプトを{name, type}の形で一覧します。POST /api/scripts/runはボディまたはクエリ文字列からnameを取り、診断プローブと同じように打ち切られ、{name, timedOut, result}を返します —timedOutは、$doneを呼ばずに終わったスクリプトと最後まで走ったスクリプトを見分けます。有効なgenericスクリプトでない名前は404です。POST /api/rules/matchは接続を開かずにリクエストがどこへ行くかを答えます。host(または host とポートを取り出すためのurl。URL-REGEXルールはこのurlを書かれたとおりに照合します。実際のトラフィックでこのルールが見るのは平文のhttp://リクエストだけですが)、port(既定 443)、および任意でip、protocol、process、process_path、src_ip、src_port、in_port、in_type、in_user、in_name、network、ssid、bssid、from_tun、user_agentを受け取ります — 知らないフィールドは無視されず、受理可能な一覧とともに拒否されます。応答にはmatched(ルールの行、種別、指名するポリシー、そしてグループが現在指しているresolved_policy)、policy、need_resolve、そして算出の根拠となったrule_countとmatch_generationが含まれます。ドメインは 2 回マッチされる(名前で 1 回、アドレスが判明してからもう 1 回)ためpassesは 1 パスにつき 1 項目です。ipを渡さない場合は解決前のパスだけになり、応答はnoteでそう伝えます。explain=trueを加えると、同じくマッチし得た候補ルールを最大 50 件、展開しなかったルールセットの数とともに返します。POST /api/config/validateは設定を解析して捨てます。動作中のエンジンは何も取り込みません。{"configuration": "<full text>"}として送るか、生のテキストをそのまま送ってください。応答はvalid、error_count、advisory_count、rule_count、policy_count、および{line, severity, content, error}からなるerrorsの一覧です —severityは拒否された行と、留保付きで受理された行を区別し、contentは問題の行(伏字済み。壊れた[Proxy]行はたいてい、それを壊した当のパスワードを抱えているからです)。PUT /api/configの前に使ってください。あちらはデバッグ中の実行を再起動してしまいます。GET /api/loglevelは現在のlevel、nslog_level、ファイルに書き出し中のsections、そして設定可能なavailable_levels/available_sectionsを返します。PUT(またはPATCH)はlevel、sections、またはその両方を受け取ります。sectionsはセクション名の配列か文字列"all"で、空の配列は拒否されます — 記録を止めたい場合はlevelをnoneにしてください。この方法でレベルを変えても実行は再起動されません。それがこのAPIの意義です: ファイルに書いたloglevel = verboseは再読み込みが必要で、再読み込みは見ようとしていたものを失わせます。GET /api/rulesはrewrite_hitsも返します。この実行で命中した書き換え・モックレスポンスのルールとその回数です。そこに現れないルールは一度も命中していません — 「書き換えが効かない」の最も一般的な理由がこれです。この表が追跡するのは最大 512 種類のルールで、それを超えた分はrewrite_hit_dropped_rulesとして報告されます。rulesはマッチャーが実際にたどるすべてのルールを順番に並べます。Tailscaleの自動ルール、モジュールのルール、設定の[Rule]セクションの順で、最後がFINALです。rule_regionsは各行の出どころを同じ添字で示します(front、module、configuration)。POST /api/rewrites/:familyは{"rule": "<configuration line>"}を受け取ります。設定ファイルに書くのと同じ一行です。解析できない行は400で拒否され、決して命中しないルールとして保存されることはありません。:familyはurl-rewrite、header-rewrite、body-rewrite、mockのいずれかです。この方法で追加したルールは実行中のエンジンにのみ存在し、設定ファイルには書き戻されません。GET /api/connections/export?format=harはHAR 1.2 ドキュメントを、POST /api/diagnostics/bundleは zip を返します。どちらもファイルなので、他のエンドポイントと違い{"ok": ..., "data": ...}のエンベロープには包まれません。exportはsource(既定はcurrent、ほかにhistory)、limit(既定 100、最大 300)、ids、および取得済みペイロードを含めるbodies=1を受け付けます。各エントリにはHARに対応するフィールドが無い情報 — 選ばれたポリシー、命中したルール、発動した書き換え — が_klオブジェクトとして付きます。- チェーンされた接続の
GET /api/connectionsとGET /api/connections/historyのレコードはchainPathを持ちます。この端末から出口までの経路で、例えばAirport/HK-01 → Landingです。単一のポリシーを使った接続では空で、HAR 書き出しでは_kl.chainになります。GET /api/trafficのポリシー別カウンターでは、上流もチェーン接続のために運んだバイト数を数えます。全体の合計には一度だけ数えられます。
例 — ステータスを読み取り、ポリシーグループを切り替える:
curl -H "Authorization: Bearer your-secret-token" http://127.0.0.1:9090/api/status
{"ok":true,"data":{"running":true,"outbound_mode":0,"mitm":false, ...}}
curl -X PUT -H "Authorization: Bearer your-secret-token" \
-d '{"policy": "ProxyB"}' http://127.0.0.1:9090/api/policies/MainGroup
{"ok":true,"data":{"outbound_mode":0,"selectable_groups":[...], ...}}
例 — リクエストを送る前に、それがどこへ行くかを尋ねます:
curl -X POST -H "Authorization: Bearer your-secret-token" \
-d '{"url": "https://api.example.com/v1/orders", "explain": true}' \
http://127.0.0.1:9090/api/rules/match
{"ok":true,"data":{"policy":"MainGroup","matched":{"rule":"DOMAIN-SUFFIX,example.com,MainGroup", ...}, ...}}
再現している最中に、実行を再起動せずログを 1 つのサブシステムに絞ります:
curl -X PUT -H "Authorization: Bearer your-secret-token" \
-d '{"level": "verbose", "sections": ["MitM", "DNS"]}' \
http://127.0.0.1:9090/api/loglevel
注意: この機能はデフォルトで無効です。全てのレスポンスは、成功時には
{"ok": true, "data": {...}}、エラー時には{"ok": false, "error": {"code": "...", "message": "..."}}のエンベロープを使用します。リクエストボディの上限は1 MBです。
PUTエンドポイントはPATCHも受け付けます。サードパーティのダッシュボード向けに、Clash互換のエイリアスパスが利用可能です:/version、/traffic、/connections、/configs、/proxies、/rules— パスには到達できますが、レスポンスはClashのスキーマではなくChute自身のエンベロープとフィールド名を使用するため(/versionは{"name", "run_id", "egress_probe"}を返し、egress_probeはAppleエンジンではnetwork_address、Androidエンジンではegress_ipです)、Clashダッシュボードはそのままでは動作しません。
プロキシテストURL
[General]
proxy-test-url = http://cp.cloudflare.com/generate_204
test-timeout = 3
proxy-test-urlは、独自のurlを設定していないすべてのurl-test、fallback、load-balanceグループの計測URLで、test-timeout(秒)はtimeoutを設定していないそうしたグループのタイムアウトです。設定を保存した後も、グループはこれらのキーに従い続けます。上書きするのはグループの行に書いたurlやtimeoutだけです。不正なproxy-test-urlは設定エラーです。internet-test-urlはWebコンソールの直接インターネットテストで使われ、プロキシを経由しません。未設定の場合は、エンジン内蔵の成功確認URLを使います。
UDPを中継できないポリシーのUDP
udp-policy-not-supported-behaviour = DIRECT
ポリシーがUDPを中継できない場合(通常のHTTPプロキシなど)に、そのUDPデータグラムをどう扱うかを指定します。REJECT(デフォルト)は破棄し、DIRECTは代わりに直接送信します。block-quicはこれより先に、ルールが選んだポリシーに基づいて判定されます: block-quic = autoでは、UDPを中継できないプロキシへ向かうQUICは直接送信されずに拒否されます。それ以外のUDPは引き続きDIRECTにフォールバックします。上流経由でUDPを送れないチェーンされたポリシーのUDPも同じように扱われます。アウトバウンドモードに従うDoQやDoH3のアップストリームがUDPを運ばないポリシーに当たった場合も同様で、REJECTではそのアップストリームをスキップし、DIRECTでは直接問い合わせます。
フロントプロキシ
[General]
global-underlying-proxy = Airport
自身のunderlying-proxyを持たないすべてのプロキシポリシーを、指定したポリシーまたはグループ経由で接続させます。Shadowrocketがフロントプロキシ(前置代理)と呼び、アプリ内でのみ設定するものです。プロキシプロバイダーのポリシーも含まれます。対象外になるのは、フロントポリシー自身を通る接続が通りうるすべてのポリシー(そのメンバー、それらの上流、その中のリレーのホップ。これによりフロントポリシーが自分自身を経由することはありません)、対象外を意味するunderlying-proxy=DIRECTを書いたポリシー、メンバー側で決まるポリシーグループ、そしてDIRECT、REJECT、TAILSCALEです。キーを書かないかDIRECTを書くと無効になります。定義されていない名前の場合、対象となるはずのポリシーはすべて直接接続されずに拒否されます。
close-if-proxy-chain-missing(Shadowrocket)は読み込まれ、プロファイル保存時に書き戻されます。Chuteは常にそのtrueと同じ動作をし、上流が欠けたチェーンのポリシーを拒否します。Shadowrocketのデフォルトであるfalse(欠けたホップを飛ばしてノードへ直接接続する)には従わず、その旨の通知を一度出します。
クライアントフィンガープリント
global-client-fingerprint = chrome
独自の fingerprint を持たないすべてのポリシーにTLSクライアントフィンガープリントを設定します。 プロキシプロバイダーが提供するポリシーも対象です。 ポリシー側の値が常に優先されるため、これは上書きではなくデフォルト値です。
指定できる値は chrome、firefox、safari、ios に加えて edge、360、
qq、android、random で、後者はいずれもChromeとして扱われます。さらに
fingerprintに挙げたその他の名前も使えます。認識できない値は
警告 Ignoring unsupported global-client-fingerprint '<value>' とともに無視され、
プラットフォームのTLSスタックが使用されます。
デフォルト: 空(プラットフォームのTLSスタック)。ShadowTLSのポリシーは常にこれを読み取り、 VLESSのポリシーは
tls=trueかreality=true、TrojanとVMessのポリシーはtls=true、 Shadowsocksのポリシーはws=trueとtls=trueの両方があれば読み取ります。gRPCトランスポートの ポリシーもtls=trueを書く必要があります。ShadowsocksRのポリシーは読み取りません。
本ページは英語版からの翻訳です。内容に相違がある場合は、英語版が優先されます。