mirror of
https://github.com/andrey271192/keenetic-dns-routes.git
synced 2026-09-20 14:42:01 +00:00
docs: полная переработка README — туннель, логины/пароли, ошибки, советы
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
534
README.md
534
README.md
@@ -1,142 +1,474 @@
|
|||||||
# Keenetic DNS Routes
|
# Keenetic DNS Routes
|
||||||
|
|
||||||
Мини-сервис для роутеров **без HydraRoute Neo**: централизованное редактирование списков **US / RU** (домены и IP/CIDR, по одной строке) и применение на роутеры через **NDM RCI** — те же `object-group fqdn` и `dns-proxy route`, что создаёт веб-интерфейс «Маршруты DNS» ([документация Keenetic](https://support.keenetic.com/carrier/kn-1711/en/51150-dns-based-routes.html)).
|
Веб-панель для управления списками DNS-маршрутов на роутерах Keenetic — без Neo, без прямого SSH, через встроенный RCI API.
|
||||||
|
|
||||||
С **Keenetic Unified** и **domen_hydra** не смешивается: другой порт (**8001**), другие роутеры в своём списке, отдельный `data/store.json`.
|
> **Поддержать проект:** [Boosty](https://boosty.to/andrey27/donate) · [СБП / Ozon Bank](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798) · Telegram: [@Iot_andrey](https://t.me/Iot_andrey)
|
||||||
|
|
||||||
Логика синхронизации списков с роутером совместима с подходом [gokeenapi](https://github.com/Noksa/gokeenapi) (`GET /rci/object-group/fqdn`, `GET /rci/dns-proxy/route`, `POST /rci/` с массивом `{"parse":"…"}`).
|
---
|
||||||
|
|
||||||
## Важно: здесь не SSH — и отличие от «белого» IP
|
## 1. Что это за проект
|
||||||
|
|
||||||
Этот сервис **не подключается по SSH** к роутеру: настройки применяются через **NDM RCI по KeenDNS HTTP Proxy** (см. блок **«Требования»** ниже) — модель доступа, которую Keenetic описывает для работы через облако **без** прямого Telnet/SSH.
|
Роутеры Keenetic умеют направлять отдельные сайты через VPN-туннель — через встроенную функцию **«Маршруты DNS»** (DNS-based routes). Например: youtube.com и netflix.com — через VPN, всё остальное — напрямую.
|
||||||
|
|
||||||
Проекты **[Keenetic Unified](https://github.com/andrey271192/keenetic-unified)**, **[domen_hydra](https://github.com/andrey271192/domen_hydra)** и **[Keenetic SSH](https://github.com/andrey271192/Keenetic_SSH)** для управления с VPS используют **прямой SSH** на WAN; для них нужен **публичный («белый») IPv4** или иной **прямой** доступ к порту SSH. В сценарии KeenDNS **«только облако»**, когда по документации Keenetic доступна **только веб-морда** по HTTP/HTTPS на заданных портах, а **SSH через облако не работает**, — **эти** проекты к роутеру по SSH **не подключатся**; **keenetic-dns-routes** при корректно настроенном HTTP Proxy может продолжать работать.
|
Проблема: добавлять домены по одному через веб-интерфейс роутера — неудобно. Если у тебя несколько роутеров — в разы неудобнее.
|
||||||
|
|
||||||
Сводная таблица и формулировка производителя про облако vs SSH: [Keenetic Unified — README](https://github.com/andrey271192/keenetic-unified/blob/main/README.md#white-ip-wan-ssh).
|
**Этот проект решает проблему:** устанавливаешь один раз на сервер (VPS), открываешь браузер, вставляешь/правишь список доменов, нажимаешь «Применить» — и списки одновременно обновляются на всех твоих роутерах.
|
||||||
|
|
||||||
## Требования
|
```
|
||||||
|
┌───────────────────────────────┐
|
||||||
- KeeneticOS **≥ 5.0.1** (DNS-based routes).
|
│ Браузер → http://VPS:8001 │ ← ты работаешь здесь
|
||||||
- Доступ к RCI с VPS: **KeenDNS** + **HTTP Proxy** для API (четвёртый уровень `rci.…`, порт **79**): [инструкция Keenetic](https://support.keenetic.com/hero/kn-1012/en/55035-using-api-methods-through-the-http-proxy-service.html).
|
└──────────────┬────────────────┘
|
||||||
- Пользователю роутера выданы права на **HTTP Proxy**. Учётка API: по умолчанию **`KEENETIC_*` в `.env`**, либо у каждого роутера свои поля / один раз URL `http(s)://логин:пароль@хост:порт` (при сохранении логин/пароль переносятся в поля).
|
│ API
|
||||||
|
┌──────────────▼────────────────┐
|
||||||
> Entware/SSH **не требуется** для `keenetic-dns-routes` (здесь всё через RCI по HTTP Proxy), но на практике часто нужно для обслуживания роутера. Ниже — шпаргалка.
|
│ keenetic-dns-routes на VPS │ ← этот сервис
|
||||||
|
└──────────┬──────────┬─────────┘
|
||||||
## Quickstart
|
│ RCI │ RCI
|
||||||
|
┌──────▼──┐ ┌────▼──────┐
|
||||||
1) На VPS поставь сервис (раздел “Установка (Ubuntu)” ниже).
|
│Роутер 1 │ │ Роутер 2 │ ← роутеры дома
|
||||||
2) Открой веб‑интерфейс: `http://IP_СЕРВЕРА:8001`
|
└─────────┘ └───────────┘
|
||||||
3) В Keenetic включи **KeenDNS + HTTP Proxy для API** (порт `79`) и выдай права пользователю (см. требование выше).
|
|
||||||
4) В веб‑панели добавь роутер (base URL KeenDNS HTTP Proxy), нажми **Сканировать интерфейсы**, заполни списки и нажми **Применить**.
|
|
||||||
|
|
||||||
### 📦 Установка Entware на Keenetic
|
|
||||||
|
|
||||||
━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
⚠️ Определи свою архитектуру
|
|
||||||
- Mipsel — роутеры на чипе MT7628/MT7621
|
|
||||||
- Aarch64 — роутеры на чипе MT7622/MT7981/MT7988 (ARM)
|
|
||||||
━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
💡 Совет
|
|
||||||
Начиная с KeeneticOS 4.2 Entware можно установить прямо через браузер — просто открой `192.168.1.1/a` и следуй инструкции.
|
|
||||||
━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
🚀 Установка онлайн — одной командой
|
|
||||||
|
|
||||||
🔵 Mipsel (MT7628/MT7621)
|
|
||||||
```sh
|
|
||||||
opkg disk storage:/ https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
|
|
||||||
```
|
```
|
||||||
|
|
||||||
🟢 Aarch64 (MT7622/MT7981/MT7988)
|
**Что умеет:**
|
||||||
```sh
|
- Два независимых списка доменов/IP: **US** (под VPN) и **RU** (локальный трафик, если нужен второй туннель).
|
||||||
opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz
|
- Применяет списки сразу на несколько роутеров одной кнопкой.
|
||||||
```
|
- Для роутеров **без белого IP** (за провайдерским NAT) — встроенный мастер настройки обратного туннеля.
|
||||||
|
- Не требует Neo / HydraRoute — только встроенная DNS-маршрутизация KeeneticOS.
|
||||||
|
|
||||||
⏳ Дождись окончания установки — это займёт пару минут. После этого Entware готов к работе.
|
**Требования к роутеру:**
|
||||||
|
- KeeneticOS **5.0.1** или новее.
|
||||||
|
- Включены: **KeenDNS** + **HTTP Proxy для API** (порт 79).
|
||||||
|
- У пользователя роутера есть права на HTTP Proxy.
|
||||||
|
|
||||||
🔌 Подключение по SSH
|
---
|
||||||
📋 Данные для входа
|
|
||||||
- Логин: `root`
|
|
||||||
- Пароль: `keenetic`
|
|
||||||
- Порт: `22` (если вы не меняли порт SSH вручную)
|
|
||||||
|
|
||||||
## Частые ошибки (и решения)
|
## 2. Быстрая установка
|
||||||
|
|
||||||
### `Connection refused` / не применяются правила через KeenDNS HTTP Proxy
|
Вставляй команды по одной на сервере (VPS), где будет работать панель.
|
||||||
|
|
||||||
- Проверь, что включён **HTTP Proxy для API** (уровень `rci...`), обычно порт `79`.
|
### Шаг 1 — клонируй и запусти установщик
|
||||||
- Проверь, что у пользователя Keenetic есть права на HTTP Proxy.
|
|
||||||
- Если ходишь к роутеру через WireGuard (`wg0`) и получаешь `Connection refused`, возможно сервис слушает только LAN‑IP.
|
|
||||||
Решение: DNAT `wg0:<порт> → LAN_IP:<порт>` (можно автоматизировать через `keenetic_ssh-web/tunnel` с `--dnat 79`).
|
|
||||||
|
|
||||||
## Установка (Ubuntu)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/andrey271192/keenetic-dns-routes.git /opt/keenetic-dns-routes
|
git clone https://github.com/andrey271192/keenetic-dns-routes.git /opt/keenetic-dns-routes
|
||||||
cd /opt/keenetic-dns-routes
|
cd /opt/keenetic-dns-routes
|
||||||
sudo bash install.sh
|
sudo bash install.sh
|
||||||
nano .env # ADMIN_PASSWORD + при желании KEENETIC_LOGIN / KEENETIC_PASSWORD (дефолт для роутеров без своих полей)
|
```
|
||||||
|
|
||||||
|
Установщик сам создаст Python-окружение, пропишет systemd-сервис и запустит его.
|
||||||
|
|
||||||
|
### Шаг 2 — задай пароль и адрес VPS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano /opt/keenetic-dns-routes/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
Минимум что нужно поменять:
|
||||||
|
|
||||||
|
```
|
||||||
|
ADMIN_PASSWORD=твой-пароль-для-панели
|
||||||
|
|
||||||
|
# Если у всех роутеров одинаковый логин/пароль Keenetic:
|
||||||
|
KEENETIC_LOGIN=admin
|
||||||
|
KEENETIC_PASSWORD=пароль-роутера
|
||||||
|
```
|
||||||
|
|
||||||
|
Если планируешь использовать **туннель** (для роутеров без белого IP) — добавь сюда же:
|
||||||
|
|
||||||
|
```
|
||||||
|
VPS_SSH_HOST=IP_или_домен_твоего_VPS
|
||||||
|
```
|
||||||
|
|
||||||
|
Остальные поля туннеля — см. раздел 3.
|
||||||
|
|
||||||
|
### Шаг 3 — перезапусти сервис
|
||||||
|
|
||||||
|
```bash
|
||||||
sudo systemctl restart keenetic-dns-routes
|
sudo systemctl restart keenetic-dns-routes
|
||||||
```
|
```
|
||||||
|
|
||||||
Интерфейс: `http://IP_СЕРВЕРА:8001`
|
### Шаг 4 — открой панель
|
||||||
|
|
||||||
## Настройка
|
```
|
||||||
|
http://IP_ТВОЕГО_VPS:8001
|
||||||
|
```
|
||||||
|
|
||||||
1. В **Interface ID** для US/RU — имя интерфейса (`Wireguard0`, `PPPoE0`…). Кнопка **«Сканировать…»** подгружает список с роутера; опция **«Только WireGuard»** сужает выбор до WG-туннелей.
|
Введи пароль из `ADMIN_PASSWORD`.
|
||||||
2. В списках — **одна строка = один домен или IPv4/IPv6/CIDR**. Пустые строки и строки с `#` в начале игнорируются.
|
|
||||||
3. Добавь роутеры: **base URL** прокси KeenDNS (`http(s)://хост:порт`, без пути `/rci/...`). Логин/пароль — в полях или в URL `логин:пароль@хост`; если пусто — из `KEENETIC_*` в `.env`.
|
|
||||||
4. **Сохранить на сервер** — только JSON на VPS.
|
|
||||||
5. **Применить на всех legacy** или отметь галочками и **Только на выбранных** — пошлёт на каждый RCI дифф: удалит лишние `include`, добавит новые, обновит `dns-proxy route` при смене интерфейса, в конце `system configuration save`.
|
|
||||||
|
|
||||||
### API (скрипты)
|
### Обновление
|
||||||
|
|
||||||
Все запросы с заголовком `X-Admin-Password`.
|
|
||||||
|
|
||||||
- `PUT /api/data` — полное или частичное обновление (`groups` и/или `routers`).
|
|
||||||
- `POST /api/groups/{US|RU}/lines` — тело `{"add":["a.com"],"remove":["b.com"]}`: правка списка **на сервере** без пересылки всего textarea (порядок: сначала удаления, затем добавления в конец).
|
|
||||||
- `POST /api/apply` — `{"mode":"all"|"selected","router_ids":["id1"]}`.
|
|
||||||
- `GET /api/keenetic-env` — дефолтный логин из `.env` и флаг «KEENETIC_PASSWORD задан».
|
|
||||||
- `GET /api/routers/{id}/interfaces` — список интерфейсов (`GET /rci/show/interface`); query `wireguard_only=1` — только WireGuard.
|
|
||||||
- `PATCH /api/routers/{id}` — правка имени, URL, `keenetic_login` / `keenetic_password`.
|
|
||||||
|
|
||||||
## Ограничения
|
|
||||||
|
|
||||||
- На один object-group Keenetic заводит лимит по числу записей (ориентир **~300** доменов на группу — как в gokeenapi). При превышении роутер может вернуть ошибку RCI.
|
|
||||||
- Строки без точки (не похожие на домен и не на IP/CIDR) отбрасываются при применении.
|
|
||||||
|
|
||||||
## Обновление
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/keenetic-dns-routes && sudo bash update.sh
|
cd /opt/keenetic-dns-routes && sudo bash update.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Если **`update.sh: No such file or directory`**: подтяни свежий `install.sh` с репозитория и один раз выполни `sudo bash install.sh` — он **создаст** `update.sh`, если файла нет. Либо вручную:
|
### Удаление
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/keenetic-dns-routes && git pull --ff-only
|
|
||||||
source venv/bin/activate && pip install -r requirements.txt
|
|
||||||
sudo systemctl restart keenetic-dns-routes
|
|
||||||
```
|
|
||||||
|
|
||||||
Без git: скопируй каталог проекта поверх, затем снова `sudo bash update.sh` или команды выше.
|
|
||||||
|
|
||||||
## Удаление с сервера (одной командой)
|
|
||||||
|
|
||||||
Останавливается `keenetic-dns-routes`, удаляется unit и каталог **`/opt/keenetic-dns-routes`**:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic-dns-routes/main/uninstall.sh | sudo bash
|
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic-dns-routes/main/uninstall.sh | sudo bash
|
||||||
```
|
```
|
||||||
|
|
||||||
Из каталога установки: `sudo bash uninstall.sh`
|
---
|
||||||
|
|
||||||
## Поддержка
|
## 3. Туннель — для роутеров без белого IP
|
||||||
|
|
||||||
- **GitHub:** [andrey271192](https://github.com/andrey271192)
|
### Что такое «белый IP» и почему он нужен
|
||||||
- **Boosty:** [Поддержка](https://boosty.to/andrey27/donate)
|
|
||||||
- **Поддержка проекта (Ozon Bank, СБП):** [ссылка](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798)
|
|
||||||
- **Telegram:** [@Iot_andrey](https://t.me/Iot_andrey)
|
|
||||||
|
|
||||||
## Связь
|
Обычно сервис (VPS) подключается к роутеру напрямую по сети. Для этого нужно знать IP-адрес роутера, и он должен быть **публичным** («белым») — то есть доступным из интернета.
|
||||||
|
|
||||||
Проект рядом по смыслу с [keenetic-unified](https://github.com/andrey271192/keenetic-unified) (Neo + дашборд) и [domen_hydra](https://github.com/andrey271192/domen_hydra) (только Neo-конфиг), но предназначен **только** для встроенной DNS-маршрутизации без Neo.
|
Если твой провайдер выдаёт **серый IP** (роутер за NAT оператора — очень частая ситуация в России), то с VPS до роутера «достучаться» невозможно. Роутер сам должен инициировать соединение.
|
||||||
|
|
||||||
|
### Как работает туннель
|
||||||
|
|
||||||
|
Роутер сам устанавливает зашифрованное SSH-соединение на VPS и говорит ему: «слушай у себя порт 20100 — всё что придёт туда, перешли мне на порт 81».
|
||||||
|
|
||||||
|
```
|
||||||
|
Роутер (серый IP) ──SSH──▶ VPS :20100
|
||||||
|
│
|
||||||
|
VPS → keenetic-dns-routes ──────▶│──▶ Порт 81 роутера (RCI API)
|
||||||
|
```
|
||||||
|
|
||||||
|
В итоге сервис обращается не напрямую к роутеру, а к `localhost:20100` на самом же VPS — и это работает даже если у роутера серый IP.
|
||||||
|
|
||||||
|
### Что понадобится
|
||||||
|
|
||||||
|
- Публичный IP/домен VPS (он у тебя уже есть, раз ставишь сервис).
|
||||||
|
- SSH-доступ к VPS (тоже есть).
|
||||||
|
- Роутер с установленным **Entware** (нужен для `autossh`).
|
||||||
|
|
||||||
|
### Установка Entware на роутер
|
||||||
|
|
||||||
|
> 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 (ARM) → aarch64:
|
||||||
|
opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
Дождись окончания (~2 минуты), потом проверь: `opkg update` должен отработать без ошибок.
|
||||||
|
|
||||||
|
### Шаг 1 — настрой .env на VPS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano /opt/keenetic-dns-routes/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавь или заполни строки:
|
||||||
|
|
||||||
|
```
|
||||||
|
VPS_SSH_HOST=IP_или_домен_VPS # публичный адрес, куда роутер будет коннектиться
|
||||||
|
VPS_SSH_PORT=22 # SSH-порт VPS (обычно 22)
|
||||||
|
VPS_SSH_USER=root # пользователь VPS
|
||||||
|
```
|
||||||
|
|
||||||
|
`VPS_SSH_PASS` оставь **пустым** — туннель использует SSH-ключи, пароль не нужен.
|
||||||
|
|
||||||
|
Перезапусти сервис:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart keenetic-dns-routes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 2 — добавь роутер в панель
|
||||||
|
|
||||||
|
Открой `http://VPS:8001`. Нажми кнопку **«⇄ Тоннель»** рядом с «+ Добавить».
|
||||||
|
|
||||||
|
Введи имя роутера и пароль веб-интерфейса роутера (для Keenetic API). Нажми **«Создать»**.
|
||||||
|
|
||||||
|
> Если кнопки «⇄ Тоннель» нет — проверь, что `VPS_SSH_HOST` в `.env` не пустой и сервис перезапущен.
|
||||||
|
|
||||||
|
### Шаг 3 — скопируй и выполни команду на роутере
|
||||||
|
|
||||||
|
В открывшемся окне ты увидишь одну команду вида:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -fsS 'http://VPS:8001/api/routers/abc/tunnel-script?token=XXX' | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Нажми кнопку **«Скопировать»** (если не сработала — выдели текст и Cmd/Ctrl+C).
|
||||||
|
|
||||||
|
Открой SSH-сессию на **роутер** (не на VPS!) и вставь команду.
|
||||||
|
|
||||||
|
> **Как отличить терминал роутера от VPS:**
|
||||||
|
> - Роутер: приглашение выглядит как `~ #` или `(none) ~ #`
|
||||||
|
> - VPS: выглядит как `root@имя-сервера:~#`
|
||||||
|
>
|
||||||
|
> Команда для роутера — это та, что начинается с `curl -fsS`. Её надо вводить там, где `~ #`.
|
||||||
|
|
||||||
|
Скрипт автоматически:
|
||||||
|
1. Установит `autossh` через opkg.
|
||||||
|
2. Запишет SSH-ключ в `/opt/etc/kdns_tk`.
|
||||||
|
3. Создаст скрипт тоннеля `/opt/bin/kdns_tun`.
|
||||||
|
4. Пропишет автозапуск при старте роутера.
|
||||||
|
5. Запустит туннель в фоне.
|
||||||
|
|
||||||
|
В конце ты увидишь:
|
||||||
|
|
||||||
|
```
|
||||||
|
=== OK ===
|
||||||
|
Тоннель: localhost:81 (роутер) -> VPS:20100
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 4 — проверь связь
|
||||||
|
|
||||||
|
Вернись в браузер и нажми кнопку **«⟳ Проверить связь»** в окне туннеля.
|
||||||
|
|
||||||
|
Если всё хорошо — статус изменится на «Активен». После этого можно нажать «Применить маршруты».
|
||||||
|
|
||||||
|
### Ручной запуск и диагностика
|
||||||
|
|
||||||
|
Если автоматический запуск не сработал (написало «ОШИБКА»):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# На роутере — запусти туннель вручную (ты увидишь вывод):
|
||||||
|
/opt/bin/kdns_tun
|
||||||
|
|
||||||
|
# Если работает вручную, но не в фоне — запусти через init.d:
|
||||||
|
/opt/etc/init.d/S99kdns_tun restart
|
||||||
|
|
||||||
|
# Проверить лог:
|
||||||
|
cat /tmp/kdns_tun.log
|
||||||
|
|
||||||
|
# Перезапустить автоматически:
|
||||||
|
killall autossh 2>/dev/null; sleep 1; /opt/etc/init.d/S99kdns_tun start
|
||||||
|
```
|
||||||
|
|
||||||
|
Если `/opt/bin/kdns_tun` работает вручную — туннель настроен правильно, вопрос только в фоновом запуске. Попробуй перезагрузить роутер — при старте Entware сам запустит `/opt/etc/init.d/S99kdns_tun start`.
|
||||||
|
|
||||||
|
### Проверка на VPS
|
||||||
|
|
||||||
|
На VPS можно посмотреть, слушается ли порт туннеля:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ss -tlnp | grep 20100
|
||||||
|
```
|
||||||
|
|
||||||
|
Должна быть строка с `127.0.0.1:20100`. Если есть — туннель работает.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Логины и пароли
|
||||||
|
|
||||||
|
Здесь два совершенно разных набора учётных данных. Не перепутай.
|
||||||
|
|
||||||
|
### Пароль веб-панели (`ADMIN_PASSWORD`)
|
||||||
|
|
||||||
|
Это пароль для входа на `http://VPS:8001`. Задаётся один раз в `.env` на VPS. Никак не связан с паролями роутеров.
|
||||||
|
|
||||||
|
```
|
||||||
|
ADMIN_PASSWORD=твой-секретный-пароль
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логин/пароль Keenetic (для RCI API)
|
||||||
|
|
||||||
|
Это логин и пароль **веб-интерфейса роутера** (`192.168.1.1`). Нужны сервису для того, чтобы применять маршруты через RCI API.
|
||||||
|
|
||||||
|
**Вариант 1 — один дефолт для всех роутеров** (удобно, если у всех один и тот же):
|
||||||
|
|
||||||
|
```
|
||||||
|
KEENETIC_LOGIN=admin
|
||||||
|
KEENETIC_PASSWORD=пароль-от-192.168.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вариант 2 — у каждого роутера свой** (заполняется в веб-панели при добавлении роутера):
|
||||||
|
- Поле «Логин» и «Пароль» в форме добавления роутера.
|
||||||
|
- Или URL вида `http://логин:пароль@rci.ваш-роутер.keenetic.pro:79`.
|
||||||
|
|
||||||
|
**Вариант 3 — прямо в URL** (если вставил URL с `логин:пароль@` — сервис сам перенесёт это в поля):
|
||||||
|
|
||||||
|
```
|
||||||
|
http://admin:пароль@rci.xxx.keenetic.pro:79
|
||||||
|
```
|
||||||
|
|
||||||
|
Приоритет (что важнее): поля роутера → user:pass@ в URL → `.env` дефолт.
|
||||||
|
|
||||||
|
### SSH-ключи для туннеля
|
||||||
|
|
||||||
|
Это отдельная история, и **тебе ничего делать не нужно**. Ключи генерируются автоматически на VPS при нажатии кнопки «⇄ Тоннель». Приватный ключ уходит на роутер через одноразовую ссылку (действует 10 минут). Публичный ключ добавляется в `~/.ssh/authorized_keys` на VPS. Никакого пароля SSH нет.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Как добавлять маршруты
|
||||||
|
|
||||||
|
### Где настроить интерфейс (куда направлять трафик)
|
||||||
|
|
||||||
|
В панели вверху есть поля **Interface ID** для групп US и RU. Это имя VPN-туннеля на роутере, через который пойдёт трафик: `Wireguard0`, `PPPoE0`, `SSTP0` и т.д.
|
||||||
|
|
||||||
|
Нажми **«Сканировать…»** рядом с полем — панель сама загрузит список интерфейсов с роутера. Или включи «Только WireGuard» чтобы видеть только VPN-туннели.
|
||||||
|
|
||||||
|
### Как добавить домены
|
||||||
|
|
||||||
|
В большие текстовые поля вводи по одному на строке:
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube.com
|
||||||
|
netflix.com
|
||||||
|
spotify.com
|
||||||
|
# комментарий — эти строки игнорируются
|
||||||
|
1.2.3.4
|
||||||
|
192.168.100.0/24
|
||||||
|
```
|
||||||
|
|
||||||
|
Поддерживаются: домены, IP-адреса, CIDR-подсети. Пустые строки и строки с `#` игнорируются.
|
||||||
|
|
||||||
|
> **Лимит:** Keenetic держит примерно **~300 доменов** в одном списке. Если превысишь — роутер вернёт ошибку.
|
||||||
|
|
||||||
|
### Применение
|
||||||
|
|
||||||
|
- **«Сохранить на сервер»** — сохраняет список только на VPS (не применяет на роутеры).
|
||||||
|
- **«Применить на всех»** — применяет на все роутеры сразу.
|
||||||
|
- Чтобы применить только на некоторые — поставь галочки у нужных роутеров и нажми **«Только на выбранных»**.
|
||||||
|
|
||||||
|
При применении сервис делает «умный дифф»: добавляет только новые домены, удаляет убранные, не трогает остальные. В конце отправляет `system configuration save`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Частые ошибки и решения
|
||||||
|
|
||||||
|
### `Connection refused` при применении маршрутов
|
||||||
|
|
||||||
|
**Причина:** RCI API роутера недоступен с VPS.
|
||||||
|
|
||||||
|
**Что проверить:**
|
||||||
|
1. В Keenetic включён **HTTP Proxy для API** — порт **79** (не 81, не 80).
|
||||||
|
2. У пользователя роутера есть права на HTTP Proxy (в веб-интерфейсе роутера → «Управление» → «Пользователи»).
|
||||||
|
3. Правильный URL прокси: `http://rci.твой.keenetic.pro:79` (или аналогичный).
|
||||||
|
|
||||||
|
### Туннель пишет «autossh не запустился в фоне»
|
||||||
|
|
||||||
|
**Причина:** BusyBox на роутере не полностью «отвязывает» фоновый процесс от терминала.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```sh
|
||||||
|
# На роутере — проверь вручную:
|
||||||
|
/opt/bin/kdns_tun
|
||||||
|
# Если работает (есть вывод и не падает с ошибкой) — перезагрузи роутер.
|
||||||
|
# После перезагрузки Entware сам запустит туннель через init.d.
|
||||||
|
```
|
||||||
|
|
||||||
|
Если падает и вручную — смотри лог:
|
||||||
|
```sh
|
||||||
|
cat /tmp/kdns_tun.log
|
||||||
|
```
|
||||||
|
Там будет конкретная ошибка SSH.
|
||||||
|
|
||||||
|
### `Host key verification failed` в логе autossh
|
||||||
|
|
||||||
|
**Причина:** Старый ключ VPS не совпадает с сохранённым.
|
||||||
|
|
||||||
|
**Решение:** Скрипт уже ставит `-o StrictHostKeyChecking=no` — этой ошибки быть не должно. Если всё же есть:
|
||||||
|
```sh
|
||||||
|
rm /opt/etc/ssh/ssh_known_hosts 2>/dev/null; /opt/bin/kdns_tun
|
||||||
|
```
|
||||||
|
|
||||||
|
### Кнопка «Скопировать» не работает
|
||||||
|
|
||||||
|
**Причина:** `navigator.clipboard` требует HTTPS. Панель работает по HTTP.
|
||||||
|
|
||||||
|
**Решение встроено:** при ошибке кнопка автоматически выделяет текст — просто нажми Cmd+C (Mac) или Ctrl+C (Windows/Linux).
|
||||||
|
|
||||||
|
### Токен истёк (10 мин)
|
||||||
|
|
||||||
|
**Причина:** Одноразовая ссылка для установки туннеля действует 10 минут.
|
||||||
|
|
||||||
|
**Решение:** Нажми «Получить команду» заново — сформируется новая ссылка.
|
||||||
|
|
||||||
|
### `opkg: не найдена команда` на роутере
|
||||||
|
|
||||||
|
**Причина:** Entware не установлен или не инициализирован.
|
||||||
|
|
||||||
|
**Решение:** Установи Entware (см. раздел 3), дождись окончания и выполни `opkg update`.
|
||||||
|
|
||||||
|
### Панель не открывается (`http://VPS:8001`)
|
||||||
|
|
||||||
|
**Причина:** Порт заблокирован файрволом VPS.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# На VPS:
|
||||||
|
sudo ufw allow 8001/tcp # или через iptables, в зависимости от дистрибутива
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Полезные советы
|
||||||
|
|
||||||
|
**Как зайти на роутер по SSH:**
|
||||||
|
```
|
||||||
|
Адрес: 192.168.1.1 (или IP роутера в сети)
|
||||||
|
Логин: root
|
||||||
|
Пароль: keenetic (стандартный, если не менял)
|
||||||
|
Порт: 222 (в некоторых моделях вместо 22)
|
||||||
|
```
|
||||||
|
Используй Termius, PuTTY или команду `ssh root@192.168.1.1` в терминале.
|
||||||
|
|
||||||
|
**Сервис запускается автоматически при старте VPS** — systemd следит за ним. Если упал:
|
||||||
|
```bash
|
||||||
|
sudo systemctl status keenetic-dns-routes # посмотреть состояние
|
||||||
|
sudo systemctl restart keenetic-dns-routes # перезапустить
|
||||||
|
sudo journalctl -u keenetic-dns-routes -n 50 # последние 50 строк лога
|
||||||
|
```
|
||||||
|
|
||||||
|
**Обновить сервис:**
|
||||||
|
```bash
|
||||||
|
cd /opt/keenetic-dns-routes && sudo bash update.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проверить, что туннельный порт слушается на VPS:**
|
||||||
|
```bash
|
||||||
|
ss -tlnp | grep 20100
|
||||||
|
```
|
||||||
|
|
||||||
|
**Применять маршруты по расписанию** (через cron на VPS):
|
||||||
|
```bash
|
||||||
|
crontab -e
|
||||||
|
# Добавь строку — применять каждую ночь в 3:00:
|
||||||
|
0 3 * * * curl -s -X POST http://localhost:8001/api/apply \
|
||||||
|
-H "X-Admin-Password: твой-пароль" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"mode":"all"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Список доменов через API** (без браузера):
|
||||||
|
```bash
|
||||||
|
# Получить текущий список US:
|
||||||
|
curl -s http://localhost:8001/api/data \
|
||||||
|
-H "X-Admin-Password: твой-пароль" | python3 -m json.tool
|
||||||
|
|
||||||
|
# Добавить домен в список US:
|
||||||
|
curl -s -X POST http://localhost:8001/api/groups/US/lines \
|
||||||
|
-H "X-Admin-Password: твой-пароль" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"add":["newdomain.com"],"remove":[]}'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что изменено в репозитории (кратко)
|
||||||
|
|
||||||
|
| Файл | Что добавлено / исправлено |
|
||||||
|
|------|---------------------------|
|
||||||
|
| `app/main.py` | Генерация ed25519-keypair на VPS через `ssh-keygen`; добавление pubkey в `~/.ssh/authorized_keys`; эндпоинты `/tunnel-cmd`, `/tunnel-script` (одноразовый токен, 10 мин), `/tunnel-status` (проверка порта), `DELETE /tunnel` |
|
||||||
|
| `app/config.py` | Переменные `VPS_SSH_HOST`, `VPS_SSH_PORT`, `VPS_SSH_USER`, `VPS_SSH_PASS`, `TUNNEL_PORT_START` |
|
||||||
|
| `.env.example` | Секция `Reverse SSH tunnel` с объяснениями |
|
||||||
|
| `templates/index.html` | Кнопка «⇄ Тоннель» рядом с «+ Добавить»; модалка с curl-командой; кнопка «⟳ Проверить связь»; fallback-копирование (execCommand) для HTTP без HTTPS |
|
||||||
|
| `tunnel/kssh-tun` | Отдельный скрипт управления WireGuard-пирами на VPS-стороне (для альтернативной WG-топологии) |
|
||||||
|
|
||||||
|
**Что было исправлено в процессе разработки:**
|
||||||
|
- `sshpass` и `cronie` недоступны в Entware aarch64-k3.10 → заменены на keypair-аутентификацию и `init.d`-автозапуск.
|
||||||
|
- `openssh-keygen` нет на роутере → генерация keypair перенесена на VPS.
|
||||||
|
- `navigator.clipboard` не работает по HTTP → fallback через `execCommand('copy')`.
|
||||||
|
- autossh умирал при фоновом запуске → добавлены `AUTOSSH_GATETIME=0`, `</dev/null`, `setsid` (или `nohup`-subshell), лог в `/tmp/kdns_tun.log`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Связанные проекты
|
||||||
|
|
||||||
|
- [keenetic-unified](https://github.com/andrey271192/keenetic-unified) — Neo + дашборд (другой порт, другие роутеры)
|
||||||
|
- [domen_hydra](https://github.com/andrey271192/domen_hydra) — только Neo-конфиг
|
||||||
|
- [Keenetic SSH](https://github.com/andrey271192/Keenetic_SSH) — прямой SSH (нужен белый IP)
|
||||||
|
|||||||
Reference in New Issue
Block a user