Remnawave rebuild
Практическая шпаргалка: что делать по порядку, что нужно от тебя и почему логи с бэкапом устроены именно так.
С чего начать
У нас два сервера: панель и нода. Не надо поднимать всё сразу — сначала базовая безопасность на обоих, потом панель, потом нода, и только затем логи, бэкап и торренты.
Рекомендуемый порядок
- Базовая безопасность на обоих VPS — SSH-порт, отдельный пользователь, ключи,
PermitRootLogin no, nftables, fail2ban, NetBird. - Ядро — Xanmod + BBRv3, если разрешён ребут.
- Панель — домен, сертификат, API-токен.
- Нода — форк smux, профиль Xray, логи.
- Проверка логов — тестовый клиент, JSONL, реальный IP, экспорт БД.
- Бэкап —
age, Telegram, тестовая расшифровка. - Торренты — плагин + форк, замер покрытия.
- Аудит — внешний
nmap,ss,nft,fail2ban-client.
Что нужно от тебя
Пароли в чат не присылай. Достаточно этого:
| Что | Зачем |
|---|---|
| IP обоих серверов, текущий SSH-порт и пользователь | Подключиться и не потерять доступ |
| Путь к SSH-ключу или разрешение добавить новый | Вход без пароля |
| Домены панели / ноды / docs или «без DNS, self-signed» | Сертификаты и nginx |
| GCore-токен и зона, если делаем DNS | A-записи до ACME |
| Telegram bot token + chat_id канала | Ежедневный бэкап |
Публичный age1... | Шифрование архива |
| Можно ли ребутить под Xanmod | BBRv3 |
| Тестовый клиент (телефон/ПК) | Проверить реальное подключение |
Порядок работ
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 | Когда было соединение |
source | IP и порт клиента |
destination | Куда ходил клиент |
network | tcp / udp |
inbound / outbound | Через какой инбаунд и куда ушло |
email | ID пользователя в панели |
Чего в нём нет: байт, длительности сессии, факта разрыва. Это не биллинг. Трафик по пользователю и ноде берётся из БД панели:
nodes_user_usage_history— трафик пользователя по ноде и дню;nodes_usage_history— upload/download по ноде по часам;user_traffic— всего использовано, первый вход, последняя активность;user_subscription_request_history— когда и с какого IP запрашивали подписку;hwid_user_devices— устройства и IP;torrent_blocker_reports— отчёты блокировщика.
127.0.0.1. В шаблонах уже включена пара proxy_protocol on + sockopt.acceptProxyProtocol. Менять их нужно вместе, иначе REALITY перестанет пускать клиентов.
Ежедневный бэкап в Telegram
Схема: собрать логи и БД → зашифровать публичным ключом → порезать по 49 МБ → отправить в закрытый канал. Ночью, без участия человека.
Почему ключ, а не пароль
Пароль на сервере бесполезен: при изъятии он уезжает вместе с архивом. Поэтому age:
- на твоём компьютере создаётся пара ключей;
- на сервер попадает только публичный
age1...; - приватный ключ остаётся офлайн, в двух местах;
- сервер шифрует, но не может расшифровать.
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, проверяет токен и пробует зашифровать тестовую строку публичным ключом.
Что внутри архива
- на ноде:
xray.jsonlи ротированные*.jsonl.*за 2 суток; - на панели:
panel.sqlи читаемые CSV (трафик, подписки, устройства, торренты); README.txtс командой восстановления;MANIFEST.sha256по файлам внутри.
После успешной отправки части удаляются с сервера, остаётся 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/ и проверяет сами загруженные части.
Гонка sysctl / ядро
Раньше оптимизация и установка Xanmod могли идти одновременно. Теперь оба берут общий лок:
/run/remnawave-kernel.lock;- отдельный файловый дескриптор, чтобы не закрыть внешний
lock initial-setupна FD 9; - ожидание до 600 секунд, а не падение;
- лок берут
setup_sysctl,xanmod_install,xanmod_rollbackи A/B-смена профиля.
Отдельно запускать ничего не нужно — это уже в коде.
Торренты
Встроенный Torrent Blocker на официальном ядре ловит порядка 30–40%. Форк Jolymmiles расширяет именно sniffing:
- с
v26.8.21— BitTorrent TCP handshake, uTP, DHT, UDP-трекеры (BEP 15); v26.8.25— жёстче UDP-правила, меньше ложных срабатываний на DNS/STUN/TURN/игры.
Поэтому нода по умолчанию:
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-тест: чек-лист
- SSH слушает только новый порт, 22 закрыт в firewall.
- Вход под
remnaпо ключу, root login запрещён. nft list ruleset— снаружи открыты только 443 и SSH (порт ноды — только с IP панели).fail2ban-client status sshd— jail на новом порту.uname -rсодержитxanmod,tcp_congestion_control=bbr.- Панель открывается по HTTPS, API-токен работает.
- Нода подключена, профиль выбран,
coreпустой. - Тестовый клиент подключается, в
xray.jsonlпоявляется запись. - В
source— реальный IP клиента, не127.0.0.1. - Экспорт БД содержит трафик пользователя за день.
- Архив ушёл в Telegram, скачался и расшифровался офлайн-ключом.
- Тестовый торрент: есть отчёт в панели и блокировка пира.
- Внешний
nmapне видит лишних портов.
Результаты живого прогона
Проверено на двух серверах 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.md | Xray, sniffing, Torrent Blocker, форк, PROXY protocol, nginx |
| certificates.md | ACME, 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, шрифтов и внешних скриптов.