- 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, кастомные репо, чужие правила).
15 KiB
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_HOSTLAN-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, IP10.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 |
сервис |
Поддержка
- GitHub: andrey271192
- Boosty: донат
- Telegram: @Iot_andrey
Лицензия
MIT — см. LICENSE.