Web-Konsole
Chute liefert aus der laufenden Engine heraus eine Verwaltungskonsole über HTTP aus. Sie ist die einzige Oberfläche, die auf jeder Plattform gleich ist, und deshalb verweist dieses Handbuch dorthin, wann immer etwas angesehen statt konfiguriert werden muss — der Weg einer Anfrage, eine Umschreibung, die nicht greift, oder der Grund, aus dem eine Verbindung abgelehnt wurde.
Dies ist nicht Chute Dashboard. Dashboard ist eine eigene macOS-App, die sich mit einer Chute-Instanz verbindet; die hier beschriebene Konsole wird von der Engine selbst ausgeliefert und im Browser geöffnet.
Einschalten und hineinkommen
Die Konsole braucht external-http-controller im Abschnitt [General]. Standardmäßig ist sie aus:
[General]
external-http-controller = 127.0.0.1:9090
external-http-ui = true
Die Anfragen, die die Konsole während des Betriebs im Speicher hält, sind auf 4 MB unter macOS und 1 MB unter iOS, tvOS und Android begrenzt.
Der Zugriff ist authentifiziert. Wenn Sie external-http-secret nicht setzen, erzeugt Chute ein Token und bewahrt es in einer Datei control-token auf, sodass dasselbe Token über Neustarts hinweg weiterverwendet wird — der praktische Weg hinein ist also, sich die Adresse samt Token von der App geben zu lassen. Die Seite übernimmt das Token beim Laden aus dieser Adresse und behält es im localStorage des Browsers, ein Browser meldet sich also nur einmal an. Jede Plattform hat dafür einen Einstieg; siehe Die Web-Konsole öffnen.
Übersicht
Ob der Dienst läuft, wie lange schon, sein Speicherbedarf, Adressen und Ports der HTTP- und SOCKS-Listener sowie die Dateipfade dieses Laufs. Wenn unklar ist, auf welche Instanz ein Browser-Tab zeigt, klärt diese Seite es.
Datenverkehr
Kumulierte Bytes und aktuelle Geschwindigkeit für die gesamte Engine, ein Verlaufsdiagramm und eine Aufschlüsselung je Adapter. Beantwortet „bewegt sich überhaupt etwas“ und zeigt, welcher Ausgang die Last trägt, wenn eine Richtliniengruppe zwischen mehreren wählt.
Verbindungen
Die Seite, auf der Sie die meiste Zeit verbringen werden. Zwei Tabs:
- Aktuell — Verbindungen, die gerade offen sind.
- Verlauf — geschlossene Verbindungen, neueste zuerst, aus den Aufzeichnungen dieses Laufs gelesen.
Jede Zeile trägt Host, Port, Typ, gewählte Richtlinie, passende Regel, Dauer und Byte-Zahlen. Die Dauer zählt ab dem Moment, in dem dieser Browser-Tab die Verbindung zum ersten Mal gesehen hat, nicht ab dem Öffnen der Verbindung — sie sagt also nur im Tab Aktuell etwas aus. Untersuchen klappt die Zeile an Ort und Stelle auf und beantwortet, warum diese Anfrage dorthin ging:
| Feld | Was es sagt |
|---|---|
| Passende Regel / Regelherkunft | Die Regelzeile, die diese Verbindung entschieden hat, und aus welchem Abschnitt sie stammt |
| Gewählte Richtlinie / Adapter | Die von der Regel gewählte Richtlinie und der Ausgang, der sie tatsächlich getragen hat |
| Proxy-Kette | Bei einer Verbindung über eine Kette der Weg von diesem Gerät bis zum Ausgang, etwa Airport/HK-01 → Landing: jeder Hop der Reihe nach, eine Gruppe gefolgt von ihrer aktuellen Auswahl nach einem Schrägstrich. -, wenn die Verbindung eine einzige Richtlinie nutzte |
| DNS-Herkunft | Welcher Resolver geantwortet hat und ob es ein Cache-Treffer war |
| Angewendete Umschreibungen | Die Umschreibungs- oder Mock-Antwort-Regeln, die diese Nachricht verändert haben — im Wortlaut der Regel; je Verbindung werden höchstens 16 Treffer behalten, danach nennt die Zeile, wie viele weitere nicht angezeigt werden |
| Schließgrund / Hinweis | Warum sie endete und was die Engine dazu zu sagen hatte |
Unter der Tabelle zeigt die aufgeklappte Zeile die aufgezeichnete Anfrage und Antwort — Header und Body, so wie sie über die Leitung gingen (für Hosts mit HTTPS-Entschlüsselung entschlüsselt).
Für Bodies muss die Aufzeichnung laufen
Bodies sind nur da, wenn Chute sie aufgezeichnet hat. Schalten Sie die Aufzeichnung ein, bevor Sie das Problem reproduzieren:
replica = truein[General], oder- Chute Mac: Menüleiste → Datenverkehrsaufzeichnung, oder
- die API:
PUT /api/features/record-trafficmit{"enabled": true}.
Ohne sie erscheinen Verbindungen weiterhin mit vollständiger Zuordnung und Zeitmessung — nur die Nutzdaten fehlen. Unter iOS, tvOS und Android setzt die Aufzeichnung zusätzlich eine aktive Lizenz voraus: Ohne sie wird nichts aufgezeichnet, gleich welcher Schalter an ist. Der Abschnitt [Replica] schränkt die Aufzeichnung weiter ein — jeder Filter dort, hide-crashlytics-request eingeschlossen, wird beachtet —, eine dort herausgefilterte Anfrage hat also ebenfalls keinen Body.
Als HAR exportieren
HAR exportieren auf der Seite Verbindungen lädt den aktuellen Tab als HAR-1.2-Datei herunter — begrenzt auf 100 Einträge, den Standard des Endpunkts (limit am Endpunkt hebt ihn auf höchstens 300), während der Tab Verlauf selbst bis zu 200 zeigt. HAR ist ein Standardformat: Öffnen Sie es in den Entwicklerwerkzeugen eines Browsers (Netzwerk-Panel → Importieren) oder in Werkzeugen wie Charles oder Proxyman.
Der Export enthält, was diese Werkzeuge erwarten — Header von Anfrage und Antwort, Zeitmessungen und, bei laufender Aufzeichnung, die Bodies — und dazu je Eintrag ein _kl-Objekt mit dem, wofür HAR kein Feld hat: gewählte Richtlinie, passende Regel und die Umschreibungen, die gegriffen haben. Die Zeiten für Senden und Empfangen stammen aus den Zeitstempeln der Aufzeichnung selbst und sind nicht geschätzt, sie bedeuten also etwas. Die Apps haben eigene Ausgänge: Das Dashboard von Chute iOS bietet Als HAR exportieren und Alle als HAR exportieren (von der Engine im selben Format erzeugt), und das Detailfenster einer Verbindung in Chute Mac hat die Schaltfläche Anfragen & Verlauf, die die Konsole öffnet — ihre Startseite, nicht diese bestimmte Verbindung. Ein Eintrag ist eine Verbindung: Bei einer Keep-Alive-Verbindung mit mehreren Anfragen beschreibt der Export die erste Nachricht und vermerkt, wie viele Bytes späterer Nachrichten er ausgelassen hat.
DNS
Der Cache des Resolvers samt antwortendem Server je Eintrag, die Einträge aus [Host] und die hosts-Datei des Systems. Cache leeren verwirft die dynamischen Einträge; ein Entfernen einzelner Einträge gibt es hier nicht — das existiert nur als DELETE /api/dns/records/:domain in der API.
Richtlinien
Der ausgehende Modus (Regel / Global / Direkt) und jede Richtliniengruppe mit ihrer aktuellen Auswahl, außer Gruppen mit hidden=true. Eine Änderung hier wirkt sofort auf die laufende Engine — es ist dieselbe Aktion wie das Umschalten einer Gruppe in den Apps.
Regeln
Zwei verschiedene Dinge teilen sich diese Seite, und sie verhalten sich unterschiedlich.
Routing-Regeln — jede Regel, die der Matcher durchläuft, in Auswertungsreihenfolge: die automatischen Tailscale-Regeln, dann Regeln aus Modulen, dann der Abschnitt [Rule] der Konfiguration, zuletzt FINAL. Nur lesbar: Sie stammen aus der Konfiguration und ihren Modulen.
Regeln für Umschreibungen & Mock-Antworten — URL-Umschreibung, Header-Umschreibung, Body-Umschreibung und Mock-Antwort sowie die MitM-Hostliste. Diese lassen sich hier hinzufügen und entfernen:
- Fügen Sie eine Regel genau so ein, wie Sie sie in die Konfigurationsdatei schreiben würden, und drücken Sie Hinzufügen. Eine Zeile, die sich nicht parsen lässt, wird mit der Beanstandung des Parsers abgewiesen statt gespeichert — eine Regel, die nie passen kann, hat kein Symptom, also erfährt man es besser sofort.
- Entfernen löscht eine Regel, Leeren leert eine Familie.
- Änderungen leben nur in der laufenden Engine. Sie werden nicht in die Konfigurationsdatei zurückgeschrieben, und ein Neuladen oder Neustart bringt zurück, was die Datei sagt. Probieren Sie eine Regel hier aus und schreiben Sie die funktionierende Zeile dann in die Datei.
Treffer von Umschreibungen & Mock-Antworten — jede Umschreibungs- oder Mock-Antwort-Regel, die während dieses Laufs gegriffen hat, mit Zähler und dem Zeitpunkt des letzten Treffers; die Tabelle verfolgt bis zu 512 verschiedene Regeln und nennt, wie viele weitere darüber hinaus ausgelöst haben. Diese Tabelle ist die Antwort auf „meine Umschreibung tut nichts“: Eine Regel, die hier nie auftaucht, hat nie gepasst — ein anderes Problem als eine Regel, die gepasst und nichts Sichtbares getan hat. Wie man beides unterscheidet, steht unter Warum bewirkt meine Umschreibung nichts?.
Regelsätze — jeder Regel-Provider und Regelsatz, den die Konfiguration referenziert, jeweils mit Status: der Anzahl beigesteuerter Regeln nach dem Laden oder dem Grund, warum er nicht geladen wurde. Eine Nutzlast über der Obergrenze der Plattform, eine URL ohne Antwort und ein nicht lesbarer Body erscheinen hier, statt still nichts zu treffen; dieselbe Liste liefert GET /api/rules/providers.
Diagnose
Was die Engine hält, wie der letzte Lauf endete, und eine Reihe von Prüfungen, die Sie auf sie abfeuern können.
- Speicherbedarf / CPU / Laufzeit / Aktive Flows / Flows älterer Generation / Engine-Generation — die aktuelle Gestalt dieses Laufs. Ein Speicherbedarf, der steigt, während die Zahl der Flows gleich bleibt, lohnt eine Untersuchung; auf iOS und tvOS ist es zugleich das, was das System beobachtet, bevor es die Erweiterung zurückholt.
- Letzte Beendigung —
Sauber,Unerwartet beendetoderWegen Speichermangel beendet, mit Lauf-ID, Laufzeit und Spitzenspeicher des vorherigen Laufs. Lesen Sie das zuerst, wenn Chute „abgestürzt“ ist: Wegen Speichermangel beendet heißt, das System hat Chute zurückgeholt, nicht dass Chute versagt hat — und das ändert, wonach man sucht. - Ablehnungen — eine Tabelle dessen, was die Engine abgelehnt hat und warum, gezählt nach Ressource und Grund. Wenn eine Verbindung verworfen wurde und nichts sonst es erklärt, steht der Grund meist hier.
- Prüfung ausführen — Erreichbarkeit (ICMP, oder TCP bei angegebenem Port), eine DNS-Abfrage über den laufenden Resolver, einen direkten Internet-Test ohne Proxy, eine Adressprüfung — auf den Apple-Engines Netzwerkadresse, die die eigenen Adressen des Geräts meldet, auf Android Ausgangs-IP, die die öffentliche Adresse des ausgehenden Verkehrs meldet — und der Latenztest einer Richtlinie. Jede ist begrenzt und antwortet genau einmal. Ein nicht definierter Richtlinienname wird abgewiesen statt gemessen, ein Tippfehler kommt also als Tippfehler zurück.
- Ereignisse — die bemerkenswerten Momente dieses Laufs: Massenfehler, Adresswechsel und Ähnliches.
- Tailscale — der aktuelle Zustand der Engine, wenn ein
[Tailscale]-Abschnitt konfiguriert ist; Kein [Tailscale]-Abschnitt konfiguriert, wenn es keinen gibt, was eine normale Antwort ist. - Diagnosepaket herunterladen — ein bereinigtes Archiv zum Anhängen an eine Support-Nachricht. Was darin ist, steht unter Ein Diagnosepaket senden.
Konfig
Die laufende Konfiguration in einem editierbaren Feld, mit Neu laden, um anzuwenden, was darin steht.
Die hier gezeigte Konfiguration ist um ihre Geheimnisse bereinigt. Passwörter, das Steuerungs-Secret, die CA-Passphrase, WireGuard-Schlüssel und Ähnliches erscheinen als
<redacted>. Neu laden wendet genau das an, was im Feld steht — den angezeigten Text unverändert neu zu laden ersetzt diese Geheimnisse also durch das wörtliche<redacted>in der laufenden Engine, und Richtlinien, die sie brauchen, beginnen zu scheitern. Die Konfigurationsdatei bleibt unberührt; die Konfiguration erneut auszuwählen stellt sie wieder her.Nutzen Sie diese Seite, um die Konfiguration zu lesen und eine vollständig selbst eingetippte Änderung anzuwenden. Zum Bearbeiten der Datei selbst dient der Editor in den Apps.
Protokolle
Ein Live-Mitlauf des Engine-Protokolls, nach Stufe eingefärbt, mit Pausieren zum Lesen. Die Ausführlichkeit bestimmt loglevel, nicht diese Seite — fehlen die Zeilen, die Sie brauchen, erhöhen Sie ihn und reproduzieren Sie erneut. Um es ohne Neustart des Laufs zu ändern, verwenden Sie PUT /api/loglevel der HTTP-Control-API.
Was die Konsole herausgeben kann
Behandeln Sie Zugriff auf die Konsole wie Zugriff auf alles, was der Lauf gesehen hat. Sie kann Verbindungsaufzeichnungen mit URLs, Headern und Prozessnamen ausliefern, die aufgezeichneten Anfrage- und Antwort-Bodies, die Konfiguration und das Protokoll. Deshalb ist eine unauthentifizierte Steuerungsschnittstelle nicht die Voreinstellung, und deshalb verlangt eine Bindung außerhalb von Loopback ein Secret, das Sie selbst setzen — siehe external-http-secret.
Diese Seite ist eine Übersetzung der englischen Version. Bei Abweichungen ist die englische Version maßgeblich.