REMNAWAVE REVERSE PROXY
🚀 Основные изменения
Панель, ноды, страница подписки и Xray Checker теперь умеют жить в частной mesh-сети NetBird. Служебный трафик уходит из публичного интернета, порты панели закрываются от чужих, а управление остаётся у вас. Один пункт в главном меню разворачивает сеть, переводит машины и следит за путями. Публичные адреса при этом не сгорают: запасной путь остаётся у каждой ноды, и любую службу можно вернуть на публичный путь одним пунктом меню.
🕸️ Частная сеть для всей связки
Пункт «NetBird: сеть для нод и панели». Подробности в wiki.
- Панель подключается к вашему аккаунту NetBird, облачному или собственному серверу.
- В режиме API модуль создаёт группы
rrp-…-panel,rrp-…-nodesи однонаправленные политики вместо всеобщей Default, ключи для каждой машины выпускаются одноразовые и отзываются сразу после использования. - Политика Default выключается по команде, но сначала модуль проверяет, что все нужные пути выживут, а если нет, возвращает её обратно.
- Клиент на каждой машине ставится с закреплённой версией: фоновые обновления не перезапустят его сами.
🔒 Ноды в сети
- Перевод ноды это один вопрос и пара минут: клиент ставится по SSH, путь до нового адреса проверяется из контейнера панели (TCP и TLS с проверкой MTU), и только потом адрес меняется в панели.
- Публичный порт 2222 остаётся открытым как запасной.
- Аварийный возврат всех нод на публичные адреса одной командой, сам NetBird не трогается.
- Прерванный перевод продолжается с места остановки или откатывается назад.
- Новую ноду можно развернуть сразу в сети: панель будет ходить на неё по сетевому адресу с первой секунды, а публичный путь останется запасным.
📄 Страница подписки и Xray Checker
- Сервер подписки переключается на панель через отдельный порт из закрытого диапазона, compose переписывается на сетевой адрес, куки и auth-гейты уходят.
- Возврат на публичный путь тем же пунктом: конфигурация восстанавливается из снимка, кука доступа обновляется под текущую панель, путь проверяется живьём.
- Xray Checker работает в сети одним контейнером: подписка только через сеть, метрики и страница мониторинга под паролем и только для машин сети.
- Возврат чекера восстанавливает публичный вариант из снимка, а без снимка честно говорит, что публичный чекер ставится своим пунктом.
🛟 Спокойный выход
- Отключение обратимое: клиент останавливается, установка и состояние остаются на месте.
- Пока в сети живёт хотя бы одна служба, модуль не даст погасить панель и подскажет порядок возврата.
- Полное удаление чистит клиенты на нодах по SSH, записи в аккаунте и состояние модуля, а группы и политики остаются на будущее.
- Диагностика сверяет записанные адреса с фактическими и показывает состояние клиента, настроек и путей.
🔧 Исправления
- Синхронизация сертификатов на ноды сверяла только срок сертификата панели: до второй и последующих нод продления не доезжали вовсе, а первая получала их с опозданием в месяц каждый цикл. Теперь сравниваются отпечатки sha256 сертификата панели и самой ноды.
- Крон-скрипт синхронизации подтягивал модуль SSH из кэша модулей, и обновление основного скрипта оставляло его навсегда отчитываться успехом. Теперь в скрипте живёт собственная встроенная копия модуля.
- Обновлятор RU-списков перегенерируется по маркеру версии, а дословные переводы строк в его curl-вызовах раньше отправляли токен панели постороннему хосту.
- Пресет закрытых адресов egress при повторном применении терял приватные подсети из блок-листа, старый набор теперь вычитается до слияния. Источники моста в ufw хранятся построчно, и устаревшие правила больше не остаются на машине выхода.
- На свежих VPS первая загрузка шла вместе с unattended-upgrades, который подолгу держал apt, и установка падала на первом же пакете. Теперь скрипт ждёт освобождения блокировки сам, а зависшие обновления останавливает и докатывает установку.
🔐 Безопасность
Заголовки API-запросов панели передаются через временный файл: раньше токен светился в ps на сервере. Выпуск ограниченного токена при неудаче падает с понятной ошибкой, а не подменяется токеном с полными правами. Публичный адрес определяется по https с проверкой ответа: страницы ошибок с ifconfig.me раньше попадали прямо в корневые команды на нодах. Compose страницы подписки пишется с правами доступа только владельцу в обоих вариантах установки, а снос скрипта убирает его крон-задачи, отзывает ключи на управляемых машинах и токен панели вместо осиротевших следов.
⚙️ Дисциплина и честные итоги
- SSH-вызовы без передачи данных идут с
-n: такой вызов внутри цикла чтения раньше съедал оставшиеся строки, и следующие вопросы упирались в конец ввода. - Конец ввода в меню возвращает управление вместо бесконечной рекурсии, подменю IPv6 и сертификатов перестали открывать главное меню дважды.
- Загрузчик модулей проверяет код возврата, а новые файлы скачиваются во временные и проходят проверку синтаксиса до замены кэша.
- Неудачная переустановка ноды поднимает старые контейнеры обратно, а не оставляет её лежать.
- Проверка здоровья страницы подписки требует и контейнер приложения: доступность https сама по себе доказывает лишь nginx, TLS и DNS.
🧱 Файрвол и SSH
Правила ufw применяются по одному с проверкой каждого: склеенные цепочки рапортовали только последний код возврата, и включение файрвола могло пройти при неудачном разрешении SSH. На каждый хост хранится ровно одна SSH-цель, поля сбрасываются при промахе поиска, отзыв последней цели не трогает known_hosts остальных, для законной смены ключа хоста есть отдельный пункт. У всех SSH-вызовов настроен keepalive, а выбор ноды показывает публичный адрес и больше не молча берёт первую при пустом вводе.
🔁 Установка страницы подписки
Сбор параметров, рендер и применение разделены: рендеры пишут в stdout, compose собирается одним документом, отказы возвращают управление, а не завершают процесс. Для автоматических установок есть режим без вопросов через переменные окружения, адрес панели можно переопределить, секреты пишутся с правами доступа только владельцу, а проверка здоровья требует контейнер приложения.
⬆️ Обновление
bash <(curl -Ls https://raw.githubusercontent.com/eGamesAPI/remnawave-reverse-proxy/refs/heads/main/install_remnawave.sh)
📖 Wiki
https://wiki.egam.es/ · статья модуля: https://wiki.egam.es/ru/configuration/netbird-module/