Files
keenetic_ssh-web/tunnel/README.md
Андрей Бобырев 677fcc604a tunnel: ufw allow on wg0 + клиент по умолчанию маршрутит только VPS (/32)
После handshake траффик упирался в UFW на сервере (открывали только
51820/udp, не сам интерфейс wg0). Добавляем `ufw allow in/out on wg0`
в server-install.sh — теперь ICMP/HTTP/SSH внутри туннеля проходят.

На клиенте AllowedIPs по умолчанию = 10.99.0.1/32 (только сам VPS),
а не /24. Это устраняет возможный конфликт с существующими маршрутами
для 10.99.0.0/24, если у Keenetic другие WG-интерфейсы используют ту
же подсеть. Hub-and-spoke (роутер→VPS) — типичный сценарий, /32
достаточно. Кому нужен peer-to-peer через хаб — WG_SUBNET=10.99.0.0/24.
2026-04-26 12:09:43 +03:00

169 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` и выполните на роутере (5 строк, можно блоком, можно по одной):
```sh
export VPS_ENDPOINT=SERVER_IP:51820
export VPS_PUBKEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx='
export CLIENT_IP=10.99.0.5
export CLIENT_PRIVKEY='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy='
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.1/32` | AllowedIPs клиента (что маршрутизировать в туннель). По умолчанию только VPS, чтобы не конфликтовать с существующими WG-маршрутами Keenetic. Поставьте `10.99.0.0/24` если нужно общение peer-to-peer. |
| `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-флаги.