# HydraRoute Manager Веб-панель для управления **HydraRoute Neo** на роутерах Keenetic. Редактируешь списки доменов и IP в браузере — одной кнопкой всё разъезжается по роутерам. Плюс встроенный WireGuard-генератор и мастер обратного туннеля для роутеров без белого IP. > **Поддержать проект:** [Boosty](https://boosty.to/andrey27/donate) · [Ozon СБП](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798) · Telegram: [@Iot_andrey](https://t.me/Iot_andrey) ![Превью веб-интерфейса](docs/preview.png) --- ## Что это и зачем HydraRoute Neo — плагин для Keenetic, который маршрутизирует трафик по доменам и IP. YouTube и Netflix — через VPN, всё остальное — напрямую. Конфиг хранится в двух файлах на роутере: `domain.conf` и `ip.list`. Редактировать их напрямую неудобно, а если роутеров несколько — приходится делать всё вручную на каждом. **Этот проект решает проблему:** ``` ┌──────────────────────────────┐ │ Браузер → http://VPS:8000 │ ← ты работаешь здесь └──────────────┬───────────────┘ │ ┌──────────────▼───────────────┐ │ HydraRoute Manager на VPS │ ← этот сервис └──────────┬──────────┬────────┘ │ SSH │ SSH ┌──────▼──┐ ┌────▼──────┐ │Роутер 1 │ │ Роутер 2 │ └─────────┘ └───────────┘ ``` **Что умеет:** - Редактировать группы доменов и IP через браузер - Включать/выключать группы одним переключателем - Отправлять конфиг сразу на все роутеры одной кнопкой - Снимать конфиг с роутера и подставлять в редактор - Генерировать WireGuard VPN: сервер на VPS + клиенты на роутерах - Для роутеров **без белого IP** — мастер настройки обратного SSH-туннеля с автовосстановлением **Требования:** - Роутер Keenetic с установленным HydraRoute Neo и Entware - VPS с белым IP (сюда устанавливается панель) - Белый IP на роутере **или** настроенный обратный тоннель (раздел 3) --- ## 1. Быстрая установка Все команды выполняются на **VPS**. ### Шаг 1 — установка ```bash cd /opt git clone https://github.com/andrey271192/domen_hydra.git /opt/domen-hydra cd /opt/domen-hydra sudo bash server/install.sh ``` Установщик создаст Python-окружение и зарегистрирует systemd-сервис `hydra-manager`. > Если видишь `Unable to read current working directory` — сначала выполни `cd /opt`, потом повтори. ### Шаг 2 — настройка паролей ```bash nano /opt/domen-hydra/server/.env ``` Минимум что нужно поменять: ```env ADMIN_PASSWORD=твой-пароль-для-панели SSH_USER=root SSH_PASS=keenetic ``` Если планируешь **туннель** (для роутеров без белого IP): ```env VPS_SSH_HOST=IP_или_домен_VPS ``` ### Шаг 3 — запуск ```bash sudo systemctl restart hydra-manager ``` ### Шаг 4 — открой панель ``` http://IP_ТВОЕГО_VPS:8000 ``` ### Обновление ```bash cd /opt/domen-hydra && git pull && sudo systemctl restart hydra-manager ``` ### Удаление ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/domen_hydra/main/server/uninstall.sh | sudo bash ``` --- ## 2. Домены и IP ### Вкладка «Конфигурация» Карточки с группами. У каждой группы: - **Имя** — например `youtube` или `ru-geoip` - **Политика** — `HydraRoute` (через VPN), `RU` (локально) и т.д. - **Список** — домены или IP/CIDR, по одному на строку Нажми **«✏️»** → редактируй → **«💾 Сохранить»**. ### Форматы файлов **domain.conf:** ``` ##youtube youtube.com,youtu.be,googlevideo.com/HydraRoute ##avito avito.ru,ozon.ru/RU ``` **ip.list:** ``` ##geoip:ru /RU geoip:ru ``` ### Отправка на роутеры - **«📡 Обновить все роутеры»** — отправляет конфиг на все роутеры и делает `neo restart` - **«📡 На роутер»** на карточке роутера — только на один конкретный ### Импорт с роутера Вкладка «Роутеры» → **«⬇ С роутера»** — файлы подтянутся автоматически. Или вручную на роутере: ```sh cat /opt/etc/HydraRoute/domain.conf cat /opt/etc/HydraRoute/ip.list ``` ### Автообновление на роутере ```bash export SERVER_URL="http://IP_ТВОЕГО_VPS:8000" \ && curl -fsSL https://raw.githubusercontent.com/andrey271192/domen_hydra/main/install_router.sh | sh ``` --- ## 3. Обратный туннель — для роутеров без белого IP Если провайдер выдаёт **серый IP**, VPS не может сам достучаться до роутера. Роутер сам открывает зашифрованное SSH-соединение на VPS, и весь обмен идёт через него. ``` Роутер (серый IP) ──SSH──▶ VPS :20100 │ VPS → hydra-manager ────────────▶│──▶ SSH роутера (порт 22) ``` ### Что понадобится - Entware на роутере (раздел 3.1) - `VPS_SSH_HOST` в `.env` на VPS ### 3.1 Установка Entware на роутер С KeeneticOS 4.2+ — через браузер: открой `192.168.1.1/a` и следуй инструкциям. Или через SSH (логин `root`, пароль `keenetic`, порт 22): ```sh # MT7628/MT7621 (mipsel): opkg disk storage:/ https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz # MT7622/MT7981/MT7988 (aarch64): opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz ``` Дождись окончания (~2 мин), проверь: `opkg update` должен отработать без ошибок. ### 3.2 Настройка **На VPS:** ```bash nano /opt/domen-hydra/server/.env # Добавь: VPS_SSH_HOST=IP_или_домен_VPS VPS_SSH_PORT=22 VPS_SSH_USER=root sudo systemctl restart hydra-manager ``` **В панели:** Вкладка «Роутеры» → кнопка **«⇄ Тоннель»** напротив нужного роутера → скопируй команду → выполни на **роутере** (не на VPS!). > Как отличить терминал роутера от VPS: > - Роутер: `~ #` или `(none) ~ #` > - VPS: `root@имя-сервера:~#` Скрипт автоматически: 1. Установит `autossh` через opkg 2. Запишет SSH-ключ 3. Создаст скрипт туннеля и настроит автозапуск 4. Добавит watchdog в cron (перезапуск раз в минуту если упал) 5. Запустит туннель В конце увидишь: ``` === OK === Тоннель: localhost:22 (роутер) -> VPS:20100 ``` После этого нажми **«⟳ Проверить связь»** в панели. ### 3.3 Диагностика туннеля **На роутере:** ```sh # Смотреть лог: cat /tmp/hydra_tun.log # Перезапустить вручную: /opt/etc/init.d/S99hydra_tun restart # Проверить что autossh жив: ps | grep autossh ``` **На VPS:** ```bash # Проверить что туннель слушает: ss -tlnp | grep 20100 # Если порт занят старым соединением — освободить: fuser -k 20100/tcp ``` --- ## 4. WireGuard VPN Вкладка **«🔒 WireGuard VPN»** — генерирует WireGuard-сервер на VPS и клиентские конфиги для роутеров. ### Как работает ``` Роутер ──── WireGuard ────▶ VPS (wg0, порт 51820) шифрованный туннель ``` В отличие от туннеля (только управление), WireGuard шифрует весь трафик и может использоваться как VPN для маршрутизации через него. ### Шаг 1 — инициализация сервера Нажми **«⚙ Инициализировать сервер»** — установится WireGuard на VPS, сгенерируются ключи, поднимется `wg0`. ### Шаг 2 — добавь роутер Нажми **«+ В VPN»** напротив нужного роутера — сгенерируются ключи и IP для этого роутера. ### Шаг 3 — установи на роутер **Вариант А (автоматически):** Нажми **«📡 Установить на роутер»** — скрипт зайдёт по SSH и попытается настроить WireGuard через Keenetic RCI. Если получится, интерфейс появится в Keenetic UI. **Вариант Б (вручную через файл):** 1. Нажми **«📄 Конфиг»** → **«⬇ Скачать .conf»** 2. В Keenetic: **Интернет → Другие подключения → WireGuard → Загрузить из файла** 3. Укажи адрес VPS и порт `51820` в настройках пира После добавления в Keenetic — настрой политику маршрутизации: **Интернет → Приоритеты подключений**. ### Удаление с роутера Кнопка **«🗑 Снести с роутера»** — удаляет все файлы через SSH. Нативные WireGuard-интерфейсы в Keenetic UI нужно удалить вручную: **Интернет → Другие подключения → WireGuard → Удалить подключение**. --- ## 5. Логины и пароли Здесь два разных набора учётных данных — не перепутай. ### Пароль веб-панели (`ADMIN_PASSWORD`) Пароль для входа на `http://VPS:8000`. Задаётся в `server/.env`. Никак не связан с роутерами. ### SSH-пароль роутера (`SSH_PASS`) Пароль для SSH на роутер (`root` / `keenetic` по умолчанию). - **Общий для всех** — задаётся в `server/.env`: `SSH_PASS=keenetic` - **Индивидуальный** — поле «SSH пароль» при добавлении роутера (перекрывает глобальный) > Поле **IP** — адрес для SSH (LAN-адрес, белый IP или DDNS), **не** веб-ссылка KeenDNS. Если случайно вставил `https://...` — сервис автоматически извлечёт хост. ### SSH-ключи для туннеля Ничего делать не нужно — ключи генерируются на VPS автоматически. Если ты удалил ключ вручную — просто нажми «⇄ Тоннель» снова, ключ перезапишется в `authorized_keys`. --- ## 6. Частые ошибки и решения ### Туннель: `ssh exited with error status 255; restarting ssh` **Причина:** autossh не может подключиться к VPS. Обычно это происходит сразу после переустановки туннеля — старый autossh запущен со старыми параметрами. **Решение:** ```sh # На роутере — убить старый процесс и перезапустить: killall autossh sleep 1 /opt/etc/init.d/S99hydra_tun start ``` Если `S99hydra_tun` не найден — нажми «⇄ Тоннель» и запусти команду заново. --- ### Туннель: `Connection timed out` или `Connection refused` при проверке связи **Причина:** Порт 20100 на VPS занят старым зависшим SSH-соединением, или туннель ещё не установился. **Решение на VPS:** ```bash # Проверить что слушает: ss -tlnp | grep 20100 # Освободить порт: fuser -k 20100/tcp ``` После этого нажми «Тест» в панели — autossh переподключится автоматически. > Начиная с последней версии, при нажатии «⇄ Тоннель» сервер сам освобождает занятый порт. --- ### Туннель: `curl: (22) The requested URL returned error: 403` **Причина:** Токен установки туннеля истёк (действует 10 минут) или был скопирован с переносом строки внутри. **Решение:** Нажми «⇄ Тоннель» снова → скопируй новую команду → выполни целиком одной строкой. Не разбивай на части и не переменные. --- ### WireGuard: `Auth response:` пустой, RCI не работает **Причина:** Keenetic слушает на LAN IP роутера (например `192.168.88.1`), а не на `localhost`. Скрипт автоматически перебирает все локальные адреса. **Если автодеплой не сработал** — используй ручной способ: 1. «📄 Конфиг» → «⬇ Скачать .conf» 2. Keenetic: **Интернет → Другие подключения → WireGuard → Загрузить из файла** --- ### WireGuard: интерфейс создался как `nwg50` но не виден в Keenetic UI **Причина:** Fallback-метод создаёт интерфейс через `ip link`, который не регистрируется в Keenetic конфиге. **Решение:** Импортируй конфиг через UI (см. выше). Интерфейс появится нативно и будет виден в «Приоритеты подключений». --- ### `Unit hydra-manager.service not found` **Причина:** `server/install.sh` не дошёл до конца. **Решение:** ```bash cd /opt && sudo bash /opt/domen-hydra/server/install.sh ``` --- ### `нет IP и нет тоннеля` при обновлении роутеров **Причина:** Роутер добавлен без IP и без настроенного туннеля. **Решение:** Укажи IP роутера или настрой туннель (кнопка «⇄» напротив роутера). --- ### `neo restart` завершается с ошибкой **Причина:** HydraRoute Neo не установлен. **Проверка:** ```sh opkg list-installed | grep hydraroute ``` --- ### Панель не открывается (`http://VPS:8000`) ```bash sudo ufw allow 8000/tcp ``` --- ## 7. Полезное **SSH на роутер:** ``` Адрес: 192.168.1.1 Логин: root Пароль: keenetic Порт: 22 ``` **Управление сервисом на VPS:** ```bash sudo systemctl status hydra-manager sudo systemctl restart hydra-manager sudo journalctl -u hydra-manager -n 50 ``` **Очистить роутер от всего что ставил сервер:** ```sh killall autossh 2>/dev/null; \ /opt/etc/init.d/S50hydravpn stop 2>/dev/null; \ rm -f /opt/etc/init.d/S99hydra_tun /opt/etc/init.d/S50hydravpn \ /opt/bin/hydra_tun /opt/etc/hydra_tk \ /opt/etc/wireguard/wg0.conf /opt/etc/wireguard/wg0.key; \ ( crontab -l 2>/dev/null | grep -v 'S99hydra_tun' ) | crontab -; \ for i in $(seq 50 70); do ip link show nwg$i >/dev/null 2>&1 && ip link delete nwg$i; done; \ echo "=== Готово ===" ``` **Прямые ссылки для роутера (cron-обновление):** ``` http://VPS:8000/hydra/domain.conf http://VPS:8000/hydra/ip.list http://VPS:8000/hydra/version ``` **Проверить активные туннели:** ```bash ss -tlnp | grep 2010 ``` --- ## Связанные проекты - [keenetic-dns-routes](https://github.com/andrey271192/keenetic-dns-routes) — встроенная DNS-маршрутизация без Neo - [keenetic-unified](https://github.com/andrey271192/keenetic-unified) — Neo + дашборд + мониторинг - [Keenetic SSH](https://github.com/andrey271192/Keenetic_SSH) — прямой SSH (нужен белый IP) --- ## Поддержать проект Если проект оказался полезным — буду рад поддержке. Это помогает развивать и поддерживать его дальше. - [Boosty](https://boosty.to/andrey27/donate) - [Ozon СБП](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798) - Telegram: [@Iot_andrey](https://t.me/Iot_andrey) — вопросы, идеи, обратная связь