- install.sh: интерактивный + неинтерактивный (--vps/--client) установщик - watchdog.sh: Starlink-оптимизированный мониторинг с backoff - uninstall.sh: полная очистка - README.md: документация на русском языке Архитектура: VPS (10.0.0.1) ←WireGuard UDP→ RPi (10.0.0.2) DNAT портов 80/443 с VPS на RPi через iptables PersistentKeepalive 21с для Starlink/NAT
12 KiB
12 KiB
WireGuard VPS Tunnel — 1-Click Installer
Автоматическая настройка WireGuard-туннеля между VPS (с публичным IP) и домашним сервером за NAT (Raspberry Pi, Orange Pi, Starlink и т.д.).
Архитектура
Интернет
│
┌────────┴────────┐
│ VPS (сервер) │
│ Публичный IP │
│ например: │
│ 2.59.219.234 │
│ │
│ wg0: 10.0.0.1 │
│ :51820 (UDP) │
│ │
│ iptables DNAT: │
│ :80 → 10.0.0.2 │
│ :443 → 10.0.0.2 │
└────────┬────────┘
│
╔═════════════╧═════════════╗
║ WireGuard UDP :51820 ║
║ (PersistentKeepalive=21)║
╚═════════════╤═════════════╝
│
┌────────┴────────┐
│ Домашний сервер │
│ (за NAT/CGNAT) │
│ Raspberry Pi │
│ Starlink │
│ │
│ wg0: 10.0.0.2 │
│ │
│ Watchdog │
│ (мониторинг) │
└────────┬────────┘
│
┌────────┴────────┐
│ Nginx Proxy │
│ Manager :80,443│
│ → backend │
└─────────────────┘
Как это работает:
- VPS принимает входящие соединения на порты 80 и 443
- iptables перенаправляет трафик через WireGuard-туннель на домашний сервер (10.0.0.2)
- Домашний сервер (RPi) инициирует соединение с VPS — работает через любой NAT
PersistentKeepalive = 21секунда поддерживает туннель активным даже при отсутствии трафика- Watchdog на RPi мониторит состояние туннеля и перезапускает при обрыве
Быстрый старт (1 команда)
На VPS:
curl -sSL https://raw.githubusercontent.com/user/wireguard-vps-tunnel/main/install.sh | sudo bash
# Выбрать "1) VPS"
На домашнем сервере (Raspberry Pi):
curl -sSL https://raw.githubusercontent.com/user/wireguard-vps-tunnel/main/install.sh | sudo bash
# Выбрать "2) Домашний сервер"
Или неинтерактивный режим:
# VPS
sudo ./install.sh --vps --ports 80,443
# Клиент
sudo ./install.sh --client --vps-ip 2.59.219.234 --keepalive 21
Ручная установка
1. Клонирование репозитория
git clone https://github.com/user/wireguard-vps-tunnel.git
cd wireguard-vps-tunnel
2. Установка на VPS
sudo ./install.sh --vps --vps-ip 2.59.219.234 --ports 80,443
Скрипт автоматически:
- Установит
wireguard-tools - Сгенерирует ключи
- Настроит
wg0интерфейс - Настроит iptables (DNAT + FORWARD)
- Включит IP-форвардинг
- Запустит systemd-сервис
3. Установка на домашний сервер
sudo ./install.sh --client --vps-ip 2.59.219.234 --keepalive 21
Скрипт автоматически:
- Установит
wireguard-tools - Сгенерирует ключи
- Настроит
wg0интерфейс - Установит watchdog для мониторинга туннеля
- Запустит systemd-сервисы
4. Проверка
# На VPS
ping 10.0.0.2
# На домашнем сервере
ping 10.0.0.1
Конфигурация
Все настройки сохраняются в /etc/wireguard-vps-tunnel/config:
MODE="vps" # vps или client
VPS_PUBLIC_IP="2.59.219.234"
CLIENT_WG_IP="10.0.0.2"
SERVER_WG_IP="10.0.0.1"
WG_PORT="51820"
PORTS="80,443"
KEEPALIVE="21"
Ключи хранятся в /etc/wireguard-vps-tunnel/:
server_private.key/server_public.keyclient_private.key/client_public.key
Опции командной строки
| Опция | Описание | По умолчанию |
|---|---|---|
--vps |
Режим VPS (сервер) | — |
--client |
Режим клиента (домашний сервер) | — |
--vps-ip IP |
Публичный IP VPS | автоопределение |
--client-wg-ip IP |
WireGuard IP клиента | 10.0.0.2 |
--ports PORT,... |
Порты для проброса (VPS) | 80,443 |
--wg-port PORT |
Порт WireGuard | 51820 |
--keepalive SEC |
PersistentKeepalive (сек) | 21 |
--help |
Справка | — |
Watchdog (мониторинг туннеля)
Watchdog работает только на клиенте (домашний сервер) и выполняет:
- Проверяет, что интерфейс
wg0поднят - Проверяет доступность VPS через туннель (
ping 10.0.0.1) - Проверяет доступность VPS через интернет (
ping VPS_IP) - Если туннель не работает, но VPS доступен — перезапускает WireGuard
- Использует экспоненциальную отсрочку при повторных сбоях:
- 10с → 20с → 40с → 80с → 120с (максимум)
- После 3 успешных проверок подряд сбрасывает отсрочку
Логи: /var/log/wg-watchdog.log (авторотация при 10 МБ)
Управление:
systemctl status wg-watchdog # Статус
systemctl restart wg-watchdog # Перезапуск
tail -f /var/log/wg-watchdog.log # Логи в реальном времени
Сравнение: WireGuard vs SSH Reverse Tunnel
| Критерий | WireGuard | SSH Reverse Tunnel |
|---|---|---|
| Протокол | UDP (kernel) | TCP (userspace) |
| Производительность | ~1 Gbps | ~100 Mbps |
| Задержка | Минимальная | TCP-over-TCP проблема |
| Starlink | ✅ Оптимально (UDP) | ❌ Плохо (TCP через TCP) |
| Переподключение | Мгновенное | Заметная задержка |
| NAT traversal | PersistentKeepalive | Autossh + мониторинг |
| Проброс портов | iptables DNAT | ssh -R |
| Отказоустойчивость | Встроенная | Требует autossh |
| Нагрузка на CPU | Минимальная (kernel) | Заметная (шифрование в userspace) |
Вывод: WireGuard превосходит SSH reverse tunnel по всем параметрам для production-использования, особенно на Starlink.
Starlink: особенности
Starlink использует CGNAT (Carrier-Grade NAT), что означает:
- Нет публичного IPv4 — домашний сервер недоступен из интернета напрямую
- Высокая задержка — 25-60 мс (спутниковая связь)
- Кратковременные обрывы — при переключении между спутниками
- UDP работает лучше TCP — меньше проблем с TCP congestion control
Рекомендации для Starlink:
PersistentKeepalive = 21— оптимальное значение (каждые 21 сек отправляет keepalive-пакет)- Watchdog обязателен — автоматически восстанавливает туннель после обрывов
- Не используйте SSH reverse tunnel — TCP-over-TCP на спутниковом канале работает плохо
- MTU = 1420 (стандартный для WireGuard) — не меняйте без необходимости
Безопасность
- Ключи: приватные ключи хранятся с правами
600(только root) - Фаервол: iptables правила применяются атомарно через
PostUp/PostDown - SSH: парольная аутентификация НЕ отключается — скрипт не трогает sshd_config
- Порты: открываются только указанные порты (по умолчанию 80 и 443)
- WireGuard: использует современную криптографию (Curve25519, ChaCha20, BLAKE2s)
Рекомендации по усилению безопасности:
# На VPS: ограничить доступ к порту WireGuard только с IP клиента (если известен)
iptables -A INPUT -p udp --dport 51820 -s <IP_КЛИЕНТА> -j ACCEPT
iptables -A INPUT -p udp --dport 51820 -j DROP
# Или ограничить rate limiting:
iptables -A INPUT -p udp --dport 51820 -m limit --limit 10/sec -j ACCEPT
iptables -A INPUT -p udp --dport 51820 -j DROP
Устранение неполадок
Туннель не поднимается
# Проверить статус
systemctl status wg-quick@wg0
# Проверить конфигурацию
wg show
# Проверить логи
journalctl -u wg-quick@wg0 -n 50
Пинг не проходит
# Проверить что интерфейс поднят
ip link show wg0
# Проверить IP-адреса
ip addr show wg0
# Проверить что порт открыт на VPS
# На клиенте:
nc -zvu <VPS_IP> 51820
Порты не пробрасываются
# Проверить правила iptables на VPS
iptables -t nat -L PREROUTING -n
iptables -L FORWARD -n
# Проверить IP-форвардинг
sysctl net.ipv4.ip_forward # Должно быть = 1
Watchdog не запускается
systemctl status wg-watchdog
journalctl -u wg-watchdog -n 50
cat /var/log/wg-watchdog.log
Полный сброс и переустановка
# Деинсталляция
sudo ./uninstall.sh
# Переустановка
sudo ./install.sh --vps --vps-ip <IP>
Деинсталляция
sudo ./uninstall.sh
Опции:
--remove-package— также удалить пакетwireguard-tools
Деинсталлятор:
- Останавливает и отключает сервисы
- Удаляет интерфейс
wg0 - Очищает правила iptables
- Удаляет конфигурационные файлы и ключи
- НЕ трогает SSH-сервер и другие сервисы
Поддерживаемые ОС
- Debian 11+ (Bullseye, Bookworm)
- Ubuntu 20.04+ (Focal, Jammy, Noble)
- Armbian (Orange Pi, Banana Pi, etc.)
- Raspberry Pi OS (Raspbian)
Структура проекта
wireguard-vps-tunnel/
├── install.sh # Основной установщик
├── uninstall.sh # Деинсталлятор
├── watchdog.sh # Watchdog для мониторинга туннеля
└── README.md # Документация
Лицензия
MIT