Webコンソール
Chuteは動作中のエンジン内からHTTPで管理コンソールを提供します。全プラットフォームで同一の唯一のインターフェースであり、設定するのではなく見る必要があるとき — リクエストの経路、発動しない書き換え、接続が拒否された理由 — 本マニュアルは常にここを指します。
これはChute Dashboard ではありません。DashboardはChuteインスタンスに接続する独立したmacOSアプリで、ここで説明するコンソールはエンジン自身が提供し、ブラウザで開きます。
有効化と入り方
コンソールには [General] セクションの external-http-controller が必要です。既定では無効です:
[General]
external-http-controller = 127.0.0.1:9090
external-http-ui = true
コンソールが配信中に常駐させるリクエストの上限はmacOSで 4 MB、iOS・tvOS・Androidで 1 MBです。
アクセスには認証が必要です。external-http-secret を設定しない場合、Chuteはトークンを生成して control-token ファイルに保存し、再起動後も同じトークンを使い続けます。したがって実際の入り方は、トークンが付いたアドレスをアプリから受け取ることです。ページは読み込み時にそのアドレスからトークンを取り込み、ブラウザのlocalStorageに保持するので、ブラウザごとのサインインは一度で済みます。各プラットフォームに入口があります — Webコンソールを開く を参照してください。
Overview(概要)
サービスが動作中かどうか、稼働時間、メモリ使用量、HTTPとSOCKSのリスナーのアドレスとポート、そしてこの実行が使っているファイルパス。ブラウザのタブがどのインスタンスを指しているのか分からなくなったとき、このページが教えてくれます。
Traffic(トラフィック)
エンジン全体の累積バイト数と現在の速度、速度の履歴グラフ、アダプターごとの内訳。「そもそも何か流れているのか」に答え、ポリシーグループが複数の出口から選んでいるとき実際にどれが担っているかを見るために使います。
Connections(接続)
最も長く見ることになるページです。タブは 2 つあります:
- Current(現在) — いま開いている接続。
- History(履歴) — 閉じた接続。新しい順で、この実行の記録から読み戻されます。
各行にはホスト、ポート、種別、選ばれたポリシー、命中したルール、継続時間、バイト数が並びます。継続時間はこのブラウザタブがその接続を初めて見た時点から数えたもので、接続が開かれた時点からではないため、意味を持つのはCurrent(現在) タブだけです。Inspect(詳細) はその場で行を展開し、このリクエストがなぜそこへ行ったのかに答えます:
| 項目 | 何が分かるか |
|---|---|
| 一致したルール / ルールの出所 | この接続を決めたルール行と、それがどのセクション由来か |
| 選択されたポリシー / アダプター | ルールが選んだポリシーと、実際に運んだ出口 |
| プロキシチェーン | チェーン経由の接続について、この端末から出口までの経路。例: Airport/HK-01 → Landing。各ホップが順に並び、グループの後にはスラッシュを挟んで現在の選択が続きます。単一のポリシーを使った接続では - |
| DNSの出所 | どのリゾルバーが答えたか、キャッシュ命中だったか |
| 適用された書き換え | このメッセージを変更した書き換え・モックレスポンスのルール — ルール自身の文言で。接続ごとに保持されるのは最大 16 件で、それを超えると「他N件は表示されていません」と示されます |
| 切断理由 / 備考 | なぜ終わったか、そしてエンジンが伝えたかったこと |
表の下には、取得されたリクエストとレスポンス(ヘッダーとボディ)が回線上の姿のまま表示されます(HTTPS復号の対象ホストでは復号後の姿です)。
ボディにはトラフィック記録が前提です
ボディはChuteが取得していた場合にのみ存在します。問題を再現する前に記録を有効にしてください:
[General]にreplica = true、または- Chute Mac: メニューバー → トラフィックキャプチャ、または
- API:
PUT /api/features/record-trafficに{"enabled": true}。
無効でも接続は経路の帰属情報とタイミングを伴って表示されます — 欠けるのはペイロードだけです。iOS、tvOS、Androidでは、記録には有効なライセンスも必要です。ライセンスが無ければ、どちらのスイッチがオンでも何も取得されません。[Replica] セクションは取得対象をさらに絞ります — そこにあるフィルターは hide-crashlytics-request を含めすべて有効です — ので、そこで除外されたリクエストにもボディはありません。
HARで書き出す
ConnectionsページのExport HAR(HARをエクスポート) は、現在のタブをHAR 1.2 ファイルとしてダウンロードします — 上限はエンドポイントの既定である 100 件(エンドポイントの limit で最大 300 件まで)で、Historyタブ自体は最大 200 件を表示します。HARは標準形式です。ブラウザの開発者ツール(Networkパネル → インポート)や、Charles、Proxymanといったツールで開けます。
書き出しにはそれらのツールが期待するもの — リクエストとレスポンスのヘッダー、タイミング、記録が有効なときはボディ — に加えて、HARに対応するフィールドが無い情報を収めた _kl オブジェクトがエントリごとに付きます: 選ばれたポリシー、命中したルール、発動した書き換えです。送信と受信の時間は推測ではなくキャプチャ自身のタイムスタンプに基づくため、意味のある値です。アプリにも独自の出口があります。Chute iOSのDashboardにはHARとしてエクスポート と すべてをHARでエクスポート があり(同じ形式でエンジンが生成します)、Chute Macの接続詳細ウィンドウには リクエストと履歴 ボタンがあってコンソールを開きます — 開くのはコンソールのホームで、その接続そのものではありません。1 エントリは 1 接続です。複数のリクエストを運んだ keep-alive 接続では、書き出しは最初のメッセージを記述し、後続メッセージの何バイトを省いたかを注記します。
DNS
リゾルバーのキャッシュと各レコードに答えたサーバー、[Host] 由来のエントリ、そしてシステムの hosts ファイル。Clear Cache(キャッシュをクリア) は動的レコードを消去します。ここに 1 件ずつ削除する操作はなく、それはAPIの DELETE /api/dns/records/:domain にしかありません。
Policies(ポリシー)
アウトバウンドモード(Rule / Global / Direct — ルール / グローバル / ダイレクト)と、各ポリシーグループの現在の選択(hidden=trueが付いたグループを除く)。ここで選択を変えると動作中のエンジンに即座に反映されます — アプリでグループを切り替えるのと同じ操作です。
Rules(ルール)
このページには性質の異なる 2 種類が並びます。
ルーティングルール — マッチャーが実際にたどるすべてのルールを評価順に並べたもの。Tailscaleの自動ルール、モジュールのルール、設定の[Rule]セクションの順で、最後がFINALです。設定ファイルとモジュール由来なので読み取り専用です。
書き換えとモックレスポンスのルール — URL書き換え、ヘッダー書き換え、ボディ書き換え、モックレスポンス、およびMitMホスト一覧。これらはここで追加・削除できます:
- 設定ファイルに書くのとまったく同じ形でルールを貼り付け、Add(追加) を押します。解析できない行はパーサーの指摘とともに拒否され、保存されません — 決して命中しないルールには症状が無いので、その場で知るほうが良いのです。
- Remove(削除) は 1 件を削除し、Clear(クリア) はファミリーを空にします。
- 変更は動作中のエンジンにのみ存在します。設定ファイルには書き戻されず、リロードや再起動でファイルの内容に戻ります。ここで試し、うまくいった 1 行をファイルに書いてください。
書き換えとモックレスポンスの一致 — この実行で命中したすべての書き換え・モックレスポンスルールと、その回数および最後に命中した時刻。この表が追跡するのは最大 512 種類のルールで、それを超えて発動したルールの件数が併せて示されます。この表が「書き換えが効かない」への答えです。ここに現れないルールは一度も命中していません。命中したのに目に見える変化が無い場合とは別の問題です。見分け方は書き換えが効かないのはなぜ?を参照してください。
ルールセット — 設定が参照するすべてのルールプロバイダーとルールセットを、それぞれの状態(読み込んだ後に寄与したルール数、または読み込めなかった理由)とともに示します。プラットフォームの上限を超えたペイロード、応答しなかった URL、解析できなかった本文は、黙って何にも一致しないのではなくここに現れます。同じ一覧は GET /api/rules/providers でも取得できます。
Diagnostics(診断)
エンジンが何を保持しているか、前回の実行がどう終わったか、そしてこちらから実行できる一連のプローブ。
- Footprint / CPU / Uptime / Live flows / Superseded flows / Engine generation(メモリ使用量 / CPU / 稼働時間 / アクティブなフロー / 旧世代のフロー / エンジン世代) — この実行の現在の姿。フロー数が横ばいなのにフットプリントが上がり続けるなら調べる価値があります。iOSとtvOSでは、システムが拡張を回収する前に見ているのもこの値です。
- Previous exit(前回の終了) —
Clean(正常終了)、Terminated unexpectedly(予期せず終了)、Killed for memory(メモリ不足で強制終了)のいずれかと、前回の実行 id・稼働時間・ピーク時フットプリント。Chuteが「クラッシュした」ときはまずここを読んでください。Killed for memory(メモリ不足で強制終了)はChuteの不具合ではなくシステムによる回収を意味し、次に何を調べるべきかが変わります。 - Refusals(拒否) — エンジンが何を断ったか、その理由は何かを、リソースと理由で数えた表。接続が落ちて他に説明が無いとき、理由はたいていここにあります。
- Run a probe(プローブを実行) — 到達性(ポートを与えればTCP、無ければICMP)、動作中のリゾルバーによるDNSクエリ、プロキシを経由しない直接インターネットテスト、アドレスの確認(Appleのエンジンではネットワークアドレスで、デバイス自身のアドレスを報告します。Androidのエンジンでは出口IPで、トラフィックが出ていく公開アドレスを報告します)、ポリシーのレイテンシテスト。いずれも上限付きで、必ず 1 回だけ応答します。定義されていないポリシー名は計測されずに拒否されるので、打ち間違いは打ち間違いとして返ってきます。
- Events(イベント) — この実行で注目すべき出来事: 大量の失敗、アドレスの変化など。
- Tailscale —
[Tailscale]セクションがある場合はエンジンの現在の状態を表示します。無い場合は[Tailscale] セクションが設定されていませんと表示され、これは正常な答えです。 - Download diagnostic bundle(診断バンドルをダウンロード) — サポートへの連絡に添付できる、秘匿処理済みのアーカイブ 1 つ。内容は診断バンドルを送るを参照してください。
Config(設定)
動作中の設定を編集可能なボックスに表示し、Reload(再読み込み) でボックスの内容を適用します。
ここに表示される設定は機密が取り除かれています。 パスワード、制御用のシークレット、CAのパスフレーズ、WireGuardの鍵などは
<redacted>と表示されます。Reload(再読み込み) はボックスの内容をそのまま適用するため、表示されたテキストのままリロードすると、それらの機密が文字列<redacted>として動作中のエンジンに書き込まれます — それらを必要とするポリシーは失敗し始めます。設定ファイルには触れないので、その設定を選び直せば元に戻ります。このページは設定を読むため、そして自分で全文を入力した変更を適用するために使ってください。ファイル自体を編集するには各アプリのエディターを使います。
Logs(ログ)
エンジンログのライブ追尾。レベルごとに色分けされ、Pause(一時停止) で読みたいときに止められます。詳細度はこのページではなく loglevel で決まります — 必要な行が無ければ、上げてから再現してください。実行を再起動せずに変更するには、HTTPコントロールAPIのPUT /api/loglevelを使います。
コンソールが渡しうるもの
コンソールへのアクセスは、その実行が見たすべてへのアクセスだと考えてください。URL・ヘッダー・プロセス名を含む接続記録、取得されたリクエストとレスポンスのボディ、設定、そしてログを渡せます。だからこそ認証なしが既定ではなく、ループバック以外にバインドするには自分でシークレットを設定する必要があります — external-http-secret を参照してください。
本ページは英語版からの翻訳です。内容に相違がある場合は、英語版が優先されます。