Chute Dashboard
Chute Dashboard — бесплатное приложение для macOS, которое подключается к работающему Chute — Chute iOS по Wi-Fi или USB-кабелю, Chute Android по сети или через adb, либо Chute Mac на той же машине — и показывает, что делает этот экземпляр: каждое соединение с правилом и политикой, которые его решили, расшифрованные запрос и ответ для хостов под расшифровкой HTTPS, ответы DNS, сессии UDP. Оно же позволяет менять трафик прямо во время наблюдения: список хостов MitM и каждое семейство правил перезаписи и имитации ответов редактируются вживую.
Это не веб-консоль. Консоль отдаётся самим движком и открывается в браузере; Dashboard — отдельное приложение, которое говорит с движком по его двоичному каналу управления, поэтому ему нужен на устройстве
external-controller-access, а неexternal-http-controller. Они пересекаются, и у каждого есть то, чего нет у другого — см. Что недоступно из Dashboard. Исключение — Dashboard на том же Mac, где работает движок: он подключается к локальному сокету, который движок открывает всегда, и не требует вообще никакой настройки.
Интерфейс Dashboard локализован на те же языки, что и это руководство, кроме арабского; в арабской системе он показывается по-английски.
Разрешить Dashboard подключаться
Ничто не слушает, пока устройство не разрешит.
Chute iOS — в редакторе конфигурации откройте Внешний контроллер:
- Включите Доступ внешнего контроллера — переключатель, под которым в сноске написано Разрешить подключение Chute Dashboard/Chute CLI.
- Задайте Порт и Пароль. Пароль не может быть пустым и должен быть вашим собственным: слушатель, доступный из сети, отказывается запускаться с пустым паролем или паролем по умолчанию.
- Оставьте Разрешить доступ по Wi-Fi выключенным, если он не нужен. Выключено — значение по умолчанию: слушатель остаётся на самом телефоне — USB-кабель до него дотягивается, другие устройства в Wi-Fi нет. Включено означает, что любой в сети, знающий пароль, может прочитать всё, что видел этот запуск.
- Сохраните и запустите (или перезапустите) туннель. Панель управления теперь показывает Порт внешнего доступа:
<порт>— эта строка и есть подтверждение, что слушатель поднят.
Chute Mac — те же три значения живут в [General]:
[General]
external-controller-access = password@127.0.0.1:6170
127.0.0.1 ограничивает его тем Mac, за которым вы сидите; адрес локальной сети или 0.0.0.0 открывает его другим машинам. В разделе Общие окна конфигурации есть поля для того же ключа. Dashboard, работающему на том же Mac, этот ключ не нужен вовсе — см. Подключиться к этому компьютеру ниже.
Chute Android — в редакторе конфигурации откройте Внешний контроллер и впишите то же значение в Внешний доступ:
- Для Подключиться по USB достаточно
password@127.0.0.1:6170: Dashboard выполняетadb forwardдля этого порта и подключается по кабелю, так что слушатель может оставаться на самом телефоне. Для этого на Mac нуженadb— Dashboard ищет его вANDROID_HOMEиANDROID_SDK_ROOT, вPATH, в/usr/local/binи/opt/homebrew/bin, а также в~/Library/Android/sdk, — а на телефоне должна быть включена отладка по USB с разрешением для этого Mac. password@0.0.0.0:6170открывает его в сеть для Подключиться к удалённому компьютеру. Как и на iOS, слушатель, доступный из сети, отказывается запускаться с пустым паролем или паролем по умолчанию.
Сохраните и запустите (или перезапустите) VPN. После этого переключатель Внешний доступ на панели управления показывает адрес, на котором он слушает, и выключает и снова включает слушатель, пока VPN работает.
Подключение
Dashboard открывается окном Новая панель мониторинга; у каждого подключения своё окно, так что несколько устройств могут быть открыты одновременно. Три пути внутрь:
| Поля | Когда | |
|---|---|---|
| Подключиться к этому компьютеру | нет | Chute Mac на этом же Mac. Dashboard говорит напрямую с локальным сокетом движка — ни хоста, ни порта, ни пароля и никакой строки external-controller-access. |
| Подключиться к удалённому компьютеру | Хост, Порт, Пароль | Wi-Fi-адрес устройства (iPhone: Настройки → Wi-Fi → ⓘ) или адрес другого Mac. Требует Разрешить доступ по Wi-Fi на телефоне. |
| Подключиться по USB | Устройство, Порт, Пароль | iPhone подключён кабелем и доверяет этому Mac, либо устройство Android, видимое для adb. Выберите его в Устройство: и введите тот же порт, что настроили, — канал по кабелю Dashboard находит сам, а для Android сам выполняет проброс порта через adb. Работает при выключенном Разрешить доступ по Wi-Fi и показывает в том числе сотовый трафик, поскольку устройству вовсе не нужно быть в Wi-Fi. |
Удалённая машина запоминается, только если вы её сохранили: Сохранить записывает хост, порт и пароль под выбранным вами именем, и в следующий раз именно эти имена перечисляет вкладка Сохранённый компьютер.
Если пароль неверен, окно сообщает Неверный пароль — и по USB, и по сети. Если до устройства не добраться, окно всё равно открывается и показывает Подключение…: для iPhone по USB оно так и остаётся, пока Dashboard повторяет попытки, — до ответа телефона или до нажатия Закрыть, а любое другое подключение заканчивается сообщением Подключение закрыто. Если устройство пропало позже — туннель остановлен, кабель выдернут, телефон сменил сеть, — окно Dashboard сообщает Подключение закрыто и предлагает Переподключиться.
Окно
Панель инструментов переключает пять представлений — Недавние, Активно, DNS, UDP и MitM, — а поле Фильтр справа на ней служит строкой поиска по шаблону хоста, общей с панелью фильтров. Сама панель фильтров появляется отдельно в «Недавние» и «Активно» и скрыта в DNS, UDP и MitM. Панель в левом нижнем углу — текущая скорость загрузки и скачивания; щёлкните её, чтобы развернуть график.
В представлениях Недавние и Активно есть кнопка Обновить, а в «Недавние» ещё и Очистить, опустошающая список. Рядом с ними — два переключателя, действующие на работающий движок, ровно так же, как переключатели в приложениях:
- Включить запись трафика → Отключить запись трафика: включает захват тел запросов и ответов (параметр
replica). Без него строки всё равно появляются со своей маршрутизацией, но вкладки данных нельзя выбрать. Пока устройство не сообщило, как он выставлен, кнопка называется просто Запись трафика. - Включить MitM (N правил) → Отключить MitM (N правил): включает расшифровку HTTPS для N хостов из списка хостов MitM; при пустом списке число опускается. Переключатель не делает ничего полезного, пока на устройстве нет доверенного CA и хотя бы одного хоста — см. страницу Расшифровка HTTPS.
Ни один из переключателей не правит файл конфигурации; перезапуск возвращает то, что сказано в файле.
Боковая панель группирует соединения по клиентам: Все клиенты, затем Локальный — клиенты на самом устройстве — и Удалённый — другие машины, использующие этот Chute как прокси. Выбор одного сужает каждый список до него. Когда устройство — Chute Mac, локальные клиенты — это приложения, с именем и значком, и в контекстном меню есть Показать в Finder.
Активно и Недавние
Активно — то, что открыто прямо сейчас; Недавние — история устройства, прочитанная из записей этого запуска и упорядоченная по номеру соединения, — новые внизу. Щелчок по заголовку столбца сортирует по нему. У обоих один набор столбцов:
| Столбец | |
|---|---|
| ID | Номер соединения в движке — тот же номер, что показывают консоль и приложения |
| Дата, Длительность | Когда началось и сколько длится или длилось |
| Клиент | Процесс (Chute Mac), имя пакета приложения (Chute Android) или локальный адрес |
| Метод, Сервер, Статус | Метод — тип соединения: HTTP, HTTPS, SOCK, TCP или UDP, а не глагол запроса; Сервер — адрес назначения host:port; Статус — состояние соединения: Активно, Завершено или Прервано |
| Политика | Политика, выбранная правилом |
| Загрузка, Скачивание | Байты в каждую сторону |
| Флаги | Что Chute сделал с соединением — см. легенду ниже |
Столбец Флаги — самый быстрый способ понять, применяется ли написанное вами правило:
| Флаг | Значение |
|---|---|
M |
Расшифровано (перехвачено MitM) |
H |
Изменён заголовок |
B |
Правило перезаписи тела или скрипт изменили тело |
R |
Сработало правило перезаписи |
K |
Ответило правило имитации ответов, а не сервер |
B отражает только изменение содержимого тела: тело, которое Chute лишь придержал, чтобы сверить с правилами, или заново разбил на чанки либо заново сжал, не меняя содержимого, не отмечается.
Недавние хранят до 5 000 строк; Загрузить более ранние внизу списка запрашивает у устройства следующую страницу, а сам список обновляется раз в несколько секунд. Когда активный список длиннее, чем вмещает один пакет управления, заметка под таблицей говорит, что движок его сократил, — строки есть на устройстве, и Недавние покажут их, когда они закроются.
Щелчок правой кнопкой по строке даёт Копировать команду curl, Экспортировать выбранное как HAR… / CSV…, Экспортировать всё как HAR… / CSV… и Фильтр: <host>; у активной строки есть ещё Разорвать соединение, закрывающее её на устройстве. Щелчок правой кнопкой внутри выделения из нескольких строк сохраняет его, так что Экспортировать выбранное как HAR… / CSV… берут все выделенные строки; пункты для одного соединения действуют на строку, по которой вы щёлкнули. Ещё четыре пункта действуют на правила устройства для этого хоста — самый короткий путь от соединения, на которое вы смотрите, к правилу, которое его меняет: Добавить правило MitM для, Включить MitM для, Добавить перезапись заголовков для и Добавить перезапись тела для <host>.
Внимание: Строка — это соединение, а не запрос. Соединение keep-alive, пронёсшее несколько запросов, остаётся одной строкой, а захваченные данные содержат все эти сообщения подряд; показанные заголовки принадлежат одному из запросов. Поэтому браузер, открывающий страницу, порождает меньше строк, чем у страницы ресурсов.
Панель фильтров
Панель фильтров сужает то, что показано. Она не меняет того, что записывает устройство — для этого служит [Replica] на устройстве.
| Элемент | Варианты |
|---|---|
| Фильтр по хосту/URL… | Текст, сопоставляемый с хостом, host:port, процессом или приложением, политикой, правилом и типом соединения, — но не с путём URL |
| Метод | GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, CONNECT |
| Статус | 1xx – 5xx |
| Трафик | Активно, Завершено, Прервано |
| Тип | JSON, HTML, XML, Изображение, Текст, Двоичный — по типу содержимого ответа |
| Длительность | < 100ms, 100ms–1s, 1s–5s, > 5s |
| Размер | < 1 KB, 1–100 KB, 100 KB–1 MB, > 1 MB |
| Только MitM | Только расшифрованные соединения |
| Изменённые | Соединения, у которых правило изменило заголовки или правило либо скрипт изменили тело — H или B. Строка только с R или только с K не проходит. |
Сбросить фильтры возвращает всё.
Сведения о соединении
Выберите строку — её сведения откроются на панели под списком. Вкладки слева направо:
Общее — то, что показывает список, но с простором: тип соединения и код состояния; режим исходящих соединений, политика и сработавшее правило; объём данных и пиковые скорости; локальный и удалённый адреса; время запуска; состояние SSL/MitM (Перехвачено, Заголовок изменён, Тело изменено, Ответ имитирован); и Сработавшие правила — правила перезаписи и имитации ответов, изменившие это соединение, процитированные собственным текстом. Список ограничен с обеих сторон: движок хранит не более 16 срабатываний на соединение, а Dashboard показывает из них 8 и приписывает … ещё N, так что правило, срабатывающее на каждом фрагменте, вытесняет остальные.
Тайминг — на что ушло установление соединения, как измерил движок:
| Строка | Считается от → до |
|---|---|
| Подготовка прокси | Соединение клиента пришло → Chute готов его обрабатывать |
| Разрешение DNS | → имя разрешено (отсутствует, если правилу адрес не понадобился) |
| Подбор правила | → таблица правил решила |
| Подготовка удалённого узла | → выбранный выход подключён и готов |
| Активно | Вся жизнь соединения, от прихода до закрытия |
Строка с нулевым значением не показывается нулём, а опускается вовсе, поэтому у соединения, правилу которого адрес не понадобился, строки Разрешение DNS нет совсем. Медленный запрос обычно медленный ровно в одной из остальных строк, и какая именно — подсказывает, куда смотреть: DNS — в раздел DNS, подготовка удалённого узла — в политику или сервер за ней.
Заголовки запроса / Заголовки ответа — заголовки таблицей, с отдельными Параметры запроса и Cookies для запроса и Cookies для ответа. Заголовок, изменённый правилом, подсвечен. Копировать выбранное копирует выделенные строки.
Данные запроса / Данные ответа — захваченное тело как Hex, Текст, JSON (раскрываемое дерево с поиском) или Изображение (По размеру / Реальный размер); что бы ни было в теле, оно открывается как Текст, а тела multipart разбираются на части. Экспортировать как bin сохраняет сырые байты, а в виде «Текст» есть ещё Открыть в Sublime Text и Открыть в VSCode, если что-то из них установлено. Эти две вкладки можно выбрать, только если есть захваченные данные: запись была включена, когда шло соединение, и фильтры [Replica] пропустили хост.
Внимание: Тела показываются в том виде, в каком захвачены. Сжатый ответ —
Content-Encoding: gzip— здесь не распаковывается, так что его вид Текст и JSON — шум; вид Hex и Экспортировать как bin дают байты, чтобы распаковать их где-то ещё. Устройство отказывается отдавать тело больше 2 МиБ — вкладка тогда показывает Не удалось загрузить тело сообщения, — а вид Hex показывает первый МиБ.
DNS и UDP
DNS — кэш резолвера устройства: каждый домен с адресами, в которые он разрешился, сервер, ответивший первым (Chute опрашивает все настроенные серверы сразу — см. DNS), TTL и то, откуда взялась запись. Последний столбец — именно источник: Config, System или Dynamic, — а не тип записи DNS. TTL сообщается как минимум 600 секунд, так что более короткий показывается как 600.
Правая кнопка — Копировать домен, Копировать IP-адреса, Копировать DNS-сервер и Фильтр: <domain>; у записи, полученной динамически, есть ещё Удалить DNS-запись <domain>. Очистить кэш DNS внизу опустошает кэш целиком. Эти две последние команды действуют на кэш устройства, а не на представление Dashboard.
UDP перечисляет сессии UDP — хост, сервер, политику и состояние. Тел у UDP нет.
Инструменты MitM
Представление MitM управляет пятью семействами правил на устройстве в пяти панелях: Правила MitM, Перезапись заголовков, Перезапись тела, Имитация ответов и Перезапись URL. Что верно для всех:
- Список — это копия правил работающего движка, которая начинается с того, что объявил файл конфигурации.
- Добавление правила отправляет его на устройство, которое разбирает его так же, как строку конфигурации; строка, которая не разбирается, отвергается с ошибкой, а не сохраняется. Исключение — хост в Правилах MitM: это шаблон, а не строка правила, поэтому любая непустая строка добавляется как набрана.
- Изменения живут только в работающем движке. В файл конфигурации они не записываются, а перезагрузка или перезапуск возвращает то, что сказано в файле. Найдите с помощью панелей правило, которое работает, и запишите его в конфигурацию.
- Применяется ли правило, видно в столбце Флаги списка (
R,K) и в Сработавшие правила панели сведений.
Правила MitM — один шаблон хоста на правило, host[:port][/path], с префиксом - для исключения: *.google.com, api.example.com:8443, api.example.com/v2/*, -*.apple.com. Та же грамматика, что у ключа hostname на странице Расшифровка HTTPS. Число на переключателе MitM панели инструментов — длина этого списка.
Перезапись заголовков — форма: URL Regex, Запрос или Ответ, Добавить / Заменить / Удалить / Заменить (регулярное выражение), Имя заголовка, Значение заголовка; для Заменить (регулярное выражение) добавляется Регулярное выражение значения, и совпавшая с ним часть значения заголовка заменяется на Замену. Строку конфигурации Dashboard составляет за вас; грамматика — на странице Перезапись заголовков.
Перезапись тела — одна строка конфигурации, введённая так, как вы написали бы её в файле, в любой из форм, которые читает движок: форма Surge http-response url-regex pattern replacement (или http-request), её http-response-jq url-regex jq-program (или http-request-jq), url-regex response regex pattern replacement (или request) и url-regex jsonpath-response jsonpath $.path value (или jsonpath-request). См. Перезапись тела.
Имитация ответов — URL Regex, тип Тела ответа: file (путь; есть Обзор…), text, base64 или tiny-gif (встроенный прозрачный GIF 1×1, без содержимого), необязательный Код состояния и необязательные Заголовки ответа в виде пар Имя: Значение, разделённых |.
Внимание: Путь
fileчитает устройство, на котором работает Chute, в момент запроса. Путь на вашем Mac имеет смысл, когда Dashboard подключён к Chute Mac на той же машине, и не имеет, когда он подключён к iPhone — у телефона нет/Users/…. Для удалённого устройства выберитеtextилиbase64, чтобы содержимое приходило в самом правиле (см. Имитация ответов), или разместите файл по URL и используйте перезапись URL.
Перезапись URL — URL Regex, Цель и Тип: header перезаписывает запрос на месте (Map Remote из Surge), 302 и 307 перенаправляют клиента, а reject, reject-200, reject-img, reject-dict, reject-array, reject-tinygif отвечают, не обращаясь к серверу. См. Перезапись URL.
Экспорт
- HAR — правая кнопка на списке: выбранные строки или все, файлом HAR 1.2, который открывается в инструментах разработчика браузера (Сеть → импорт), Charles или Proxyman. Одна запись на строку с захваченным HTTP-запросом; остальные — например, чистый TCP — в файл не попадают, а комментарий (comment) файла говорит, сколько их. Тела включены, если была включена запись: Dashboard сначала получает их с устройства, под листом с надписью Экспорт в HAR… — Получение записанных тел сообщений с устройства. — с индикатором хода и кнопкой Отмена, которая прерывает экспорт. Тело больше 512 КиБ записывается только своим размером, а один экспорт несёт не более 64 МиБ тел.
- CSV — фиксированный набор столбцов для электронной таблицы:
ID,Method,URL,Status Code,Status,Duration,Upload,Download,Process,Start Time. Это не столбцы самого списка: колонок Дата, Клиент, Сервер, Политика и Флаги в нём нет.Method— это метод запроса, аURL— полный URL, как в экспорте HAR: HTTPS, прошедший через HTTP-прокси без расшифровки, даётCONNECTиhttps://host. Строка без HTTP-запроса — обычный TCP или HTTPS, который TUN передал без расшифровки, — вместо них даёт тип соединения и хост. - Копировать команду curl — вызов
curl, повторяющий запрос с вашего Mac вместе с его методом, заголовками и телом; тело сначала получается с устройства.Content-Lengthcurl вычисляет сам. Строка, которая лишь туннель, — нерасшифрованный CONNECT или чистый TCP, — даёт толькоcurlи URL. - Экспортировать как bin — одно тело, как захвачено.
Dashboard строит свой HAR из списка и тел, которые получает с устройства. Движок умеет строить свой — со сработавшим правилом, политикой и сработавшими перезаписями в объекте _kl каждой записи и временами отправки и приёма, взятыми из захвата, — через Экспорт HAR в консоли или GET /api/connections/export?format=har.
Что недоступно из Dashboard
Dashboard говорит по двоичному каналу управления движка, а часть того, что умеет движок, есть только в HTTP API управления. Для этого используйте веб-консоль или API:
- диагностический пакет, состояние движка, счётчики отказов и события;
- итоги срабатываний по правилам на странице Правила консоли и ответ, который они дают: срабатывало ли это правило хоть раз;
- собственный HAR движка, см. выше;
- журнал.
Ещё одна вещь, которую стоит знать, прежде чем на него полагаться:
- На iPhone, Apple TV и Android расшифровка HTTPS и захват тел — лицензируемые функции. Без лицензии Dashboard всё равно подключается и показывает каждое соединение с правилом и политикой, но строки HTTPS никогда не расшифровываются — флага
Mнет, — а вкладки данных нельзя выбрать. На iPhone и Android переключатель MitM в приложении не остаётся включённым, вместо этого появляется предложение купить лицензию; у Apple TV строки MitM на экране панели управления нет вовсе. См. Лицензия и активация.
Эта страница — перевод английской версии. При расхождениях приоритет имеет английская версия.