Перейти к содержимому

Мониторинг удалённой площадки

Один DumbMonit, несколько сетей. Релейный агент (relay agent), установленный на удалённой площадке, выполняет от имени сервера опросы назначенных ему мониторов и передаёт результаты по тому же исходящему соединению, которое уже использует для отправки собственных метрик. Ничего не нужно открывать на удалённой площадке, не нужен VPN и второй экземпляр, на который надо смотреть.

head office remote site (NAT, firewall)
┌──────────────────┐ HTTPS, outbound ┌──────────────────────────────┐
│ DumbMonit server │◀────────────────────│ relay agent │
│ scheduler │ probes to run ──▶ │ runs SNMP / Proxmox / HTTP… │──▶ switch, NAS,
│ alerting, UI │◀── samples, verdict │ pushes its own metrics too │ hypervisor…
└──────────────────┘ └──────────────────────────────┘

Релей получает свои задания от сервера: сервер должен быть доступен с удалённой площадки, как правило, по адресу https://monitor.example.org за обратным прокси. По этому каналу передаются две вещи:

  • токен регистрации (dmon_…) в заголовке Authorization каждого запроса — как для любого агента;
  • учётные данные мониторов, которые опрашивает релей (сообщество SNMP, токен API Proxmox…), в расшифрованном виде, внутри каждого задания на опрос.

Веб-порт принимает только HTTPS, поэтому оба потока зашифрованы по пути. В интернете поставьте сервер за обратный прокси с публичным сертификатом (он подключается к DumbMonit по HTTPS); в локальной сети или VPN подойдёт самоподписанный сертификат, закреплённый отпечатком из показанной команды. Токен остаётся единственным секретом в передаче, пока вы не назначите релею мониторы. Учётные данные никогда не записываются на диск ни с одной из сторон: задание на опрос живёт в памяти сервера, пока релей не сообщит о нём, а агент ничего не хранит между двумя опросами.

Обратный прокси должен пересылать /api/agent/relay так же, как /api/ingest, допускать тела запросов до 16 МБ (нагруженный гипервизор сообщает тысячи замеров) и держать простаивающие соединения открытыми не менее 60 секунд: сервер удерживает запрос релея до 25 секунд в ожидании работы (long polling).

Добавьте монитор, выберите Сервер с агентом и отметьте Этот агент — ретранслятор для удалённой площадки (или откройте вход Relay на странице добавления). Дайте площадке имя и создайте токен: он несёт режим ретранслятора и площадку, так что на машине ничего править не нужно. Скопируйте значение dmon_…: оно показывается один раз; затем страница ждёт первой отправки.

Любая машина на удалённой площадке с Docker, используя docker-compose.agent.yml из репозитория:

Окно терминала
DUMBMONIT_AGENT_URL=https://monitor.example.org \
DUMBMONIT_AGENT_TOKEN=dmon_… \
DUMBMONIT_AGENT_HOSTNAME=relay-lyon \
DUMBMONIT_AGENT_RELAY=true \
DUMBMONIT_AGENT_SITE="Lyon office" \
docker compose -f docker-compose.agent.yml up -d

Либо обычный агент, установленный однострочным установщиком, с двумя дополнительными ключами в /etc/dumbmonit/agent.yaml:

relay: true
site: Lyon office

Машина появляется в DumbMonit в течение нескольких секунд как обычный монитор-агент, и на её странице написано Relay · site Lyon office · relays 0 devices. В журнале агента появляется relay mode enabled: waiting for probes from the server, как только принят его первый пакет.

Добавьте удалённые мониторы как обычно — коммутатор SNMP, узел Proxmox, проверка HTTP — с их адресом так, как он виден с удалённой площадки (192.168.10.1, https://pve.lan:8006). В форме монитора, в разделе More options, выберите в поле Reached through релейный агент вместо Direct. Существующие мониторы переключаются так же; возврат к Direct снова заставляет сервер опрашивать их самому.

С этого момента:

  • сервер ставит в очередь опрос монитора на каждом интервале; релей забирает его за миллисекунды (он ждёт работы на сервере), запускает коллектор и сообщает результат;
  • Probe now и определение профиля на странице монитора тоже идут через релей;
  • last probe и ошибка монитора следуют вердикту релея. Если релей не забрал опрос вовремя, монитор показывает Timed out: relay agent … did not pick up the probe — проверьте, что агент запущен с relay: true;
  • на странице агента показано Relay for N devices, а GET /api/relays перечисляет релеи с их площадкой и числом мониторов.

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

remote site (only the relay goes out) head office
┌────────────┐ TLS 1.3, mTLS ┌──────────────┐ tunnel inside the ┌──────────────────┐
│ agent │═════════════════▶│ relay agent │═ relay's own mTLS ═▶│ DumbMonit server │
│ (server A) │ to the relay's │ gateway │ connection, TCP │ agent port 8443 │
└────────────┘ port 8443 └──────────────┘ 8443 outbound └──────────────────┘
└──────────── one TLS session, end to end, agent ⇄ server ─────────────┘

В DumbMonit добавьте монитор, выберите Сервер с агентом и в пункте Как машина достигает этого сервера? выберите Через <ретранслятор> (площадка). Укажите адрес, по которому площадка достигает ретранслятора (IP или локальное имя). Показанные команды — Linux/macOS, Windows, Docker — тогда указывают на шлюз ретранслятора (--url=http://192.168.10.5:8443 --tls-url=https://192.168.10.5:8443) и по-прежнему несут отпечаток центра сертификации сервера. Затем мастер ждёт первого подключения и позволяет назвать машину, положить её в папку и привязать к площадке, не покидая страницы. С площадки в Добавить по площадке пункт Сервер с агентом заранее выбирает ретранслятор этой площадки; на странице самого ретранслятора есть Установить агент через него.

Выбор ретранслятора для установки просит его открыть свой шлюз (по умолчанию на порту 8443) при следующей отправке. Панель Relay на странице ретранслятора показывает шлюз — Слушает порт 8443 — подключено агентов: 3 — и позволяет изменить порт и адрес или закрыть его. Откройте этот порт на межсетевом экране самого ретранслятора, только для сети площадки. Для ретранслятора в Docker опубликуйте порт (-p 8443:8443 или закомментированные ports: в docker-compose.agent.yml). gateway_listen: 0.0.0.0:9443 в agent.yaml ретранслятора (DUMBMONIT_AGENT_GATEWAY_LISTEN) важнее настройки в интерфейсе.

Что проходит через ретранслятор:

  • Зашифрованный канал агента, нетронутым. Ретранслятор распознаёт TLS ClientHello и копирует байты в обе стороны в туннель, который он открывает к порту агентов сервера под своим клиентским сертификатом (HTTP upgrade на /api/agent/relay/tunnel). Затем сервер проводит рукопожатие TLS 1.3 с агентом площадки так, будто тот подключился напрямую: клиентский сертификат агента, закреплённый центр сертификации, токен и секрет привязки проверяет сервер, из конца в конец. Регистрация идёт тем же путём.
  • Установщик и бинарный файл, которые ретранслятор получает с сервера по своему каналу и отдаёт на том же порту (только /install.sh, /install.ps1, /download/<файл>). Команда установки содержит SHA-256 каждого бинарного файла: скрипт отвергает любой другой.

Сервер запоминает для каждого агента ретранслятор, через который тот подключается. Страница агента пишет Достигает этого сервера через ретранслятор …; карта топологии рисует ретранслятор его родителем; а когда ретранслятор падает, агенты за ним показываются как suppressed ретранслятором, а не как множество отдельных сбоев. Агент, который позже подключится напрямую (или через другой ретранслятор), обновляется при следующей отправке.

Набор для Active Directory предлагает тот же выбор: в пункте Route выберите ретранслятор, и серверы домена скачают агент с него и будут отправлять данные через него.

Релей, который замолчал, уносит с собой свои мониторы: их опросы прекращаются, и все они разом стали бы unreachable. Релей рассматривается как родитель каждого опрашиваемого им монитора (в дополнение к родителю, которого вы могли задать): когда сам релей unreachable, оповещения его мониторов показываются как suppressed с suppressed_by = релей, и уходит только одно уведомление — о релее. Явно заданный вами родитель сохраняет свою роль и побеждает, если недоступны оба.

  • Один релей на монитор. Монитор, опрашиваемый релеем, не опрашивается также сервером.
  • Мониторы-агенты никогда не опрашиваются через ретранслятор (они отправляют свои метрики сами); зато агент может подключаться через шлюз ретранслятора (см. выше). Ретранслятор всегда подключается напрямую: ретранслятора за ретранслятором не бывает.
  • Шлюз ретранслятора по умолчанию принимает 64 соединения одновременно и 4 МиБ/с на туннель и направление (gateway_max_connections, gateway_rate_kib); сервер принимает 256 туннелей на ретранслятор.
  • Релей выполняет не более 8 опросов одновременно; опрос ограничен тайм-аутом опроса сервера (DUMBMONIT_PROBE_TIMEOUT_SECS) и не более 120 с на агенте.
  • Релейному агенту нужны встроенные коллекторы: агенты старше этой функции игнорируют relay: true, и сервер сообщает об их опросах как о превысивших время ожидания. Переустановите с текущим бинарным файлом или образом.