diff --git a/README.md b/README.md index c4ac92c..7705ba2 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,474 @@ # 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). -- Доступ к 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)://логин:пароль@хост:порт` (при сохранении логин/пароль переносятся в поля). - -> Entware/SSH **не требуется** для `keenetic-dns-routes` (здесь всё через RCI по HTTP Proxy), но на практике часто нужно для обслуживания роутера. Ниже — шпаргалка. - -## Quickstart - -1) На VPS поставь сервис (раздел “Установка (Ubuntu)” ниже). -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 +``` +┌───────────────────────────────┐ +│ Браузер → http://VPS:8001 │ ← ты работаешь здесь +└──────────────┬────────────────┘ + │ API +┌──────────────▼────────────────┐ +│ keenetic-dns-routes на VPS │ ← этот сервис +└──────────┬──────────┬─────────┘ + │ RCI │ RCI + ┌──────▼──┐ ┌────▼──────┐ + │Роутер 1 │ │ Роутер 2 │ ← роутеры дома + └─────────┘ └───────────┘ ``` -🟢 Aarch64 (MT7622/MT7981/MT7988) -```sh -opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz -``` +**Что умеет:** +- Два независимых списка доменов/IP: **US** (под VPN) и **RU** (локальный трафик, если нужен второй туннель). +- Применяет списки сразу на несколько роутеров одной кнопкой. +- Для роутеров **без белого 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`. -- Проверь, что у пользователя Keenetic есть права на HTTP Proxy. -- Если ходишь к роутеру через WireGuard (`wg0`) и получаешь `Connection refused`, возможно сервис слушает только LAN‑IP. - Решение: DNAT `wg0:<порт> → LAN_IP:<порт>` (можно автоматизировать через `keenetic_ssh-web/tunnel` с `--dnat 79`). - -## Установка (Ubuntu) +### Шаг 1 — клонируй и запусти установщик ```bash git clone https://github.com/andrey271192/keenetic-dns-routes.git /opt/keenetic-dns-routes cd /opt/keenetic-dns-routes 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 ``` -Интерфейс: `http://IP_СЕРВЕРА:8001` +### Шаг 4 — открой панель -## Настройка +``` +http://IP_ТВОЕГО_VPS:8001 +``` -1. В **Interface ID** для US/RU — имя интерфейса (`Wireguard0`, `PPPoE0`…). Кнопка **«Сканировать…»** подгружает список с роутера; опция **«Только WireGuard»** сужает выбор до WG-туннелей. -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`. +Введи пароль из `ADMIN_PASSWORD`. -### 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 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 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) -- **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) +### Что такое «белый IP» и почему он нужен -## Связь +Обычно сервис (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`, `