8.3 KiB
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) — один раз
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вufw, если он активен - запускает
wg-quick@wg0и ставит на автозапуск (systemctl enable)
В конце выводит:
Endpoint: <PUBLIC_IP>:51820/udp
PublicKey: <SERVER_PUB>
2. На VPS — добавление каждого роутера
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 …одной портянкой
Дополнительно:
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 строк, можно блоком, можно по одной):
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-симлинк автозапуска - автоматически добавляет точечный DNAT: вход на
wg0:81→LAN_IP:81(помогает Keenetic‑админке/HTTP Proxy открываться через туннель; удаляется uninstall‑скриптом) - в конце пингует
10.99.0.1(VPS) для проверки
Если ping не прошёл — почти всегда дело в фаерволе VPS: sudo ufw allow 51820/udp (или эквивалент для iptables/firewalld).
4. Использование туннеля
После запуска любые сервисы на VPS обращаются к роутеру по 10.99.0.X:
# С 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 провайдера). |
DNAT_PORTS |
81 |
Порты через запятую, для которых делаем авто‑DNAT wg0:port → LAN_IP:port (исправляет Connection refused, когда сервис слушает только на LAN‑IP). Пример: DNAT_PORTS=81,79. |
Безопасность
- 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:
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
На роутере:
/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). Если нужно — расширьтеAllowedIPspeer-а на стороне сервера и включитеip_forwardна роутере.
В обоих случаях скажите — добавлю в установщик ENV-флаги.