Files
domen_hydra/README.md

473 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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) — вопросы, идеи, обратная связь