Remnawave rebuild

Практическая шпаргалка: что делать по порядку, что нужно от тебя и почему логи с бэкапом устроены именно так.

С чего начать

У нас два сервера: панель и нода. Не надо поднимать всё сразу — сначала базовая безопасность на обоих, потом панель, потом нода, и только затем логи, бэкап и торренты.

Рекомендуемый порядок

  1. Базовая безопасность на обоих VPS — SSH-порт, отдельный пользователь, ключи, PermitRootLogin no, nftables, fail2ban, NetBird.
  2. Ядро — Xanmod + BBRv3, если разрешён ребут.
  3. Панель — домен, сертификат, API-токен.
  4. Нода — форк smux, профиль Xray, логи.
  5. Проверка логов — тестовый клиент, JSONL, реальный IP, экспорт БД.
  6. Бэкап — age, Telegram, тестовая расшифровка.
  7. Торренты — плагин + форк, замер покрытия.
  8. Аудит — внешний nmap, ss, nft, fail2ban-client.
Не начинай с панели. Быстрее всего увидеть, что логи реально пишутся и что в них настоящий IP клиента, можно на ноде. Панель и профиль подключим после.

Что нужно от тебя

Пароли в чат не присылай. Достаточно этого:

ЧтоЗачем
IP обоих серверов, текущий SSH-порт и пользовательПодключиться и не потерять доступ
Путь к SSH-ключу или разрешение добавить новыйВход без пароля
Домены панели / ноды / docs или «без DNS, self-signed»Сертификаты и nginx
GCore-токен и зона, если делаем DNSA-записи до ACME
Telegram bot token + chat_id каналаЕжедневный бэкап
Публичный age1...Шифрование архива
Можно ли ребутить под XanmodBBRv3
Тестовый клиент (телефон/ПК)Проверить реальное подключение

Порядок работ

1. Хост

На каждом сервере.

sudo bash initial_setup.sh \
  --admin-user remna \
  --admin-key-file /root/mykey.pub \
  --ssh-port 2222 \
  --close-ssh-22 \
  --timezone Europe/Moscow

2. Ядро

Только если можно ребутить.

sudo bash remna.sh kernel install
sudo reboot
uname -r
sysctl net.ipv4.tcp_congestion_control

3. Панель

На первом сервере.

sudo bash panel_setup.sh \
  --domain panel.example.com \
  --method http01 \
  --email admin@example.com \
  --api-init

4. Нода

На втором сервере.

sudo bash node_setup.sh \
  --domain node.example.com \
  --panel-ip 100.118.0.10 \
  --panel-url https://panel.example.com \
  --panel-token-file /root/panel.token

Зачем логи и что в них есть

Задача не «следить за пользователями», а иметь независимый журнал фактов, если инфраструктуру изымут. Xray access log пишет по каждому соединению:

ПолеСмысл
timestampКогда было соединение
sourceIP и порт клиента
destinationКуда ходил клиент
networktcp / udp
inbound / outboundЧерез какой инбаунд и куда ушло
emailID пользователя в панели

Чего в нём нет: байт, длительности сессии, факта разрыва. Это не биллинг. Трафик по пользователю и ноде берётся из БД панели:

Важно про IP. nginx стоит перед Xray. Без PROXY protocol Xray видит источник как 127.0.0.1. В шаблонах уже включена пара proxy_protocol on + sockopt.acceptProxyProtocol. Менять их нужно вместе, иначе REALITY перестанет пускать клиентов.

Ежедневный бэкап в Telegram

Схема: собрать логи и БД → зашифровать публичным ключом → порезать по 49 МБ → отправить в закрытый канал. Ночью, без участия человека.

Почему ключ, а не пароль

Пароль на сервере бесполезен: при изъятии он уезжает вместе с архивом. Поэтому age:

1. Ключ (один раз, на своём компьютере)

age-keygen -o remnawave-backup.key
# в файле будет строка: # public key: age1...

Приватный ключ remnawave-backup.key — офлайн. Потеряешь его — архивы не восстановить.

2. Токен бота (один раз, на каждом хосте)

install -m 600 /dev/null /etc/remnawave/telegram.token
printf '%s\n' '123456:ABC...' > /etc/remnawave/telegram.token

Бот должен быть админом закрытого канала с правом публикации. chat_id канала отрицательный, вида -100....

3. Установка таймера (один раз, на каждом хосте)

sudo bash backup.sh --install \
  --age-recipient 'age1...' \
  --chat-id '-1001234567890' \
  --token-file /etc/remnawave/telegram.token

Появится /usr/local/sbin/remnawave-backup и таймер на 03:30 UTC с разбросом 30 минут. Повторный запуск не создаст второй архив — стоит flock.

4. Проверка и тестовый прогон

remnawave-backup --check
remnawave-backup

--check вызывает getMe, проверяет токен и пробует зашифровать тестовую строку публичным ключом.

Что внутри архива

После успешной отправки части удаляются с сервера, остаётся SHA-256-манифест. KEEP_LOCAL_DAYS=2 в /etc/remnawave/backup.conf оставит локальную копию на два дня.

Восстановление

cat remnawave-*.part-* > archive.tar.gz.age
age -d -i remnawave-backup.key archive.tar.gz.age > archive.tar.gz
tar -xzf archive.tar.gz
cd data && sha256sum -c MANIFEST.sha256

Манифест рядом с частями лежит в /var/lib/remnawave-backup/manifests/ и проверяет сами загруженные части.

Telegram — вторая копия, а не архив доказательств. Доступ зависит от аккаунта, метаданные не контролируются. Для юридически значимого хранения нужен ещё один неизменяемый бэкап (S3 Object Lock, restic на своём сервере) и понятный срок хранения. IP-адреса — персональные данные.

Гонка sysctl / ядро

Раньше оптимизация и установка Xanmod могли идти одновременно. Теперь оба берут общий лок:

Отдельно запускать ничего не нужно — это уже в коде.

Торренты

Встроенный Torrent Blocker на официальном ядре ловит порядка 30–40%. Форк Jolymmiles расширяет именно sniffing:

Поэтому нода по умолчанию:

ghcr.io/legiz-ru/remnanode-smux:v3.4.4-26.11.1-1424

Поле core в панели оставь пустым, иначе панель подменит ядро и log.outputs перестанет работать.

Границы: MSE/зашифрованный handshake и HTTPS-трекеры по открытым байтам не видны. Хостовый DPI (vibehost-guard/nDPI) — отдельный слой с iptables, ложными срабатываниями и проверкой совместимости с nftables/Docker. Включать после живого замера, а не вслепую.

Live-тест: чек-лист

Результаты живого прогона

Проверено на двух серверах 6 ноября 2026:

ЧтоРезультат
Панель217.60.240.110, https://test1.neoradio.one → 200, сертификат до 2027-02-04
Нода2.26.255.125, https://test2.neoradio.one → 200, isConnected: true
SSH / firewallтолько 80, 443, 22022 снаружи; 2222 доступен только с IP панели
Ядро6.18.60-x64v3-xanmod1, bbr + fq на обоих
Логи/var/log/remnanode/xray.jsonl: timestamp, source (реальный IP), destination, inbound, outbound, email
Бэкапage-шифрование, Telegram topic 3, restore проверен офлайн-ключом и sha256sum -c
Торрентыплагин torrent-blocker активен; реальный BitTorrent handshake заблокирован (blocked: true, IP в nft-сете на 1 час)
NetBird (нода)подключена, 100.118.37.190/16
NetBird (панель)ожидает новый setup key: одноразовый ключ уже израсходован

Панель пока слушает 127.0.0.1:3000, а нода пускает 2222 только с публичного IP панели. После подключения панели к NetBird можно перевести --panel-ip на её адрес 100.118.x.x.

Торрент-отчёты: блокировка и nftables работают, но строка в torrent_blocker_reports у связки «панель latest + форк v3.4.4-26.11.1-1424» не появилась: панель забирает отчёты из health-ответа ноды, а этот ответ, судя по всему, не отдаёт reportsCount. На блокировку это не влияет; для отчётов в UI нужна совместимая версия панели/ноды.

Подробные docs

ФайлО чём
backup.mdПолная процедура бэкапа, ключи, Telegram, восстановление, ограничения
xray.mdXray, sniffing, Torrent Blocker, форк, PROXY protocol, nginx
certificates.mdACME, DNS-01, wildcard, раскладка сертификатов
upgrade.mdОбновления и откат
repos.mdРазбор источников и решений

Общий обзор toolkit — README.md в корне каталога.

При открытии через file:// markdown-файлы покажутся как текст. Для нормального вида запусти локальный сервер.

Как открыть локально

cd /path/to/remna/rebuild
bash docs/serve.sh
# http://127.0.0.1:8080/docs/

Или просто открой docs/index.html в браузере. Сайт полностью офлайн: без CDN, шрифтов и внешних скриптов.