Panel Naive + Hysteria2 by RIXXX

Веб-панель для быстрой установки и управления NaiveProxy и Hysteria2 на одном VPS — в 2 клика


🚀 Быстрая установка

bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/install.sh)

После установки панель будет доступна:

http://YOUR_SERVER_IP:3000

Логин по умолчанию: admin / adminсмените сразу!


🔄 Обновление существующей установки

Для применения новых патчей (улучшения, новые опции) без полной переустановки используйте update.sh:

bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/update.sh)

Что делает скрипт:

  • Применяет только новые изменения с момента последнего запуска (версионирование через /etc/rixxx-panel/version)
  • НЕ трогает существующих пользователей, пароли, домены, сертификаты, sysctl-настройки
  • В конце выводит сводку: что обновлено, что пропущено, версия до/после
  • Безопасно запускать повторно (idempotent — уже применённые миграции пропускаются)

Полезные флаги:

bash update.sh --dry-run               # показать что будет сделано, ничего не менять
bash update.sh --force                 # перепрогнать миграции даже если version совпадает
bash update.sh --expose <panel.domain> # вернуть публичный доступ к панели после SSH-only
bash update.sh --masquerade            # сменить режим маскировки (local | mirror)
bash update.sh --repair                # регенерация Caddyfile + Hy2 config из config.json
                                       # (с автобэкапом и rollback при ошибке)
bash update.sh --status                # диагностика: версия, сервисы, TLS, порты
                                       # (read-only, работает даже без root)
bash update.sh --help                  # справка

Если установка ещё не сделана, скрипт мягко завершится с подсказкой запустить install.sh.


🔒 SSH-only режим (панель только через SSH-туннель)

Это максимально защищённый режим: панель свяжется на 127.0.0.1:3000 и не будет видна из Интернета. Получить доступ можно только через SSH-туннель, что делает её невозможным сбрутить или просканировать.

Включение при установке:

При запуске install.sh после выбора способа доступа к панели вы увидите вопрос:

Сделать панель доступной только через SSH-туннель? [y/N]:

Если ответить y:

  • Панель свяжется только на 127.0.0.1 (внутри сервера).
  • Порты 3000/tcp и 8080/tcp будут закрыты на UFW (deny).
  • Если выбран режим 3 (поддомен) — site-блок поддомена не добавляется в Caddyfile (поддомен будет недоступен публично).

Доступ с локальной машины:

# 1) Открыть SSH-туннель (терминал держим открытым)
ssh -L 8080:127.0.0.1:3000 root@YOUR_SERVER_IP

# 2) В браузере на локальной машине
http://localhost:8080

Что делать, если нужно вернуть публичный доступ:

bash update.sh --expose panel.yourdomain.com

Команда:

  • Добавит site-блок panel.yourdomain.com в Caddyfile (TLS + reverse_proxy на 127.0.0.1:3000).
  • Снимет UFW-deny с портов 3000/tcp и 8080/tcp.
  • Обновит config.json: panelDomain, sshOnly=0.
  • Перезагрузит Caddy и панель.

LE-сертификат выпишется автоматически при первом обращении к домену.


🎭 Маскировка домена (masquerade)

Маскировка — это что увидит случайный посетитель домена в браузере (HTTPS) или сторонний клиент, отправивший запрос на UDP/443 без правильной аутентификации. Цель: сделать сервер похожим на обычный сайт, а не на VPN-эндпоинт.

При установке (install.sh) после ввода параметров прокси вы увидите вопрос:

🎭 Маскировка (камуфляж домена):

  1) Локальная страница «Loading» (надёжно, без внешних зависимостей)
      → Простая статичная HTML-страница, всегда работает.
  2) Зеркалирование внешнего сайта (reverse_proxy)
      → Caddy и Hy2 будут отдавать содержимое указанного URL.
      ⚠  Если сайт станет недоступен — посетители получат 502.
      → Рекомендуемые: https://www.apple.com, https://github.com, https://www.amd.com

Ваш выбор [1/2, по умолчанию 1]:

Вариант 1 — локальная страница «Loading» (по умолчанию):

  • Caddy: file_server { root /var/www/html } (статичная HTML-страница).
  • Hy2: masquerade.type: file (та же папка).
  • Плюсы: нет внешних зависимостей, всегда работает, минимальные ресурсы.
  • Минусы: при попытке скана видно что-то «нестандартное» (хотя выглядит как сайт-заглушка).

Вариант 2 — зеркалирование внешнего сайта (reverse_proxy):

  • Caddy: reverse_proxy <url> { header_up Host {upstream_hostport} }.
  • Hy2: masquerade.type: proxy, proxy.url: <url>, rewriteHost: true.
  • Плюсы: для случайного посетителя домен выглядит точно как apple.com / github.com / любой другой сайт.
  • Минусы: если upstream станет недоступен — все посетители получат 502 ошибку (но клиенты прокси продолжат работать, так как они идут через forward_proxy/QUIC).
  • Рекомендуемые сайты: стабильные крупные ресурсы (apple.com, github.com, amd.com).

Сменить маскировку на существующей установке:

bash update.sh --masquerade

Команда:

  • Спросит интерактивно режим (1=local, 2=mirror + URL).
  • Перепишет Caddyfile и /etc/hysteria/config.yaml под новый режим.
  • Обновит config.json: masqueradeMode, masqueradeUrl.
  • Reload Caddy + restart Hysteria2 + restart панели.
  • НЕ трогает: пользователей, домен, email, сертификаты.

💡 Идея проекта

На одном сервере поднимаются оба протокола одновременно:

Протокол Транспорт Порт Назначение
NaiveProxy TCP 443 Маскировка под HTTPS, HTTP/2 forward-proxy (Caddy)
Hysteria2 UDP 443 Высокоскоростной QUIC-прокси с собственным congestion

Оба работают на одном порту 443 (TCP + UDP — разные сокеты, конфликта нет). Hysteria2 использует сертификат Caddy — один домен, один сертификат, два протокола. Для внешнего наблюдателя сервер выглядит как обычный сайт на HTTPS с поддержкой HTTP/3.


📋 Требования к серверу

Поддерживаемые ОС

ОС Версия Статус
Ubuntu 24.04 LTS Рекомендуется (основная для тестов)
Ubuntu 22.04 LTS Полностью поддерживается
Ubuntu 20.04 LTS ⚠️ Работает, но ядро старое (BBR может быть медленнее)
Debian 12 (bookworm) Полностью поддерживается
Debian 11 (bullseye) Полностью поддерживается
Другие apt-based (Mint, Pop!_OS, …) ⚠️ Должны работать, но не тестировались
CentOS / RHEL / Fedora / Alpine / Arch Не поддерживаются (скрипт требует apt)

Архитектуры

Arch uname -m Статус
x86_64 x86_64 Основной случай (99% VPS)
ARM 64-bit aarch64 Oracle Cloud Free ARM, AWS Graviton — работает
ARM 32-bit armv7l Raspberry Pi 3/4 (32-бит режим)

Скрипт автоматически определяет архитектуру и скачивает соответствующие бинарники Hysteria2 / Go / Caddy. Ранее были проблемы с ARM — в текущей версии пофиксены (работает на Oracle ARM).

Прочее

  • Домен: A-запись с IP сервера (например vpn.yourdomain.com) — иначе Let's Encrypt не выдаст сертификат
  • Порты: 22/tcp (SSH), 80/tcp (ACME), 443/tcp (Naive), 443/udp (Hy2), 3000/tcp или 8080/tcp (панель)
  • RAM: минимум 1 ГБ (для сборки Caddy из исходников). Для 512 МБ используйте swap.
  • Root-доступ: обязателен
  • Ядро: 4.9+ (для BBR). В Ubuntu 20.04+ — всегда новее.

🎛️ Возможности панели

Функция Описание
🟢 Установка в 2 клика Выбери стек (Naive / Hy2 / Оба) → домен + email → готово
👥 Раздельные пользователи Отдельные списки для NaiveProxy и Hysteria2
⏱️ Срок действия ключей 1/3/7/14/30/90/180/365 дней или бессрочно. Автоматическое отключение по истечении (проверка каждые 5 мин). Продление одной кнопкой.
🇷🇺 Bypass (split-tunneling) Загрузка списка российских IP (1000+ сетей) — трафик к ним идёт напрямую, мимо VPN. Поддерживается Hysteria2 через нативный ACL.
📊 Умный дашборд Статус обоих сервисов, счётчик пользователей, IP, домен
🔗 Ссылки подключения Готовые naive+https://... и hysteria2://... ссылки
🔄 Управление сервисами Старт / стоп / рестарт Caddy и Hysteria по отдельности
Сетевой тюнинг Применение BBR + UDP-буферов одной кнопкой
🔍 Диагностика Проверка портов TCP/UDP 443, логи сервисов, статус сертификатов, содержимое Hy2-конфига
🔒 Смена пароля панели Хешированное хранение bcrypt

🔌 Клиенты для подключения

NaiveProxy

Платформа Приложение
iOS Karing
Android NekoBox / Karing
Windows Karing / NekoRay / v2rayN

Hysteria2

Платформа Приложение
iOS Karing / Shadowrocket
Android NekoBox / Karing
Windows Nekoray / v2rayN / Hiddify
macOS Karing / Hiddify
Linux hysteria CLI

Формат ссылок:

naive+https://LOGIN:PASSWORD@your.domain.com:443
hysteria2://PASSWORD@your.domain.com:443?sni=your.domain.com

⚙️ Управление

# Панель
pm2 status
pm2 logs panel-naive-hy2
pm2 restart panel-naive-hy2

# NaiveProxy (Caddy)
systemctl status caddy
systemctl restart caddy
journalctl -u caddy -f

# Hysteria2
systemctl status hysteria-server
systemctl restart hysteria-server
journalctl -u hysteria-server -f

⏱️ Срок действия ключей

При добавлении пользователя можно выбрать срок: 1 день / 3 / 7 / 14 / 30 / 90 / 180 / 365 дней или бессрочно. Панель раз в 5 минут проверяет истёкших и автоматически:

  • Для NaiveProxy — удаляет basic_auth строку из Caddyfile и перезагружает Caddy. Пользователь получает 407 Proxy Authentication Required.
  • Для Hysteria2 — удаляет запись из auth.userpass в /etc/hysteria/config.yaml и перезапускает hysteria-server. Клиент получает auth reject и перестаёт подключаться.

В таблице пользователей отображается цветной бейдж:

  • 🟢 Бессрочно — серый
  • 🟢 X дней — зелёный (>24 часа)
  • 🟡 X часов — жёлтый (<24 часа до истечения)
  • 🔴 Истёк — красный + строка перечёркнута

Кнопка « Продлить» в строке пользователя — открывает модалку для выбора нового срока от текущего момента. Бессрочный ключ можно сделать срочным и наоборот.


🇷🇺 Bypass — трафик к российским сервисам напрямую

Некоторые сайты (банки, госуслуги, маркетплейсы, банки) блокируют иностранные IP. Если весь трафик идёт через зарубежный VPN — они не откроются. Решение — пускать трафик к ним мимо VPN (split tunneling).

В панели: раздел Bypass (прямой трафик)

  1. Скачать актуальный список в JSON: например с antifilter.download или github.com/zapret-info
  2. Вставить в текстовое поле и нажать «Загрузить и включить»
  3. Форматы:
    • {"service.ru": ["1.2.3.0/24", ...], ...} — по сервисам
    • ["1.2.3.0/24", ...] — просто массив CIDR
  4. Файл ACL создаётся по пути /etc/hysteria/bypass-ru.acl, подключается в конфиг Hy2 как acl.file: ..., Hy2 перезапускается автоматически.

Ограничения

Протокол Серверный bypass Примечание
Hysteria2 Работает через ACL Настраивается один раз на сервере, для всех клиентов
NaiveProxy Не поддерживается Caddy forward_proxy Настраивается на клиенте (Karing / Happ / v2rayN поддерживают)

Для NaiveProxy клиенту нужно прописать bypass-список локально — в Karing это делается в разделе «Outbound rules», в Happ — через import конфига с rules.


🔐 Безопасность

  • Пароли пользователей панели хранятся как bcrypt-хеш
  • Пароли прокси-пользователей шифруются при сохранении на диск (AES-256-GCM)
  • CORS ограничен localhost:3000
  • Session secret генерируется при первом запуске
  • UFW включается автоматически, лишние порты закрыты

🔧 Диагностика проблем

В панели есть страница «Диагностика» (в боковом меню) — там можно:

  • Посмотреть логи Caddy и Hysteria2 без SSH
  • Проверить кто слушает порт 443/TCP и 443/UDP
  • Прочитать частые причины почему Hy2 не запускается

Если что-то не так — заходите туда первым делом.

Из командной строки: update.sh --status

Одна команда показывает всё состояние установки — версия патчей, статус сервисов (caddy/hysteria/panel), TLS-сертификаты и их сроки, открытые порты, режим маскировки и режим доступа к панели:

sudo bash update.sh --status
# или вообще без root (read-only):
bash update.sh --status

Пример вывода:

  Версия патчей:  1.3.0  (target: 1.3.0)
  NaiveProxy:     да
  Hysteria2:      да
  Доступ к панели:
    режим 3 — отдельный поддомен (Caddy + LE)
    SSH-only: выкл
  Маскировка:
    режим: mirror → https://www.apple.com
  Сервисы:
    ● caddy: active
    ● hysteria-server: active
    ● panel-naive-hy2: active
  TLS-сертификаты Caddy:
    • example.com: до Jul 27 12:34:56 2026 GMT
    • panel.example.com: до Jul 27 12:34:56 2026 GMT

Восстановление: update.sh --repair

Если что-то сломалось (например, Caddyfile повреждён ручными правками, или панель перестала отвечать), эта команда регенерирует Caddyfile и /etc/hysteria/config.yaml из config.json, не трогая пользователей, домены и сертификаты:

sudo bash update.sh --repair

Что происходит:

  1. Автобэкап в /etc/rixxx-panel/backups/YYYY-MM-DD-HHMMSS-repair/ — сохраняются Caddyfile, hysteria config, panel config, systemd-юнит. Хранятся последние 10 бэкапов, старые удаляются.
  2. Регенерация Caddyfile и Hy2 config из шаблонов на основе текущего config.json.
  3. Валидацияcaddy validate для Caddyfile, YAML-парсинг для Hy2. Если новый конфиг невалиден → автоматический rollback из бэкапа.
  4. Atomic rename временных файлов в рабочие пути (на ext4/xfs это атомарная операция).
  5. Reload сервисов: caddy, hysteria-server, панель.
  6. Smoke-testsystemctl is-active для всех сервисов.

Smoke-test после установки

install.sh теперь в самом конце автоматически проверяет, что всё работает:

  • caddy validate --config /etc/caddy/Caddyfile
  • systemctl is-active caddy / hysteria-server / panel-naive-hy2
  • curl http://127.0.0.1:3000/ (панель отвечает локально)
  • curl https://<proxy.domain>/ и https://<panel.domain>/ (TLS работает)

При обнаружении проблем выводится конкретная ошибка и подсказка: bash update.sh --repair или bash update.sh --status.


📜 История изменений

v1.4.1 — Флаг --ssh-only (PR #9)

  • 🆕 bash update.sh --ssh-only — переключение уже работающей установки в SSH-only режим одной командой, без переустановки. Симметрично существующему --expose <domain>.
  • 🛡️ Сохраняется при переключении: юзеры NaiveProxy/Hysteria2 (со всеми паролями и ссылками), домен прокси и его TLS-сертификат, режим маскировки (mirror/local), Hysteria2 config, panelDomain в config.json.
  • 🚪 Что делает: интерактивно показывает текущее состояние и подтверждение → auto_backup "ssh-only" (точка отката) → удаляет panel-блок из Caddyfile (если был) с валидацией и rollback-ом → UFW deny 8080/tcp + 3000/tcp → останавливает nginx → прописывает sshOnly=1, listenHost=127.0.0.1 в config.json → systemd Environment + PM2 delete+start с явным env (урок из PR #8) → reload Caddy → curl-проверка что панель отвечает на 127.0.0.1:3000.
  • 🔄 Симметричный откат: bash update.sh --expose <тот же panelDomain> возвращает публичный доступ.
  • 🤖 Не-интерактивный режим: bash update.sh --ssh-only --yes (для автоматизации).
  • 🔮 Защита от регрессии при выпуске ключей: backend writeCaddyfile() уже уважает cfg.sshOnly === 1 (с PR #4) — при добавлении новых Naive-юзеров panel-блок НЕ восстанавливается, так что панель надёжно остаётся скрытой.

v1.4.0 — Hotfix: SSH-only режим (PR #7)

  • 🔒 Закрыта дыра в SSH-only режиме: при ACCESS_MODE=1 + SSH_ONLY=1 финальный UFW-блок в install.sh перетирал ранний deny командой ufw allow 8080/tcp, а Nginx биндился на 0.0.0.0:8080 — панель оставалась доступной из Интернета, несмотря на LISTEN_HOST=127.0.0.1 у бэкенда. Теперь SSH_ONLY=1 принудительно переводит установку в режим прямого bind на 127.0.0.1:${INTERNAL_PORT} (без Nginx), а финальный UFW-блок проверяет SSH_ONLY первым приоритетом и наглухо закрывает 8080/tcp + 3000/tcp.
  • 🔧 Migration 1.4.0 (migrate_ssh_only_close_ports) — для уже установленных серверов с sshOnly=1: автоматически закрывает 8080/tcp и 3000/tcp в UFW (и удаляет старые allow-правила), останавливает и отключает nginx, гарантирует LISTEN_HOST=127.0.0.1 в systemd-юните и PM2-env, перезапускает панель и финально проверяет, что внешний IP не отвечает на этих портах. Применяется одной командой: bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/update.sh).
  • Контракт миграции: если sshOnly=0 — миграция no-op (легитимный публичный режим ACCESS_MODE=1 через Nginx-прокси не ломается).

v1.3.2 — Hotfix: masquerade (PR #6)

  • 🐞 update.sh --masquerade падал с Cannot find module 'js-yaml': Node-скрипт запускался из /root/, где нет node_modules. Теперь все три Node-вызова в update.sh (do_masquerade(), do_repair(), YAML-валидация в atomic write) обёрнуты в (cd "$PANEL_DIR/panel" && node -e "...") — модули резолвятся корректно.
  • 🐞 Mirror на крупных сайтах (GitHub, Apple, Cloudflare и т.д.) не работал: они блокируют reverse_proxy-запросы от чужих серверов, клиенты NaiveProxy получали 502 / EOF. В рекомендациях install.sh и update.sh --masquerade заменены примеры на статичные сайты: iana.org, ietf.org, demo.nginx.com. Дефолт при пустом вводе теперь https://www.iana.org.
  • ⚠️ Предупреждение в установщике: при выборе режима mirror теперь показывается явное сообщение про крупные сайты и риск 502/EOF — пользователи больше не будут случайно ставить github.com.

v1.3.1 — UI-хотфикс (PR #5)

  • 🆕 Динамическая версия в панели: новый эндпоинт GET /api/system/version читает /etc/rixxx-panel/version, на странице «Настройки → Информация о панели» теперь отображается актуальная версия (раньше было захардкожено 1.0.0).
  • 🆕 Подсказки в «Диагностике»: добавлен блок CLI-инструментов со ссылками на bash update.sh --status и sudo bash update.sh --repair (с примером --dry-run).
  • ⚠️ Пометка в разделе Bypass: явное предупреждение, что функция в активном тестировании — обязательно проверять на своём клиенте перед использованием в продакшне.

v1.3 — Стабильность и диагностика (PR #4)

  • 🆕 update.sh --repair — регенерация Caddyfile + Hy2 config из config.json с автобэкапом, валидацией и rollback при ошибке
  • 🆕 update.sh --status — одна команда показывает всё состояние (версия, сервисы, TLS, порты, режимы); работает без root
  • 🆕 Автобэкап в /etc/rixxx-panel/backups/ — все ключевые файлы сохраняются перед изменениями, хранятся последние 10
  • 🆕 Smoke-test в install.sh — после установки автоматически проверяется работоспособность (caddy validate, systemctl is-active, curl на домены)
  • 🐞 Атомарная защита writeCaddyfile(): запись через temp-файл → caddy validateatomic rename. На любой ошибке — автоматический rollback из .last-бэкапа. Это окончательно закрывает баг с потерей panel-блока при добавлении Naive-юзеров.
  • 🐞 Атомарная защита writeHysteriaConfig(): temp-файл + self-validate (yaml.load) + atomic rename + rollback из .last.
  • 🐞 writeCaddyfile() уважает sshOnly=1 — panel-блок не добавляется в SSH-only режиме даже при перегенерации (раньше мог восстанавливаться при добавлении юзеров).

v1.2 — Исправление параллельной работы Naive + Hy2

  • 🐞 Hy2 не запускался когда был Naive: Caddy по умолчанию занимал UDP/443 для HTTP/3 (QUIC), не давая Hy2 биндиться. Теперь при установке обоих протоколов в Caddyfile добавляется servers { protocols h1 h2 } — HTTP/3 в Caddy отключён, UDP/443 свободен для Hy2.
  • 🆕 Страница «Диагностика» в панели — логи + проверка портов
  • 🆕 Скрипт install_hysteria.sh теперь сам патчит уже установленный Caddyfile при доустановке Hy2 поверх Naive
  • 🆕 Финальные проверки в install.sh: панель отвечает на :3000, nginx слушает :8080
  • 🆕 Systemd-fallback если PM2 не запустил панель
  • 🐞 writeCaddyfile в backend теперь сохраняет директиву отключения HTTP/3 при добавлении/удалении Naive-юзеров

v1.1 — Параллельный запуск Naive + Hy2 (4 фикса)

  • Hysteria2 теперь стартует после Caddy (After=caddy.service)
  • Чтение существующего /etc/hysteria/config.yaml при изменении пользователей (раньше затирал TLS-секцию)
  • Поиск Caddy-сертификата в обоих возможных путях
  • Валидный JSON config.json (heredoc + переменные)

v1.0 — Первый релиз

  • Multi-arch Go (amd64 / arm64 / armv6l)
  • 2-кликовая установка обоих протоколов
  • Единая панель для Naive + Hy2
  • BBR + UDP-тюнинг

by RIXXX — мультипротокольная прокси-панель с удобным интерфейсом

Description
No description provided
Readme 645 KiB
Languages
Shell 51%
JavaScript 24.5%
HTML 15.3%
CSS 9.2%