Андрей Бобырев 3684c0dc0b tunnel: фикс файрвола Keenetic + раздельные uninstall + README под ключ
- tunnel/tunnel-install.sh: в init-скрипте добавлен `iptables -I INPUT -i wg0
  -j ACCEPT`, OUTPUT-аналог и `rp_filter=2`. Без этого Keenetic режет ответы
  VPS→роутер: handshake проходит, но ping/HTTP внутри туннеля молча дропаются.
  В down() — снимаем эти же правила.

- tunnel/tunnel-uninstall.sh (новый): сносит ТОЛЬКО клиентскую часть туннеля
  (wg0.conf, init, rc.d, наши iptables-правила). Не трогает wireguard-tools,
  чужие WG-конфиги, keenetic_ssh-web, HydraRoute Neo.

- tunnel/server-uninstall.sh (новый): сносит ТОЛЬКО серверную часть туннеля
  (wg-quick@wg0, /etc/wireguard/{wg0.conf,server_*.key,peers/}, kssh-tun,
  ufw-правила kssh-tunnel). Не делает apt remove для wireguard.

- README.md: переписан под ключ. Чётко разделены два пакета (A: панель,
  B: туннель), оба ставятся и удаляются отдельно. Явно перечислено, что
  скрипты НЕ трогают (HydraRoute Neo, кастомные репо, чужие правила).
2026-04-26 14:22:33 +03:00

keenetic_ssh-web

Локальная веб-панель для Keenetic + Entware: shell-команды на роутере, расписание, ручной запуск, просмотр stdout/stderr. Слушает порт 2001. Авторизация — логин/пароль от веб-админки роутера.

  • опциональный модуль tunnel/ — WireGuard VPS↔роутер, чтобы дотянуться до панели и SSH с серого IP, без проброса портов.

Репозиторий: github.com/andrey271192/keenetic_ssh-web


В репозитории два независимых пакета

Пакет Куда ставится Зачем Обязателен
A. keenetic_ssh-web роутер (Entware) веб-панель команд на 2001 да
B. tunnel VPS (Ubuntu) + роутер WG-туннель для серого IP нет, по желанию

Ставятся и удаляются отдельно. Пакет B нужен только если у роутера серый IP и вы хотите управлять им из интернета через свой VPS. Если у вас белый IP / KeenDNS Cloud / достаточно LAN — ставьте только A.

⚠️ Скрипты установки/удаления НЕ трогают hrneo/hrweb (HydraRoute Neo), XKeen, Domain Hydra и любые ваши кастомные пакеты Entware. Не правят /opt/etc/opkg.conf, не сбрасывают чужие правила iptables, не ставят/удаляют пакеты, не относящиеся к данным двум пакетам.


Сценарии и что ставить

Сценарий Доступ Что ставить
Управляю только из дома (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. Установка одной командой (на роутере)

curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/bootstrap.sh | sh

Что делает:

  • скачивает архив ветки 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://<LAN-IP>: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

После правки:

/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. Управление сервисом

/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:

curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | sh

Сохранить data/store.json и .env:

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) — один раз

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)

sudo kssh-tun add router-name

Утилита:

  • генерит ключи клиента, выделяет IP 10.99.0.X
  • сохраняет /etc/wireguard/peers/<name>.peer
  • регенерирует wg0.conf и применяет (systemctl restart wg-quick@wg0)
  • выводит готовую команду для роутера — четыре export + curl … | sh

Прочие команды:

sudo kssh-tun list                  # список peer-ов
sudo kssh-tun show <name>           # повторно вывести ENV-блок
sudo kssh-tun remove <name>         # удалить peer
sudo kssh-tun status                # wg show wg0

B.3. На роутере — поднять клиент

Скопируйте блок из kssh-tun add и выполните на роутере (через SSH/Entware shell):

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:

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. На роутере (только клиент)

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 (сервер)

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-пакеты — вручную:

sudo apt remove --purge wireguard wireguard-tools

Полный «с нуля» — пример

Допустим, на роутере уже стоит HydraRoute Neo, и его трогать нельзя. Хотим чистую установку обоих пакетов.

1. На VPS:

# (если что-то стояло раньше)
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. На роутере:

# (если что-то стояло раньше — оба пакета по отдельности)
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:

ping -c 3 10.99.0.X
curl -I http://10.99.0.X:2001/

hrneo/hrweb (HydraRoute Neo) и любые ваши кастомные репозитории на обоих хостах остаются нетронутыми.


Что лежит где

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

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/<name>.peer данные peer-а (имя/IP/ключи)
/etc/wireguard/.kssh-tun.env параметры запуска
/usr/local/bin/kssh-tun утилита
systemctl status wg-quick@wg0 сервис

Поддержка

Лицензия

MIT — см. LICENSE.

Description
No description provided
Readme MIT 232 KiB
Languages
Shell 49.7%
Python 27.7%
HTML 22.6%