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

Добавление ноды

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

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

Нода входит во флот одной командой: агент обменивает одноразовый токен на сертификат от панели, ставит себя службой systemd и подключается. Эта страница проходит по шагам, объясняет, что происходит на сервере, и показывает, как потом вывести ноду из флота.

Перед началом#

  • Сервер, который подходит под требования, с доступом root по SSH.
  • Бинарник агента из той же сборки, что и панель: bin/mistgate-node-linux-amd64 или bin/mistgate-node-linux-arm64.
  • Панель должна быть доступна с сервера по публичному адресу на TCP 443 (или по адресу, который вы дали serve --agent-addr). Сама панель к ноде не подключается.

1. Получите команду установки#

В админке откройте Ноды → Добавить ноду. То же окно открывается плиткой Добавить ноду на «Обзоре», из командной палитры и в конце мастера первой настройки.

Поле Что вписать
Имя a–z, 0–9 и дефис, от 2 до 24 символов, например de1. Имена уникальны, и выведенная из флота нода своё имя сохраняет.
Страна Не обязательно. Нужна для DNS: на нодах в России доктор проверяет госуслуги и предлагает Яндекс DNS.
Адрес Домен или IP, без https:// и без порта. К нему подключаются клиенты, и он попадает во все подписки. Сертификату Let's Encrypt для Hysteria2 нужен домен, у которого A-запись указывает на сервер.

Если адрес — IP, окно скажет об этом заранее: тогда Hysteria2 на этой ноде нужен домен с A-записью или самоподписанный сертификат (с пином), который выбирается при добавлении профиля. AmneziaWG работает и по IP.

Нажмите Получить команду установки. Нода появится в списке со статусом «Ждёт установки», а окно покажет три шага.

2. Положите агента на сервер#

Если в каталоге данных панели лежит доверенная сборка для обновлений, первый шаг в окне покажет готовую команду scp, которую нужно выполнить на сервере панели. Она копирует агента для amd64; для сервера на ARM замените amd64 на arm64.

Иначе скопируйте агента из той же сборки сами, в /root/mistgate-node:

sh
scp bin/mistgate-node-linux-amd64 root@de1.example.com:/root/mistgate-node

3. Выполните команду от root#

Зайдите на сервер по SSH от root и вставьте команду из второго шага окна (Скопировать команду). Она выглядит так:

sh
chmod +x /root/mistgate-node && /root/mistgate-node enroll --panel panel.example.com:443 --sni <секретное имя> \
  --ca-sha256 <отпечаток> --token <одноразовый токен> && /root/mistgate-node install
Часть Что значит
--panel Хост и порт, к которым подключается агент.
--sni Секретное имя SNI, ведущее к точке подключения агентов. Без него панель показывает сайт-ширму.
--ca-sha256 Отпечаток CA панели. Нода доверяет панели только по нему. Окно показывает его и в разделе Подробнее.
--token Одноразовый токен подключения. Работает один раз и истекает через час; до какого времени — написано в окне.

Если всё прошло, команда напечатает:

text
enrolled as nod_... with panel.example.com:443; state in /var/lib/mistgate-node
next: mistgate-node install   (or, in the foreground: mistgate-node run)
installed /etc/systemd/system/mistgate-node.service (state /var/lib/mistgate-node)
started; follow it with: journalctl -u mistgate-node -f
Важно

пока работает enroll, токен виден в списке процессов на сервере. Он одноразовый и живёт недолго; если сервером пользуются другие люди, задайте переменную MISTGATE_ENROLL_TOKEN вместо --token.

Что происходит на сервере#

enroll:

  1. Создаёт на ноде ключ P-256 и запрос сертификата. Ключ никогда не покидает сервер.
  2. Подключается к --panel по TLS 1.3 с секретным именем и принимает сервер, только если его цепочка заканчивается на CA с закреплённым отпечатком.
  3. Отправляет токен и запрос. Панель проверяет токен (у себя она хранит только его хеш), выпускает клиентский сертификат на 30 дней и возвращает его вместе со своим CA.
  4. Записывает ключ и сертификат (identity.pem), CA панели (ca.pem) и адрес панели (agent.json) в /var/lib/mistgate-node (каталог 0700, файлы 0600).

install:

  1. Проверяет, что запущен от root и что в каталоге состояния есть данные подключения.
  2. Копирует себя в /usr/local/bin/mistgate-node. Файл в /root больше не нужен.
  3. Пишет защищённый юнит /etc/systemd/system/mistgate-node.service с лимитами под память сервера и выполняет systemctl daemon-reload, enable и restart.

Запущенный агент:

  1. Применяет свою базовую настройку хоста: значения sysctl для fq и BBR, ограничение размера журнала и защиту SSH в собственной таблице nftables.
  2. Восстанавливает последнее применённое состояние из каталога состояния (при первом запуске его нет).
  3. Открывает одно долгоживущее соединение с панелью со взаимным TLS, сообщает сведения о хосте и получает настройки и желаемое состояние: какие серверы запускать и с учётными данными каких пользователей.
  4. Каждые 10 секунд отправляет трафик, сессии и метрики хоста, запускает доктора через 30 секунд после подключения и потом каждые 10 минут, а когда до конца сертификата остаётся меньше 10 дней, продлевает его с новым ключом.

Полный список того, что агент меняет на хосте, — в разделе «Что агент меняет на ноде» на странице Требования.

4. Нода выходит на связь#

Окно обновляется само. Через несколько секунд после install третий шаг сменится на Подключена, а в событиях ноды появится «впервые вышла на связь» с версией агента. Нажмите Добавить профиль на de1 и переходите к Первым пользователям: пока на ноде нет ни одного профиля, она пишет «нет профилей — пользователи её не получат».

Статус Что значит
Ждёт установки Нода создана, но ни один агент ещё не подключился. На странице ноды видно, до какого времени действует команда.
Работает Агент на связи, серверы на ноде работают.
Хостер моргнул Связь пропала меньше 10 минут назад; часто виноват хостер.
Недоступна Связи нет 10 минут. Страница ноды покажет команду, которая перезапускает агента и выводит его лог.
Выведена Нода выведена из флота.

Если нода так и не вышла на связь, посмотрите лог агента на сервере:

sh
systemctl restart mistgate-node && journalctl -u mistgate-node -n 50 --no-pager

В строках panel connection lost написана причина. Проверьте заодно, что часы на сервере идут правильно.

Новая команда установки#

У ноды, которая ждёт установки, есть кнопка Новая команда установки — на странице ноды, на «Обзоре» и в чек-листе первого запуска. Она нужна, если команда истекла или потерялась. Новая команда отменяет все прежние неиспользованные.

Для ноды, которая уже подключалась раньше (сервер переустановлен, каталог состояния потерян), такой кнопки в админке пока нет: выведите ноду из флота и добавьте сервер заново как новую ноду под другим именем. Если на сервере остался старый каталог состояния, enroll откажется с already enrolled; use --force to replace the identity: добавьте --force после enroll.

Удаление ноды#

Откройте ноду, Настройки → Опасная зона → Вывести из флота, и для подтверждения введите имя ноды. После этого панель:

  • убирает ноду из доступа всех пользователей: в их подписках её больше нет, сами ссылки не меняются;
  • отзывает сертификат ноды и отменяет её неиспользованные команды установки;
  • сохраняет запись о ноде и её историю (и имя) в панели и в аудите.

Если агент на связи, он получает приказ выйти из флота и на сервере:

  1. останавливает свои серверы;
  2. убирает WARP, если он был;
  3. убирает свои изменения на хосте: свои таблицы nftables, интерфейсы AmneziaWG, файлы sysctl и journald, а также исправление резолвера из доктора, если его применяли;
  4. удаляет свой каталог состояния (ключ — первым) и завершается.

На сервере остаются бинарник, юнит (по-прежнему включённый), значения, уже выставленные в работающем ядре (fq, BBR, пересылка IP), — до следующей перезагрузки, и модуль ядра AmneziaWG с пакетами, если вы его ставили. Остальное уберите сами:

sh
systemctl disable --now mistgate-node
rm -f /etc/systemd/system/mistgate-node.service
systemctl daemon-reload
rm -f /usr/local/bin/mistgate-node /usr/local/bin/mistgate-node.prev /usr/local/bin/mistgate-node.new /root/mistgate-node
rm -rf /var/lib/mistgate-node
Внимание

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

sh
systemctl disable --now mistgate-node      # при остановке выполняется cleanup-net: интерфейсы туннелей, маршруты WARP, их таблицы
nft delete table inet mistgate_node        # защита SSH и правила прыжков по портам
rm -f /etc/sysctl.d/90-mistgate.conf /etc/systemd/journald.conf.d/90-mistgate.conf
systemctl restart systemd-journald

Если на этой ноде применяли исправление резолвера из доктора, удалите /etc/systemd/resolved.conf.d/90-mistgate.conf и перезапустите systemd-resolved или верните /etc/resolv.conf из /etc/resolv.conf.mistgate.bak (если есть /etc/resolv.conf.mistgate.bak.link, исходный файл был символической ссылкой на путь, записанный в нём).

mistgate-node cleanup-net можно запускать когда угодно. Команда убирает интерфейсы AmneziaWG и WARP, маршруты и правила WARP и их таблицы nftables; при запуске агент создаёт их заново.

Если подключение не удалось#

Что видно Причина Что делать
enroll: --panel, --sni, --ca-sha256 and --token are required Команда обрезалась при вставке. Скопируйте её заново кнопкой Скопировать команду.
--ca-sha256 must be 64 hex digits То же. То же.
enrollment token unknown, expired or used Команде больше часа, её уже использовали или для этой ноды сделали новую. Новая команда установки на странице ноды.
too many failed attempts, try later Десять неудачных попыток за минуту с этого адреса. Подождите минуту и возьмите свежую команду.
node retired Нода выведена из флота. Добавьте новую ноду.
no certificate in the chain matches the pinned CA fingerprint, panel did not present its CA certificate или the CA returned by the panel does not match --ca-sha256 По адресу --panel TLS отвечает не панель: перед ней стоит CDN или обратный прокси, адрес неверен или каталог данных панели создан заново уже после того, как была сделана команда. Направьте DNS панели прямо на её сервер, проверьте --public-url и --agent-addr, сделайте новую команду.
Таймаут или connection refused Панель не запущена, файрвол закрывает TCP 443 к панели или в команде неверный адрес. Проверьте панель и её файрвол; с ноды проверьте curl -I https://panel.example.com/.
already enrolled; use --force to replace the identity В каталоге состояния уже есть данные подключения. Добавьте --force после enroll или сначала удалите /var/lib/mistgate-node.
install: must run as root Запуск не от root. Выполните команду от root.
holds no identity: run mistgate-node enroll first enroll не прошёл, или install получил другой --state-dir. Повторите enroll с тем же каталогом состояния.
Админка отвечает на Получить команду установки сообщением «panel address is not configured» Панель не знает адреса для агентов: setup запускали без --public-url, а у serve нет --agent-addr. Перезапустите панель с --agent-addr panel.example.com:443.

Другие симптомы и их решения — в Решении проблем. Повседневные настройки нод — на странице Ноды.

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