InfraGuard

Соединения по портам (PORT OVERVIEW)

Флагманский экран мониторинга портов: карточки по портам с распределением состояний TCP по серверам, основными IP-источниками и их количеством — в реальном времени.

Обзор — что делает этот экран

Соединения по портам — это флагманский экран раздела Инфраструктура ▸ Связность и трафик, то есть PORT OVERVIEW. Он отрисовывает по одной карточке на каждый контролируемый порт (например, 80, 443, 22, 3306 …), заданный в Операционной политике, а внутри карточки разбивает привязанные к этому порту TCP-сессии по серверам в виде 100-процентной составной полосы по состояниям. Цель — одним взглядом понять, «кто сейчас подключён к этому порту, сколько таких сессий и в каком они состоянии».

Источник данных — устаревшая БД трафика (подключение legacy_glory), таблица traffic_session_ct, которую периодически наполняет коллектор check_ct.js. Здесь приложение работает только на чтение — этот экран ничего не записывает.

Каждая плитка сервера показывает:

Когда применять

Устройство экрана

Элементы управления сверху

Элемент Поведение
Таймер 1 мин / 5 мин / 1 час Ширина окна агрегации сессий. Выбор сохраняется в localStorage (infr:timer:traffic-ports) и переносится между посещениями.
Метки портов Список контролируемых портов (Операционная политика). Щелчок по метке показывает или скрывает соответствующую карточку. All переключает выбор всех и снятие выбора со всех. Фильтрация действует только в текущем сеансе (не сохраняется) — при каждом новом заходе по умолчанию показаны все порты.
Время снимка Метка времени последнего снимка, к которому привязано текущее окно (с поправкой на часовой пояс отображения).
Обновление / опрос Автоматически опрашивает /infra/traffic/ports/live каждые 30 секунд, обновляя карточки.

Карточки портов (кладка)

Карточки можно переупорядочивать перетаскиванием, а порядок сохраняется в localStorage (infr:order:traffic-ports). Поскольку высота карточек различается, они выкладываются без зазоров методом кладки по строкам (миксин sortable_masonry). Внутри карточки плитки серверов сортируются по числу уникальных IP-источников → суммарному числу сессий → индексу сервера.

Легенда состояний TCP

Цвета составной полосы берутся из семантических CSS-токенов (var(--infr-state-*)). Легенда сопоставляет цвет и состояние.

Токен Подпись Значение
established ESTABLISHED Обычное установленное соединение
listen LISTEN Прослушивание (серверный сокет)
syn_sent SYN SENT Попытка подключения (клиент)
syn_recv SYN RECV SYN получен / полуоткрытое — всплеск указывает на SYN-флуд
fin_wait FIN WAIT Закрывается (FIN_WAIT1/2 объединены)
close_wait CLOSE WAIT Удалённая сторона закрыла соединение, приложение — нет; накопление означает утечку соединений
time_wait TIME WAIT Ожидание после закрытия
other Other Любое состояние вне перечисленных семи

Как пользоваться

  1. Выберите таймер — 1min даёт самую узкую и свежую выборку снимков, 5min/1hour — более сглаженные тенденции.
  2. Сузьте набор до интересующих портов с помощью меток — например, оставьте только 80·443, чтобы наблюдать за вебом.
  3. Прочитайте составную полосу — низкая доля ESTABLISHED при больших SYN_RECV/TIME_WAIT является признаком аномалии.
  4. Щёлкните по кругу SRC — откроется всплывающее окно со списком IP-источников для этой пары сервер·порт (удалённый IP, удалённые порты, сессии, первое и последнее появление).
  5. Щёлкните по IP → расследование по одному IP — разбор того, какие серверы·порты·состояния он затрагивает, гео/ASN и история (агрегация за 5 минут · по часам · по дням). Отсюда можно перейти к проверке репутации или к блокировке.
  6. Переупорядочите карточки — перетащите наверх порты, за которыми следите чаще всего; порядок сохраняется.

Суточная история (1day) из-за устройства агрегации собирается по диапазону /24 (256 IP), а не по отдельному адресу. Если во всплывающем окне показана метка CIDR вида by 211.224.128.0/24, это значение представляет собой сумму по всему диапазону.

Источники данных

Все запросы выполняются через подключение legacy_glory и изолированы в App\Repositories\TrafficRepository в виде вызовов построителя запросов с привязкой параметров (без подстановки строк).

Привязка окна

Окно отображения привязано не к now() приложения, а к последнему снимку данных (MAX(snapshot_ts)). Часы записи коллектора могут отставать от часов приложения на несколько часов, поэтому привязка к now() вывела бы окно за пределы данных и экран остался бы пустым.

Таймер Граница SQL (snapshot_ts)
1min startOfMinute … endOfMinute минуты последнего снимка
5min startOfMinute от (последний − 4 мин) … endOfMinute последнего
1hour startOfMinute от (последний − 59 мин) … endOfMinute последнего

Граница WHERE по snapshot_ts использует необработанное время, сохранённое устаревшей системой. Смещение отображения из Операционной политики (traffic_tz_offset_hours) прибавляется только ко времени снимка, показанному на экране.

Основной запрос — portOverview()

SELECT a.local_port, a.server_name, a.server_index, a.remote_ip,
       a.state_code, b.state_name,
       SUM(a.session_count) AS total_sessions
FROM traffic_session_ct AS a
LEFT JOIN protocol_state AS b ON a.state_code = b.state_code
WHERE a.snapshot_ts BETWEEN :min AND :max
  AND a.local_port IN (:ports)          -- контролируемые порты из Операционной политики
GROUP BY a.local_port, a.server_name, a.server_index,
         a.remote_ip, a.state_code, b.state_name;

Связанные таблицы

Таблица Подключение Роль Кто наполняет
traffic_session_ct legacy_glory Снимки сессий (хост/удалённый узел/состояние/количество) check_ct.js
protocol_state legacy_glory Справочник: код состояния TCP → имя —
traffic_session_ct_5min/_1hour/_1day legacy_glory История по периодам для всплывающего окна расследования по IP aggregate.js
ip_info_loop legacy_glory Обогащение гео/ASN/ISP для всплывающего окна по IP —

Структура ответа сервера (фрагмент)

{
  "ports": [80, 443, 22],
  "timer": 1,
  "snapshot": "2026-08-13 10:24:00",
  "ports_data": [
    { "port": 443, "server_data": [
      { "alias": "web1", "idx": 12, "host_count": 84,
        "top_req": [ { "remote_ip": "203.0.113.10", "session_count": 61 } ],
        "connections": [ { "state": "established", "count": 420, "pct": 78 } ],
        "total": 538 }
    ] }
  ]
}

portsData() кэшируется на 20 секунд (ключ складывается из таймера и хеша списка портов), чтобы сократить обращения к удалённой стороне.

Доступ

Ролевая область «Инфраструктура» доступна для просмотра начиная с user_level 1 (наблюдатель). Экран «Соединения по портам» работает только на чтение, поэтому отдельного барьера на запись нет — его видят и демо (1), и сотрудники (5), и администраторы (10). Маршрут требует лишь сеансовой аутентификации infr.auth.

Действие Требуемый уровень
Просмотр соединений по портам, опрос, открытие всплывающего окна расследования по IP 1 (любой аутентифицированный пользователь)
Изменение списка контролируемых портов (Операционная политика) 10 (Администрирование) — Операционная политика

Действие блокировки, вытекающее из всплывающего окна расследования по IP, передаётся в Безопасность ▸ Блок-лист, где требуются права на запись user_level 2 и выше, а также журнал аудита. Сам этот экран блокировок не выполняет.

Устранение неполадок и частые вопросы

Карточки появляются, но данные по серверам пусты. В этом окне к порту не было привязано ни одной сессии. Расширьте таймер до 5min/1hour либо убедитесь, что порт действительно открыт и через него идёт трафик.

Все карточки пусты, отображается «Нет снимка подключений». В таблице traffic_session_ct на legacy_glory нет свежих снимков (коллектор check_ct.js остановлен либо не удалось подключиться к БД). Если время последнего снимка вообще не показано, проверьте коллектор.

Нужный мне порт не отображается. Если его нет в списке контролируемых портов (infra_monitored_ports), карточка не создаётся. Добавьте его в виде CSV в разделе Администрирование ▸ Операционная политика (1–65535, не более 30, порядок ввода сохраняется). Значение по умолчанию:

infra_monitored_ports = 80,443,22,3306,25,465,27017,21,53,3030,8080,6379,6001

Время снимка расходится на несколько часов. Если часы хранения устаревшей БД отличаются от вашего часового пояса отображения, задайте traffic_tz_offset_hours (±14 ч) в Операционной политике, чтобы скорректировать показываемое время. Значение применяется только к отображению и никогда — к границам запроса.

Суточная история пуста. Агрегация _1day может отставать на сутки и собирается по диапазону /24. Посмотрите вместо неё пятиминутную или почасовую детализацию.

Связанные материалы

포트 연결 — PORT OVERVIEW
포트 연결 — PORT OVERVIEW