mistgate Документация

Здоровье

Как панель проверяет каждый профиль как настоящий клиент, что смотрит и что умеет исправлять доктор ноды и как алерты открываются, закрываются и глушатся.

На этой странице

Mistgate следит за флотом с двух сторон. Панель подключается к каждому профилю на каждой ноде так же, как приложение пользователя (проверки глазами клиента), а агент на каждой ноде проверяет собственный хост (доктор ноды). Из этого и из состояния нод складываются алерты. Всё собрано на странице Здоровье во вкладках Алерты, Проверки и Доктор; у страницы ноды есть своя вкладка Доктор, а на вкладке Обзор видны проверки этой ноды.

Проверки глазами клиента#

Как устроена проверка#

Для каждого профиля на ноде панель поднимает туннель встроенным клиентом и через него запрашивает две страницы:

Запрос Что доказывает
https://www.gstatic.com/generate_204 Туннель пропускает трафик. Ответ должен быть 204. Показанная задержка — время от начала подключения до первого байта этого ответа.
https://www.cloudflare.com/cdn-cgi/trace Где трафик выходит в интернет: IP выхода и его страна.

Имена хостов разрешает нода, а не панель, поэтому сломанный резолвер на ноде тоже проваливает проверку.

Результат бывает трёх видов:

  • Успех: ответили обе страницы.
  • С ошибками: туннель работает, но одна из двух страниц не ответила. Задержка показывается цветом предупреждения. Такой результат сам по себе алерт не открывает.
  • Провал: туннель не поднялся или не ответила ни одна страница.

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

  • Hysteria2. Официальный клиент Hysteria2 внутри панели. Он подключается к адресу ноды и к собственному порту профиля (не к диапазону прыжков по портам, поэтому закрытый диапазон прыжков проверка не увидит). Он использует обфускацию профиля (Salamander или Gecko) и правила сертификата, как настоящий клиент: самоподписанный сертификат сверяется с отпечатком, который сообщила нода, любой другой проверяется по полю Домен (SNI) профиля.
  • AmneziaWG. amneziawg-go внутри процесса панели на сетевом стеке в userspace: без сетевого интерфейса, без root, без изменений в маршрутах сервера панели. Конфигурация та же, что получает настоящее устройство. Каждый круг — новое устройство, так что каждый круг заодно проверяет рукопожатие. Нода не отвечает незнакомому пиру и пакету с чужой обфускацией, поэтому отсутствие рукопожатия и закрытый UDP-порт выглядят одинаково: оба случая — таймаут.

Протокол без тестового клиента показывается как не проверяется.

Проверка идёт от скрытой служебной учётки на каждом профиле каждой ноды: она не принадлежит ни пользователю, ни устройству и никогда не появляется в списках пользователей, подписках, квотах и инструментах MCP. На профиле Hysteria2 нода ограничивает её скоростью 2 Мбит/с. На профиле AmneziaWG она занимает один адрес из клиентской сети профиля.

Важно

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

Расписание#

Что Значение
Интервал для каждого профиля на ноде 5 минут. У каждого профиля своё постоянное смещение внутри интервала и разброс до 10 секунд, поэтому круги распределены равномерно. Настройки для интервала в админке нет.
Круг Одна попытка и, если она провалилась, повтор через 15 секунд. Итог круга — последняя попытка.
Ограничения по времени 8 секунд на рукопожатие, 10 секунд на каждую страницу, 25 секунд на всю попытку.
Пока профиль не проходит Круг каждые 60 секунд, чтобы быстро подтвердить проблему и быстро заметить восстановление.
Кругов одновременно 4.
Новый профиль Впервые проверяется в течение 30 секунд.
Проверить сейчас Запускает круг сразу для всего флота («Здоровье» → «Проверки») или для одной ноды (Проверить эту ноду сейчас). Не чаще одного круга на профиль в 30 секунд; более ранний клик ответит «Только что проверяли».

Как читать таблицу#

«Здоровье» → «Проверки» — таблица: строки — ноды, столбцы — профили. В ячейке задержка в миллисекундах или состояние:

Ячейка Значение
123 мс Последний круг прошёл.
✕ не проходит Профиль не проходит проверку.
✕ не запущен Нода не смогла запустить профиль.
выкл. Вы выключили профиль на этой ноде.
нет связи Нода не на связи.
не проверяется Для протокола у панели нет тестового клиента.
запуск Профиль запускается.
— Профиль не развёрнут на этой ноде.

Провалом считается только «не проходит». Остальные состояния — пропущенные круги: они не сохраняются и не влияют на счётчик неудач подряд.

Клик по ячейке открывает последние 24 часа в получасовых столбиках (красные — где круг провалился), IP выхода и Подряд с ошибкой. Алерт открывается после двух проваленных кругов подряд.

Если круг провалился, ячейка объясняет почему:

Код Что пишет админка
timeout Нет рукопожатия: UDP-трафик, скорее всего, не доходит
auth Нода отклонила проверочную учётку панели
tls Сертификат или домен не совпадает
refused Соединение отклонено: на порту никто не слушает
exit_unreachable Туннель работает, а выход ноды в интернет нет
http_status Тестовые сайты отвечают ошибкой

Что значит «зелёный»#

Зелёная ячейка значит, что в последние минуты клиент из сети панели завершил рукопожатие с этим профилем на этой ноде и через выход ноды открыл два известных сайта. Она не доказывает, что работает диапазон прыжков по портам, что сети ваших пользователей пропускают трафик и что каждое приложение справляется с профилем.

Доктор ноды#

Агент каждой ноды прогоняет 16 проверок своего хоста. Они только читают: файлы в /proc и /sys, несколько файлов конфигурации и команды, которые ничего не меняют (systemctl list-*, nft list, timedatectl show, dmesg, journalctl -k). Любое изменение — отдельный подтверждаемый шаг (см. «Исправления» ниже).

Когда он работает#

  • Примерно через 30 секунд после подключения агента, затем каждые 10 минут (с разбросом до минуты).
  • Проверить снова на «Здоровье» → «Доктор» или на вкладке Доктор ноды просит ноду прогнать проверки сейчас и ждёт отчёт до 30 секунд.
  • У каждой проверки 10 секунд, у всего прогона 30 секунд. Проверка, которая зависла или не может работать на этом хосте (контейнер, нет systemd, не root), получает статус Пропущено с причиной. Ложного «Ок» не бывает.
  • Отчёт старше 25 минут считается устаревшим: админка показывает его серым и пишет, сколько ему. У ноды не на связи показан её последний отчёт, а исправления недоступны, пока она не вернётся.
  • Про агента, который появился раньше доктора, админка пишет «слишком старый для доктора». Обновите его на странице «Обновления».

У каждого пункта одно из четырёх состояний: Ок, Внимание (предупреждение), Проблема и Пропущено.

Проверки#

Проверка Что смотрит Внимание Проблема Исправление
Место на диске (disk_space) Занятое место и inodes на / и на томе каталога состояния агента, считая как df. Занято 80% или свободно меньше 1 ГБ Занято 92%, свободно меньше 300 МБ или занято 95% inodes Сжать журнал, если журнал не меньше 300 МБ
Размер журнала systemd (journald_size) Сколько журнал systemd занимает на диске. Базовая настройка ограничивает его 200 МБ. Больше 300 МБ (лимит не работает) Больше 1 ГБ Сжать журнал
Зависшие процессы (dstate_tasks) Процессы в непрерываемом ожидании в трёх замерах с интервалом 2 секунды, ошибки QXL/TTM в журнале ядра и нагрузка, равная числу ядер, когда процессор 10 минут простаивает. Есть зависший процесс Зависание два прогона подряд, зависание QXL/TTM или нагрузка при простое Нет: перезагрузите сервер из панели хостера
Часы (time_sync) Расхождение с часами панели и синхронизация NTP. Расхождение больше 2 секунд или NTP не синхронизирован Расхождение больше 30 секунд Нет: включите NTP (timedatectl set-ntp true)
Резолвер сервера (resolver) Отвечает ли собственный резолвер хоста для www.cloudflare.com, www.gstatic.com и www.google.com, а на нодах в России ещё для gosuslugi.ru. 3 секунды на имя, один повтор. Одно имя не разрешается или медиана ответа больше 500 мс Не разрешаются два имени и больше или gosuslugi.ru на ноде в России Исправить резолвер, только если рекомендованные резолверы ответили в том же прогоне
IPv6 (ipv6) Глобальный IPv6-адрес и исходящее IPv6-соединение с двумя публичными резолверами на порт 443. Адрес IPv6 есть, а исходящие соединения не проходят (у клиентов, получивших AAAA-записи, сайты подвисают) Нет Нет
Следы других VPN (foreign_vpn) Службы systemd x-ui, Xray, remnanode, hysteria-server и wg-quick@, контейнеры Docker с VPN-образами, интерфейсы wg* и awg*, которые не принадлежат Mistgate, запущенные процессы xray, x-ui и sing-box. Что-то из этого найдено Что-то из этого занимает порт профиля Нет: удалять или нет, решаете вы
Чужие правила файрвола (foreign_nft) Таблицы nftables, которые не принадлежат Mistgate. Старые правила iptables эта проверка не видит. В чужой таблице есть хук nat Чужое правило перенаправляет, подменяет или отбрасывает порт или диапазон прыжков профиля Нет
Занятые порты (port_conflicts) Слушающие сокеты на портах профилей, их диапазонах прыжков и на TCP-порту HTTPS-заглушки и ACME профиля Hysteria2. Чужой слушатель в диапазоне прыжков, чужой процесс на TCP-порту или профиль, который не смог занять порт, а сейчас порт свободен Чужой процесс держит порт профиля Перезапустить профиль, только для профиля, который не смог занять порт
Базовая настройка сети (net_baseline) fq как qdisc по умолчанию, алгоритм перегрузки BBR, файл sysctl и дополнение к journald от Mistgate. Что-то отличается Нет Вернуть базовые настройки
Сертификаты (cert_expiry) Сертификат, который на деле отдаёт каждый профиль с TLS, совпадает ли он с доменом, и собственный сертификат агента для связи с панелью. У сертификата профиля меньше 14 дней, у сертификата агента меньше 5 дней Меньше 3 дней, истёк или не подходит к домену; у сертификата агента меньше суток Перезапустить профиль, только для самоподписанного сертификата
Память (memory_pressure) Доступная память, своп, давление на память (PSI) и убийства по OOM в журнале ядра за сутки. Доступно меньше 12%, своп занят больше чем на 50% под давлением или было убийство по OOM Доступно меньше 5%, сильное давление или OOM убил агента или движок VPN Нет
CPU softirq (cpu_softirq) Средняя доля softirq и общая загрузка процессора за 10 минут. Пропускается, пока не набрано 30 замеров. softirq 50% и больше softirq 90% и больше или процессор 97% и больше Нет
Заголовки ядра (kernel_headers) Заголовки ядра, dkms, make и gcc для модуля ядра AmneziaWG. Пропускается без профиля AmneziaWG; пока AmneziaWG работает в userspace, это просто факт. Запрошен режим ядра, модуль не работает, а инструментов не хватает Нет Нет: см. AmneziaWG
Бэкенд AmneziaWG (awg_backend) Чем работает AmneziaWG: модулем ядра или в userspace. Пропускается без профиля AmneziaWG. Файрвол хоста отбрасывает пересылаемый трафик (часто из-за Docker) Нет рабочего бэкенда: нет /dev/net/tun, устаревший служебный файл или нет модуля в режиме ядра Нет
Выход через WARP (warp_path) Туннель WARP ноды и его маршруты. Пропускается, если у ноды нет аккаунта WARP и ни один профиль не выходит через WARP. WARP на паузе, а профили выходят через него Профили выходят через WARP, а аккаунта у ноды нет; на хосте таблица маршрутов, приоритет правила или имя интерфейса WARP заняты; нет бэкенда WireGuard; WARP не работает Нет: см. WARP

Нода без IPv6 с WARP — это нормально: WARP ходит через свой IPv4-адрес, и админка показывает пункт IPv6 как «Ок».

Предупреждение или проблема открывают алерт (см. «Виды алертов» ниже). Исключение — проверка сертификатов: она открывает алерт «Сертификат скоро истечёт», а не алерт доктора.

Исправления#

Исправлений ровно четыре. Они встроены в агента: панель присылает только идентификатор исправления, а агент проверяет параметры (профиль должен быть одним из тех, что работают на ноде). Ни одно из них не ставит пакеты и не удаляет данные.

Кнопка Что делает Где предлагается
Сжать журнал journalctl --vacuum-size=200M --vacuum-time=7d Размер журнала systemd, Место на диске
Вернуть базовые настройки Заново записывает файл sysctl от Mistgate (/etc/sysctl.d/90-mistgate.conf: fq и BBR) и дополнение к journald (/etc/systemd/journald.conf.d/90-mistgate.conf: лимит 200 МБ), а также защиту SSH (ограничение частоты новых SSH-подключений с одного адреса). Базовая настройка сети
Перезапустить профиль Перезапускает один профиль на ноде или все профили, которые не запустились. Подключения через профиль обрываются на пару секунд и восстанавливаются сами. Занятые порты, Сертификаты (самоподписанные)
Исправить резолвер Направляет резолвер хоста на DNS для трафика пользователей из настроек ноды, а если поле пустое — на резолверы по умолчанию для страны ноды: Яндекс DNS (77.88.8.8, 77.88.8.1) на нодах в России, 1.1.1.1 и 8.8.8.8 в остальных. При systemd-resolved пишет дополнение (/etc/systemd/resolved.conf.d/90-mistgate.conf), иначе переписывает /etc/resolv.conf и сохраняет прежний файл как /etc/resolv.conf.mistgate.bak. Резолвер сервера

Исправление всегда идёт в два шага:

  1. Нажмите кнопку исправления у пункта доктора или в алерте. Панель спрашивает ноду, что она сделает («Спрашиваю у ноды, что она сделает…»); нода отвечает пробным прогоном, который ничего не меняет.
  2. Диалог показывает план: например, размер журнала до и после или какие профили перезапустятся и сколько подключений оборвётся. Применить выполняет ровно этот план.

План действует 10 минут, срабатывает один раз и привязан к ноде, исправлению и его параметрам. На одной ноде одновременно выполняется одно исправление. Оба шага пишутся в журнал аудита. После удачного исправления нода заново прогоняет затронутые проверки, и алерты, которые оно сняло, закрываются как «исправлено». Применять исправления может только владелец.

Если исправление не удалось, диалог объясняет почему:

Ошибка Значение
unknown_fix Агент этой ноды не знает такого исправления
bad_params Нода отклонила параметры
not_applicable Проблема уже ушла или хост этого не умеет
unsupported_host Такой хост этого не поддерживает
busy Нода занята другим исправлением

У проверок без исправления пункт открывает блок Вручную с командами для ноды: включить синхронизацию времени, найти, кто держит порт, посмотреть правила файрвола, или совет перезагрузить сервер из панели хостера.

«Это нормально для этой ноды»#

Некоторые предупреждения — факты, с которыми вы согласны: собственные таблицы nftables у Docker, хост без работающего IPv6. Это нормально для этой ноды у пункта доктора или в его алерте перестаёт открывать алерт и считаться в значках. Пункт переезжает в группу Принято как нормальное и показывает, кто и когда его принял.

  • Принять можно только предупреждение («Внимание»). Проблему — нельзя, предупреждение о сертификате — никогда.
  • Принимается именно тот факт, который сообщила нода (её код детали). Принятие снимается само, когда нода сообщает по этой проверке другой факт или проверка становится проблемой. Предупреждения агента, слишком старого для кодов деталей, принять нельзя.
  • Вернуть отменяет принятие.
  • Алерт принятого предупреждения закрывается как «принято как нормальное».

Алерты#

Как алерты открываются и закрываются#

Алерт — функция текущего состояния. Каждые 10 секунд, а также после каждого круга проверок и каждого отчёта доктора панель выясняет, какие условия выполняются сейчас: для нового условия открывается алерт, алерт без условия закрывается. На один вид, ноду и предмет (профиль, проверку доктора) приходится один активный алерт. Поскольку ничего не зависит от запомненных событий, алерты переживают перезапуск панели.

Если панель не может оценить условие, алерт остаётся как есть, а не закрывается: у ноды не на связи сохраняются остальные алерты (для неё решается только «Нода недоступна»), устаревший отчёт доктора сохраняет алерты доктора, а результат проверки, сделанный до пропажи ноды, сохраняет алерты проверок.

Алерт, который срабатывает снова в течение часа после закрытия, открывается заново с прежним идентификатором и временем начала. Первые 90 секунд после запуска панели алерт «Нода недоступна» не открывается: агенты ещё переподключаются.

Виды алертов#

Заголовок в админке Вид Важность Когда открывается
Нода недоступна node_down Критично У агента нет связи 10 минут. Более короткий обрыв — событие, а не алерт.
Хостер моргнул host_blip Инфо Только для истории: пишется, когда связь вернулась в течение 10 минут без перезагрузки. Активным не бывает.
Жива, но трафик не идёт no_traffic Критично Агент на связи и профили работают, но каждый проверяемый профиль ноды провалил два круга подряд. Статус ноды становится «трафик не идёт».
«<профиль>» не проходит проверку глазами клиента check_failed Внимание; Критично, если это единственный профиль этого протокола на ноде Часть профилей (не все) ноды на связи провалила два круга подряд.
Панель не достаёт до многих нод check_failed (на весь флот) Внимание Последний круг провалился хотя бы у 80% проверяемых профилей на нодах как минимум трёх разных значений поля Хостер. Подозрение падает на собственное соединение панели: алерты проверок по нодам на паузе, пока не пройдёт круг.
Заголовок пункта доктора doctor_warn / doctor_fail Внимание / Критично Проверка доктора сообщает «Внимание» / «Проблема». Предупреждение «Заголовки ядра» на ноде без профиля AmneziaWG — Инфо.
Состояние ноды разошлось с панелью state_drift Внимание Конфигурация, которую применила нода, отличается от панельной даже после автоматической полной пересылки.
Сертификат скоро истечёт cert_expiry Внимание; Критично, если осталось меньше 3 дней, срок истёк или сертификат не подходит к домену По проверке сертификатов доктора. Для агента без доктора — по тому, что о сертификатах профилей знает сама панель (меньше 14 дней).
Обновление ноды остановилось update_failed Внимание Раскатка встала на паузу: нода не приняла обновление, не прошла проверку после обновления или панель после перезапуска потеряла нить шага. Закрывается, когда раскатку продолжают, отменяют или запускают новую. См. «Обновления».

Причина в алерте о трафике называет вероятный диагноз:

Диагноз Когда
Закрыт UDP-порт Профиль упирается в таймаут, а другой профиль этой ноды отвечает на другом порту, или вся нода упирается в таймаут на одном порту: похоже, хостер режет этот UDP-порт.
Закрыт весь UDP Таймаут у всех профилей, на порту 443 или на двух портах и больше: похоже, хостер режет входящий UDP целиком.
Мёртв выход через WARP Профиль с выходом через WARP не проходит, а прямой профиль того же протокола на ноде работает.
auth, tls, refused, нет выхода в интернет, ошибки тестовых сайтов Код ошибки проверки, объяснённый простыми словами.
Разные причины Каждый профиль не проходит, и каждый по-своему.

Ещё два вида есть в API, но панель не открывает их как алерты: пользователь выбрал квоту (это видно в его статусе) и подписка похожа на общую (пишется событием «ссылкой подписки пользуются из N сетей за сутки»).

Важность и значки#

Алерты бывают Критично, Внимание и Инфо. Значок в шапке и на «Обзоре» считает активные алерты, кроме заглушённых и «Инфо». В списке активных сначала идут критичные, затем самые новые.

Чем закончился алерт#

Список История · 7 дней показывает, как закрылся каждый алерт:

В админке Код Когда
прошло само cleared Условие исчезло.
исправлено fix_applied Алерт закрылся в течение 5 минут после исправления доктора, которое он предлагал.
нода выведена node_retired Ноду вывели из флота.
вернулась сама node_returned Недоступная нода вернулась.
заменён более крупным алертом superseded Более крупный алерт говорит то же самое: «Жива, но трафик не идёт» заменяет алерты отдельных профилей, проблема доктора — предупреждение той же проверки, проблема доктора с WARP — алерт профиля через WARP, алерт на весь флот — алерты проверок по нодам.
принято как нормальное accepted Владелец принял предупреждение доктора как нормальное для ноды.

Закрытые алерты хранятся 90 дней. API отдаёт историю до 30 дней, не больше 200 алертов.

Кнопки в алерте#

В зависимости от содержания карточка алерта предлагает:

  • исправление доктора (только пока доктор его предлагает и нода на связи);
  • Перезапустить профиль или Перезапустить профили — с числом подключений, которые оборвутся;
  • Открыть профили ноды, где меняются порт и домен;
  • карточку WARP ноды;
  • Открыть ноду;
  • Это нормально для этой ноды — для предупреждения доктора;
  • Заглушить.

Заглушка#

Заглушить предлагает: «На 1 час», «До утра (08:00)», «На сутки», «На 7 дней». Самая долгая заглушка — 7 дней; Снять заглушку отменяет её.

  • Заглушённый алерт остаётся в списке с подписью «Заглушён до …». Его продолжают оценивать, и он закрывается сам.
  • В значках он не считается.
  • Если его важность растёт, заглушка снимается и алерт снова считается.
  • Заглушка пишется в журнал аудита.
Важно

уведомлений панель пока не отправляет. Telegram-бот для флота в планах. Сейчас алерты видны в админке (значок в шапке, «Обзор», страница «Здоровье») и через API и MCP.

События на странице ноды#

Вкладка События ноды и лента событий на «Обзоре» хранят хронологию, которая отвечает на вопрос «что было ночью»:

Событие Когда пишется
перестала отвечать (с …) Нода молчит 10 минут.
связь пропадала на … и вернулась сама Нода вернулась после 1–10 минут тишины.
сервер перезагрузился (… без связи) Нода вернулась с другим временем загрузки.
снова на связи после … Нода вернулась после «перестала отвечать».
трафик перестал идти: X из Y профилей не проходят проверку Открылся алерт «Жива, но трафик не идёт».
трафик снова идёт (…) Он закрылся как «прошло само» или «исправлено», с длительностью.
«<профиль>» не проходит проверку глазами клиента Открылся алерт проверки профиля.
«<профиль>» снова проходит проверку (…) Он закрылся как «прошло само» или «исправлено».
обновлена до … / обновление не удалось / обновление откатилось Закончился шаг раскатки.

События важности «инфо» хранятся 90 дней, предупреждения и ошибки — 400 дней. Отдельные круги проверок хранятся 25 часов после того, как день сведён в итог; дневные итоги — 90 дней.

Кто что может#

Действие Владелец Помощник Только чтение
Смотреть алерты, проверки и отчёты доктора да да да
Заглушить алерт, «Проверить сейчас», «Проверить снова» да да нет
«Это нормально для этой ноды», «Вернуть» да да нет
Применить исправление доктора да нет нет

API-токен с профилем operator может глушить алерты, запускать проверки и доктора. Исправление доктора через токен возможно только через MCP, как план, который одобряет владелец (см. MCP).

Править страницу на GitHub