tunnel: WireGuard VPS↔роутер для серых IP, без правки других сервисов

Решает доступ к роутеру с серым IP через белый VPS — поднимаем WG-туннель
(UDP 51820, подсеть 10.99.0.0/24), и любой сервис на VPS обращается к
роутеру по 10.99.0.X. SSH, HTTP, что угодно — без проброса портов и
без изменений в keenetic_ssh-web/keenetic-unified/Domain Hydra/etc.

Что добавлено:
- tunnel/server-install.sh — установка WG-сервера на Ubuntu VPS,
  генерация ключей, запуск wg-quick@wg0, открытие 51820/udp в ufw.
- tunnel/kssh-tun — утилита управления peer-ами на VPS:
  add/list/show/remove. add генерит ключи и IP, печатает ENV-блок
  с одной командой для роутера.
- tunnel/tunnel-install.sh — клиент для роутера (Entware), принимает
  4 ENV (VPS_ENDPOINT/VPS_PUBKEY/CLIENT_IP/CLIENT_PRIVKEY), ставит
  wireguard-tools, поднимает wg0 и init-скрипт автозапуска.
- tunnel/README.md — пошаговая инструкция массовой установки.
- README.md: краткая ссылка из основного раздела.

Параметры подсети/порта/имени репо — через ENV для масштабной установки.
This commit is contained in:
Андрей Бобырев
2026-04-26 11:12:19 +03:00
parent 7c2adf95b9
commit c46273e72a
5 changed files with 562 additions and 0 deletions

168
tunnel/README.md Normal file
View File

@@ -0,0 +1,168 @@
# tunnel/ — WireGuard-туннель VPS ↔ роутер
Решает задачу: у вас на роутере **серый IP** (нет публичного), но есть **VPS с белым IP**. Поднимаем WireGuard, и любой сервис на VPS обращается к роутеру по адресу из туннельной подсети (`10.99.0.X`), как если бы они были в одной LAN. SSH, HTTP, что угодно — без проброса портов и без переписывания других сервисов (`Domain Hydra`, `keenetic-unified`, `keenetic_ssh-web`, …).
```
[VPS, белый IP] [Роутер, серый IP]
:443 Caddy/Nginx → wg0 10.99.0.1 ⇄ wg0 10.99.0.X → 127.0.0.1:2001 (kssh-web)
127.0.0.1:22 (SSH)
…и т. д.
```
UDP `51820`, подсеть `10.99.0.0/24`. Параметры можно поменять через ENV.
---
## 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` в `ufw`, если он активен
- запускает `wg-quick@wg0` и ставит на автозапуск (`systemctl enable`)
В конце выводит:
```
Endpoint: <PUBLIC_IP>:51820/udp
PublicKey: <SERVER_PUB>
```
---
## 2. На VPS — добавление каждого роутера
```sh
sudo kssh-tun add router-andrey-1
```
Утилита:
- генерит пару ключей клиента
- выделяет следующий свободный IP в подсети (`10.99.0.2`, `10.99.0.3`, …)
- сохраняет peer-файл в `/etc/wireguard/peers/<name>.peer`
- регенерирует `wg0.conf` и применяет без рестарта (`wg syncconf`)
- **печатает готовую команду для роутера** — четыре `ENV=…` + `curl …` одной портянкой
Дополнительно:
```sh
sudo kssh-tun list # список peer-ов
sudo kssh-tun show router-andrey-1 # повторно вывести ENV-блок
sudo kssh-tun remove router-andrey-1 # удалить peer
sudo kssh-tun status # wg show wg0
```
---
## 3. На роутере (Keenetic + Entware)
Скопируйте блок из `kssh-tun add` и выполните на роутере. Пример (значения подставит `kssh-tun add`):
```sh
VPS_ENDPOINT=SERVER_IP:51820 \
VPS_PUBKEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=' \
CLIENT_IP=10.99.0.5 \
CLIENT_PRIVKEY='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=' \
sh -c "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`
- маршрутизирует `10.99.0.0/24` через `wg0`
- ставит init-скрипт `/opt/etc/init.d/S50kssh-tunnel` ({start|stop|restart|status}) и rc.d-симлинк автозапуска
- в конце пингует `10.99.0.1` (VPS) для проверки
Если ping не прошёл — почти всегда дело в фаерволе VPS: `sudo ufw allow 51820/udp` (или эквивалент для iptables/firewalld).
---
## 4. Использование туннеля
После запуска любые сервисы на VPS обращаются к роутеру по `10.99.0.X`:
```sh
# С VPS — веб-панель keenetic_ssh-web
curl http://10.99.0.5:2001/
# SSH на роутер с VPS (если у роутера включён SSH)
ssh root@10.99.0.5
# Reverse-proxy на VPS: keenetic.example.com → http://10.99.0.5:2001
# (Caddy/Nginx — прозрачно)
```
---
## Параметры (ENV)
### `server-install.sh`
| Переменная | По умолчанию | Описание |
|---|---|---|
| `WG_PORT` | `51820` | UDP-порт сервера. |
| `WG_SUBNET_PREFIX` | `10.99.0` | Первые три октета подсети `/24`. |
| `WG_SERVER_LAST_OCTET` | `1` | Последний октет адреса сервера в туннеле. |
| `KSSH_REPO` | `andrey271192/keenetic_ssh-web` | Репо, из которого ставить `kssh-tun` и `tunnel-install.sh`. |
| `KSSH_BRANCH` | `main` | Ветка. |
### `tunnel-install.sh` (на роутере)
| Переменная | Обязательная | Описание |
|---|---|---|
| `VPS_ENDPOINT` | да | `<публичный IP>:<порт>`, UDP. |
| `VPS_PUBKEY` | да | PublicKey сервера. |
| `CLIENT_IP` | да | IP роутера в туннельной подсети, например `10.99.0.5`. |
| `CLIENT_PRIVKEY` | да | PrivateKey роутера (выдаёт `kssh-tun add`). |
| `WG_IF` | `wg0` | Имя интерфейса. |
| `WG_SUBNET` | `10.99.0.0/24` | AllowedIPs клиента (что маршрутизировать в туннель). |
| `WG_KEEPALIVE` | `25` | `PersistentKeepalive` в секундах (нужен из-за NAT провайдера). |
---
## Безопасность
- WireGuard сам по себе шифрует трафик; но peer-файлы (`/etc/wireguard/peers/*.peer`) содержат **приватные ключи клиентов** в открытом виде — храните VPS чистым.
- Закройте `tunnel-install.sh`-команду от посторонних (там есть `CLIENT_PRIVKEY`). В Telegram/мессенджеры лучше не пересылать.
- `kssh-tun show <name>` всегда покажет ENV-блок снова — пароль не нужен, повторно сгенерировать ключ не получится. Если ключ утёк — `remove` и заново `add`.
- На стороне роутера `tunnel-install.sh` пишет конфиг в `/opt/etc/wireguard/wg0.conf` с правами `600`.
---
## Удаление
На VPS:
```sh
sudo kssh-tun remove <name> # для каждого клиента
sudo systemctl disable --now wg-quick@wg0
sudo apt remove --purge wireguard wireguard-tools
sudo rm -rf /etc/wireguard /usr/local/bin/kssh-tun
```
На роутере:
```sh
/opt/etc/init.d/S50kssh-tunnel stop
rm -f /opt/etc/rc.d/S50kssh-tunnel /opt/etc/init.d/S50kssh-tunnel
rm -rf /opt/etc/wireguard
```
---
## Что не входит в этот туннель
- **NAT с роутера в интернет через VPS**. Здесь VPS лишь видит роутер; чтобы роутер выходил в интернет через VPS, на сервере нужен `MASQUERADE` и `ip_forward`. Не наша цель.
- **Доступ из VPS в LAN роутера** (`192.168.1.0/24`). Если нужно — расширьте `AllowedIPs` peer-а на стороне сервера и включите `ip_forward` на роутере.
В обоих случаях скажите — добавлю в установщик ENV-флаги.