diff --git a/README.md b/README.md index 173d989..a883585 100644 --- a/README.md +++ b/README.md @@ -1,329 +1,160 @@ # keenetic_ssh-web -> Локальная веб-панель для **Keenetic + Entware**: shell-команды на роутере, расписание, ручной запуск, просмотр stdout/stderr. Слушает порт **2001**. Авторизация — логин/пароль от веб-админки роутера. -> -> + опциональный модуль **`tunnel/`** — WireGuard VPS↔роутер, чтобы дотянуться до панели и SSH с **серого IP**, без проброса портов. +Веб‑панель, которая **выполняет команды прямо на роутере Keenetic** (Entware) и показывает вывод. Подходит для `opkg update`, перезапусков сервисов, диагностики, и т. п. -Репозиторий: [github.com/andrey271192/keenetic_ssh-web](https://github.com/andrey271192/keenetic_ssh-web) +- **Порт панели:** `2001` +- **Где работает:** на самом роутере (Entware) +- **Вход:** логин/пароль **от веб‑админки Keenetic** (NDM `/auth`) + (есть запасной «мастер‑пароль» `WEB_PASSWORD`, если нужно) +- **Опционально:** модуль `tunnel/` — **WireGuard‑туннель VPS ↔ роутер**, чтобы открыть доступ к панели и SSH, даже если у роутера **серый IP** (без проброса портов). + +![Интерфейс](docs/ui.png) --- -## В репозитории два независимых пакета +## Быстрый старт (минимум команд) -| Пакет | Куда ставится | Зачем | Обязателен | -|---|---|---|---| -| **A. keenetic_ssh-web** | роутер (Entware) | веб-панель команд на 2001 | да | -| **B. tunnel** | VPS (Ubuntu) + роутер | WG-туннель для серого IP | нет, по желанию | +### Вариант 1. Панель нужна только дома (LAN) -**Ставятся и удаляются отдельно**. Пакет B нужен только если у роутера серый IP и вы хотите управлять им из интернета через свой VPS. Если у вас белый IP / KeenDNS Cloud / достаточно LAN — ставьте только A. +На роутере (в Entware shell по SSH): -> ⚠️ **Скрипты установки/удаления НЕ трогают** `hrneo`/`hrweb` (HydraRoute Neo), XKeen, Domain Hydra и любые ваши кастомные пакеты Entware. Не правят `/opt/etc/opkg.conf`, не сбрасывают чужие правила iptables, не ставят/удаляют пакеты, не относящиеся к данным двум пакетам. +```sh +curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/setup-router.sh | sh +``` + +Откройте в браузере: + +- `http://IP_РОУТЕРА:2001` + +Вход — **как в веб‑админку Keenetic**. --- -## Сценарии и что ставить +### Вариант 2. Серый IP, нужен доступ из любой точки (через VPS) -| Сценарий | Доступ | Что ставить | -|---|---|---| -| Управляю только из дома (LAN) | `http://192.168.X.1:2001` | только **A** | -| Серый IP, нужен доступ из любой точки | `https://имя.домен` через ваш VPS | **A** + **B** + reverse-proxy на VPS | -| Белый IP / KeenDNS Cloud | проброс портов или KeenDNS на 2001 | только **A** (B не нужен) | - ---- - -# A. keenetic_ssh-web — установка - -## A.1. Требования - -- Keenetic с **Entware** (`opkg` доступен) -- `python3` — установится автоматически из `bin.entware.net` -- Свободный порт **2001** (можно переопределить в `.env`) - -## A.2. Установка одной командой (на роутере) +#### 2.1. На VPS (Ubuntu) — поставить сервер туннеля ```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/bootstrap.sh | sh +curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/setup-vps.sh | sudo bash ``` -Что делает: -- скачивает архив ветки `main`, кладёт в `/opt/share/keenetic_ssh-web` -- ставит **только** `python3`, `python3-pip`, `python3-venv` (если их нет) -- кладёт init-скрипт `/opt/etc/init.d/S99keenetic-ssh-web` и rc.d-симлинк -- стартует сервис на порту 2001 -- создаёт `.env` из примера и подставляет в `ROUTER_HOST` LAN-IP роутера - -В конце выведет адрес панели: `http://:2001`. Логин/пароль — от веб-админки роутера. - -> Другая ветка/форк: `KSSH_BRANCH=dev KSSH_REPO=user/repo curl … | sh`. - -## A.3. Конфиг — `/opt/share/keenetic_ssh-web/.env` - -| Переменная | Описание | По умолчанию | -|---|---|---| -| `ROUTER_HOST` | HTTP-адреса админки Keenetic для проверки логина (через запятую — пробуем по очереди). Установщик сам подставит LAN-IP. | `http://127.0.0.1` | -| `ROUTER_LOGIN` | Логин по умолчанию в форме входа | `admin` | -| `ROUTER_TIMEOUT` | Таймаут запроса к `/auth`, сек | `5` | -| `WEB_PASSWORD` | Запасной мастер-пароль (если админка недоступна) | пусто | -| `PORT` | HTTP-порт панели | `2001` | -| `CMD_TIMEOUT` | Таймаут одной shell-команды, сек | `300` | -| `ALLOWED_IPS` | Белый список IP клиентов (через запятую). Пусто = всех. | пусто | -| `AUTHOR_TELEGRAM_USERNAME` | username для ссылки в шапке | `Iot_andrey` | - -После правки: -```sh -/opt/etc/init.d/S99keenetic-ssh-web restart -tail -f /opt/var/log/keenetic-ssh-web.log -``` - -> ⚠️ **Безопасность.** Панель выполняет произвольные shell-команды с правами процесса (на Entware часто root). Не открывайте порт 2001 в интернет напрямую. Используйте `ALLOWED_IPS` или туннель + reverse-proxy с HTTPS (см. пакет B). - -## A.4. Управление сервисом +#### 2.2. На VPS — добавить ваш роутер (peer) ```sh -/opt/etc/init.d/S99keenetic-ssh-web start -/opt/etc/init.d/S99keenetic-ssh-web stop -/opt/etc/init.d/S99keenetic-ssh-web restart -tail -f /opt/var/log/keenetic-ssh-web.log -vi /opt/share/keenetic_ssh-web/.env -``` - -## A.5. Удаление keenetic_ssh-web - -С GitHub: -```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | sh -``` - -Сохранить `data/store.json` и `.env`: -```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | env KEEP_DATA=1 sh -``` - -Удаляет ровно: `/opt/share/keenetic_ssh-web/`, `/opt/etc/init.d/S99keenetic-ssh-web`, `/opt/etc/rc.d/S99keenetic-ssh-web`, pid-файл. -**Не удаляет:** `python3`, `wireguard-tools`, `hrneo`, `hrweb`, любые другие пакеты Entware, лог `/opt/var/log/keenetic-ssh-web.log`. - ---- - -# B. tunnel — установка (опционально, для серых IP) - -``` -[твой ПК] → https://router.домен (VPS, белый IP) - │ Caddy/Nginx reverse-proxy - ▼ - wg0 10.99.0.1 (VPS) - ⇅ WireGuard, UDP/51820 - wg0 10.99.0.X (роутер за NAT провайдера) - ▼ - 127.0.0.1:2001 keenetic_ssh-web - 127.0.0.1:22 SSH -``` - -Туннель **инициирует роутер** наружу — серый IP / NAT провайдера не мешает. - -## B.1. На VPS (Ubuntu) — один раз - -```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/server-install.sh | sudo sh -``` - -Что делает: -- `apt install wireguard wireguard-tools curl` -- генерит серверные ключи (`/etc/wireguard/server_{private,public}.key`) -- создаёт `/etc/wireguard/wg0.conf` (UDP 51820, IP `10.99.0.1/24`) -- ставит утилиту `kssh-tun` в `/usr/local/bin/` -- открывает `51820/udp` и `wg0` в `ufw`/`iptables`, если активны -- запускает `wg-quick@wg0` и ставит на автозапуск - -В конце печатает Endpoint и серверный PublicKey. - -## B.2. На VPS — добавить роутер (peer) - -```sh -sudo kssh-tun add router-name -``` - -Утилита: -- генерит ключи клиента, выделяет IP `10.99.0.X` -- сохраняет `/etc/wireguard/peers/.peer` -- регенерирует `wg0.conf` и применяет (`systemctl restart wg-quick@wg0`) -- **выводит готовую команду для роутера** — четыре `export` + `curl … | sh` - -Прочие команды: -```sh -sudo kssh-tun list # список peer-ов -sudo kssh-tun show # повторно вывести ENV-блок -sudo kssh-tun remove # удалить peer -sudo kssh-tun status # wg show wg0 -``` - -## B.3. На роутере — поднять клиент - -Скопируйте блок из `kssh-tun add` и выполните на роутере (через SSH/Entware shell): - -```sh -export VPS_ENDPOINT=SERVER_IP:51820 -export VPS_PUBKEY='...' -export CLIENT_IP=10.99.0.X -export CLIENT_PRIVKEY='...' -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/tunnel-install.sh | sh -``` - -Что делает: -- `opkg install wireguard-tools` (если нет) -- пишет `/opt/etc/wireguard/wg0.conf` -- поднимает интерфейс `wg0` с адресом `CLIENT_IP/24` -- ставит init-скрипт `/opt/etc/init.d/S50kssh-tunnel` + rc.d-симлинк -- **разрешает входящий трафик с туннеля** (`iptables -I INPUT -i wg0 -j ACCEPT` + `rp_filter=2`) — без этого Keenetic режет ответы из VPS, handshake пройдёт, а ping/HTTP — нет -- пингует `10.99.0.1` для проверки - -После этого с VPS: -```sh -ping -c 3 10.99.0.X -ssh root@10.99.0.X # если на роутере включён SSH -curl http://10.99.0.X:2001 # панель keenetic_ssh-web (если установлена) -``` - -## B.4. Reverse-proxy на VPS (доступ снаружи) - -Caddyfile: -``` -router.example.com { - reverse_proxy 10.99.0.X:2001 -} -``` - -Caddy выдаст HTTPS, и `https://router.example.com` отдаёт панель роутера. В `.env` keenetic_ssh-web укажите `ALLOWED_IPS=10.99.0.1` — только VPS будет иметь право заходить. - -## B.5. Параметры (ENV) - -`server-install.sh` (VPS): - -| Переменная | По умолчанию | Описание | -|---|---|---| -| `WG_PORT` | `51820` | UDP-порт сервера | -| `WG_SUBNET_PREFIX` | `10.99.0` | Первые три октета `/24` | -| `WG_SERVER_LAST_OCTET` | `1` | Адрес сервера в туннеле | -| `KSSH_REPO`/`KSSH_BRANCH` | `andrey271192/keenetic_ssh-web` / `main` | Источник `kssh-tun` и `tunnel-install.sh` | - -`tunnel-install.sh` (роутер): - -| Переменная | Обязательная | Описание | -|---|---|---| -| `VPS_ENDPOINT` | да | `<публичный IP>:<порт>` | -| `VPS_PUBKEY` | да | PublicKey сервера | -| `CLIENT_IP` | да | IP роутера в туннеле | -| `CLIENT_PRIVKEY` | да | PrivateKey роутера (выдаёт `kssh-tun add`) | -| `WG_IF` | `wg0` | Имя интерфейса | -| `WG_SUBNET` | `10.99.0.1/32` | AllowedIPs клиента. По умолчанию только VPS, чтобы не ломать существующие WG-маршруты Keenetic. Поставьте `10.99.0.0/24` для peer-to-peer. | -| `WG_KEEPALIVE` | `25` | `PersistentKeepalive`, сек (нужен из-за NAT провайдера) | - -## B.6. Удаление tunnel - -### B.6.1. На роутере (только клиент) - -```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/tunnel-uninstall.sh | sh -``` - -Удаляет: интерфейс `wg0`, `/opt/etc/wireguard/wg0.conf`, init-скрипт `S50kssh-tunnel`, rc.d-симлинк, наши правила `iptables ACCEPT для wg0`. -**Не удаляет:** `wireguard-tools`, общие правила iptables, чужие WG-конфиги, `keenetic_ssh-web`, HydraRoute Neo и др. - -### B.6.2. На VPS (сервер) - -```sh -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/server-uninstall.sh | sudo sh -``` - -Удаляет: `wg-quick@wg0` (stop+disable), `/etc/wireguard/{wg0.conf,server_*.key,peers/,.kssh-tun.env}`, `/usr/local/bin/kssh-tun`, наши правила ufw/iptables. -**Не удаляет:** apt-пакеты `wireguard`/`wireguard-tools`, чужие правила ufw/iptables, ваши приложения и Docker. - -Если потом захотите снести и сами apt-пакеты — вручную: -```sh -sudo apt remove --purge wireguard wireguard-tools -``` - ---- - -## Полный «с нуля» — пример - -Допустим, на роутере уже стоит HydraRoute Neo, и его трогать **нельзя**. Хотим чистую установку обоих пакетов. - -**1. На VPS:** -```sh -# (если что-то стояло раньше) -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/server-uninstall.sh | sudo sh - -# свежая установка сервера туннеля -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/server-install.sh | sudo sh - -# завести роутер sudo kssh-tun add my-router -# → скопировать выданный 5-строчный блок ``` -**2. На роутере:** +Команда выведет **готовый блок** (несколько строк `export ...` + `curl ... | sh`) — просто скопируйте его. + +#### 2.3. На роутере — поставить панель + клиент туннеля + +Вставьте **тот самый блок** на роутере (в Entware shell). Он поднимет `wg0`, а затем установит панель на `2001`. + +Проверка с VPS: + +```sh +curl http://10.99.0.X:2001 +ssh root@10.99.0.X +``` + +Дальше уже красиво делается через HTTPS reverse‑proxy на VPS (Caddy/Nginx): + +- `router.example.com` → `10.99.0.X:2001` + +Рекомендация: в `.env` панели выставить **`ALLOWED_IPS=10.99.0.1`**, чтобы к роутеру мог обращаться **только VPS**. + +--- + +### Вариант 3. Белый IP — без туннеля + +Ставьте как в варианте 1 (LAN), а доступ снаружи делайте как вам удобно: проброс порта/файрвол/домен. +Важно: **не открывайте 2001 в интернет без ограничений** (см. безопасность ниже). + +--- + +## Как пользоваться панелью (по‑человечески) + +### 1) Добавьте команду + +- **Название** — как вам удобно (например: `opkg update`) +- **Команда** — обычная shell‑команда (например: `opkg update`) +- **Примечание** — необязательно + +### 2) Запуск + +- **Выполнить** — запускает одну команду и показывает результат +- **Выполнить все команды** — запускает все строки с галочкой **«ВКЛ»** + +### 3) Расписание + +- Поставьте интервал (в минутах) и нажмите **Сохранить** +- У нужных строк включите **«Распис.»** + +По расписанию выполняются только строки: **ВКЛ + Распис.** + +### 4) Просмотр вывода + +Кнопка **«Вывод»** раскрывает полный лог последнего запуска (stdout + stderr). + +--- + +## Примеры полезных команд (можно копировать) + +- Обновить пакеты: `opkg update && opkg list-upgradable | head` +- Обновить всё: `opkg update && opkg upgrade` +- Проверить место: `df -h` +- Процессы: `top -b -n 1 | head -60` +- WireGuard: `wg show` +- Логи: `logread | tail -200` + +--- + +## Безопасность (важно) + +Это **не песочница**: команда выполняется с правами процесса (на Entware часто **root**). + +- Не публикуйте порт **2001** в интернет «как есть». +- Используйте минимум: **туннель + reverse‑proxy** или **`ALLOWED_IPS`**. + +--- + +## Удаление (одной командой) + +Панель (на роутере): + ```sh -# (если что-то стояло раньше — оба пакета по отдельности) -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/tunnel-uninstall.sh | sh curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | sh - -# панель -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/bootstrap.sh | sh - -# туннель — вставить выданный с VPS блок (4 export + curl) -export VPS_ENDPOINT=... -export VPS_PUBKEY='...' -export CLIENT_IP=10.99.0.X -export CLIENT_PRIVKEY='...' -curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/tunnel-install.sh | sh ``` -**3. Проверка с VPS:** +Туннель‑клиент (на роутере, если ставили): + ```sh -ping -c 3 10.99.0.X -curl -I http://10.99.0.X:2001/ +curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/tunnel-uninstall.sh | sh ``` -`hrneo`/`hrweb` (HydraRoute Neo) и любые ваши кастомные репозитории на обоих хостах остаются нетронутыми. +Туннель‑сервер (на VPS, если ставили): + +```sh +curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/tunnel/server-uninstall.sh | sudo sh +``` --- -## Что лежит где +## Туннель как отдельный сервис (по желанию) -### keenetic_ssh-web (на роутере) -| Путь | | -|---|---| -| `/opt/share/keenetic_ssh-web/` | приложение, `.env`, `data/store.json`, venv/lib | -| `/opt/etc/init.d/S99keenetic-ssh-web` | init-скрипт | -| `/opt/etc/rc.d/S99keenetic-ssh-web` | автозапуск | -| `/opt/var/log/keenetic-ssh-web.log` | лог | -| `/opt/var/run/keenetic-ssh-web.pid` | pid | +Туннель — это **дополнительный сервис для всей вашей экосистемы** (keenetic‑unified, domen_hydra и т. д.). Он просто делает так, что VPS «видит» роутер по адресу `10.99.0.X`. -### tunnel — клиент (на роутере) -| Путь | | -|---|---| -| `/opt/etc/wireguard/wg0.conf` | конфиг туннеля | -| `/opt/etc/init.d/S50kssh-tunnel` | init-скрипт | -| `/opt/etc/rc.d/S50kssh-tunnel` | автозапуск | - -### tunnel — сервер (на VPS) -| Путь | | -|---|---| -| `/etc/wireguard/wg0.conf` | конфиг сервера (регенерируется `kssh-tun`) | -| `/etc/wireguard/server_{private,public}.key` | серверные ключи | -| `/etc/wireguard/peers/.peer` | данные peer-а (имя/IP/ключи) | -| `/etc/wireguard/.kssh-tun.env` | параметры запуска | -| `/usr/local/bin/kssh-tun` | утилита | -| `systemctl status wg-quick@wg0` | сервис | +Полная документация (для тех, кому нужно больше деталей): `tunnel/README.md`. --- -## Поддержка +## Поддержка проекта -- **GitHub:** [andrey271192](https://github.com/andrey271192) -- **Boosty:** [донат](https://boosty.to/andrey27/donate) -- **Telegram:** [@Iot_andrey](https://t.me/Iot_andrey) +- **Boosty:** `https://boosty.to/andrey27/donate` +- **Ozon Bank (СБП):** `https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798` +- **Telegram:** `https://t.me/Iot_andrey` +Кнопка **Sponsor** на GitHub ведёт на варианты из `.github/FUNDING.yml`. ## Лицензия MIT — см. [LICENSE](LICENSE). diff --git a/docs/files.png b/docs/files.png new file mode 100644 index 0000000..57e77f9 Binary files /dev/null and b/docs/files.png differ diff --git a/docs/ui.png b/docs/ui.png new file mode 100644 index 0000000..fd50f9e Binary files /dev/null and b/docs/ui.png differ