Инспектор трафика

Инспектор сохраняет разрешённые политикой захвата сведения о запросах через туннель и показывает их владельцу в дашборде.

Описание

Общее описание функционала

Инспектор HTTP-трафика сохраняет события HTTP/HTTPS-запросов, прошедших через туннель: метод, путь, код ответа, длительность и доступные по правилам захвата заголовки и тело. Владелец туннеля просматривает журнал в дашборде, открывает отдельное событие и при необходимости повторяет запрос с безопасными ограничениями на путь и заголовки.

Для события также определяется IP клиента. Заголовки переадресации учитываются только тогда, когда запрос пришёл через настроенный доверенный промежуточный сервер. В остальных случаях Инспектор показывает адрес прямого соединения. Чтобы адрес не повторялся на каждом небольшом экране, мобильные карточки и компактный список его не показывают. На широком экране он доступен в подробном списке, а у выбранного события — отдельной строкой IP клиента.

Как пользователь может использовать

  • Разработчик отлаживает API: находит неудачный запрос в списке, открывает детали и сравнивает его с ответом бэкенда.
  • Специалист поддержки открывает выбранное событие и сверяет IP клиента с ожидаемым источником запроса.
  • Разработчик включает подробный вид на широком экране и сравнивает IP нескольких событий в одном списке.
  • Пользователь работает с журналом на телефоне или в компактном режиме без повторения IP в каждой карточке или строке.
  • Пользователь фильтрует события по туннелю, времени и пагинации, чтобы не загружать весь журнал.
  • Пользователь подписывается на поток событий (SSE) для живого просмотра во время ручного теста.
  • Пользователь запускает повтор запроса события в режиме «через облако» или «локально» с допустимыми правками тела/метода в рамках ограничений сервера.
  • Администратор при поддержке просматривает те же события в рамках полномочий.

Как это реализовано в сервисе

Когда запрос проходит через публичный адрес туннеля, сервис определяет адрес клиента, проверяет правила доверия к промежуточному серверу и сохраняет событие Инспектора. Если адрес клиента передал доверенный посредник, порт соединения посредника не приписывается клиенту. Если доверенного посредника нет или заголовок содержит некорректный адрес, используется адрес прямого соединения.

Список и карточки получают те же данные события, но показывают их с разной плотностью. Подробный вид подходит для сравнения, а выбранное событие содержит одну основную строку IP клиента. Сохранённые заголовки переадресации остаются в разделе заголовков запроса и не подменяют эту строку. Доступ к списку и деталям проверяется по учётной записи и туннелю. Перед повтором запроса сервис отдельно проверяет допустимые изменения пути, заголовков и тела.

Справочник API

Список событий

GET /api/v1/inspector/events

Параметры (имена уточняйте по ответу сервера): tunnel_id, фильтры времени, пагинация limit / offset или курсор.

Ответ: JSON со списком событий и метаданными пагинации.

IP клиента

  • source_ip — определённый сервисом IP клиента. Имя поля сохраняется для новых и ранее записанных событий.
  • source_port — порт прямого соединения, если он был корректно определён. Для адреса, полученного от доверенного промежуточного сервера, поле отсутствует или равно null: порт такого соединения принадлежит посреднику, а не клиенту.
  • Заголовки X-Forwarded-For и X-Real-IP, если они попали в захват, остаются отдельными элементами списка заголовков запроса. Они не заменяют source_ip и сами по себе не означают, что сервис им доверял.

Фильтр по IP клиента в дополнении «Расширенный журнал инспектора» продолжает передавать параметр source_ip.

Одно событие

GET /api/v1/inspector/events/{id}

id должен быть URL-encoded в клиенте.

Поток SSE

GET /api/v1/inspector/events/stream?tunnel_id=...

Подписка на новые события; tunnel_id в query также передавать в закодированном виде при необходимости.

Повтор запроса

POST /api/v1/inspector/events/{eventId}/replay

Тело JSON: { "mode": "cloud" | "local", "overrides": { ... опционально } }.

  • cloud — повтор выполняется на сервере Fortunnels и уходит через публичный edge туннеля (как внешний клиент). Подходит для проверки маршрута end-to-end на fortunnels.ru.
  • local — повтор отправляется непосредственно в настроенную цель туннеля без нового внешнего обращения к публичному адресу.

Поля overrides (правки метода, пути, заголовков и тела) ограничены сервером: нельзя подставить абсолютный URL в path, запрещённые заголовки и слишком большое тело (лимит порядка десятков килобайт).

Ошибки

401 Unauthorized

Нет сессии или токена для инспектора (в боевом режиме).

403 Forbidden

Нет доступа к туннелю события.

400 Bad Request

Некорректные параметры списка или недопустимые правки запроса при повторе (путь, заголовки, размер тела).

404 Not Found

Событие с указанным идентификатором не найдено или уже удалено. Просмотр деталей, удаление, экспорт, закрепление, снятие закрепления и повторная отправка возвращают 404 event not found.

При экспорте, закреплении, снятии закрепления и повторной отправке такой же ответ приходит для событий, к которым у вас нет доступа. Просмотр деталей и удаление существующего чужого события возвращают 403. Обновите список событий и выберите доступную запись; удалённое событие восстановить нельзя.

503 Service Unavailable

Инспектор отключён или хранилище недоступно.

Ограничения

  • Захват может не включать полное тело запроса/ответа или маскировать чувствительные поля по политике сервера.
  • Повтор запроса не гарантирует идентичный побочный эффект на бэкенде; использовать только на тестовых стендах с осторожностью.
  • Большие журналы требуют фильтрации по времени и туннелю.
  • В dev-режиме сервера правила аутентификации к инспектору могут быть слабее, чем в продакшене.