#!/usr/bin/env bash # ============================================================================= # WireGuard VPS Tunnel — точка входа клиента (домашний сервер) # Генерирует конфигурацию wg0.conf из переменных окружения и поднимает туннель. # ============================================================================= set -euo pipefail # ── Значения по умолчанию ─────────────────────────────────────────────────── CLIENT_WG_IP="${CLIENT_WG_IP:-10.0.0.2}" VPS_WG_PORT="${VPS_WG_PORT:-51820}" PERSISTENT_KEEPALIVE="${PERSISTENT_KEEPALIVE:-21}" SERVER_WG_IP="${SERVER_WG_IP:-10.0.0.1}" WG_CONF="/etc/wireguard/wg0.conf" # ── Логирование ───────────────────────────────────────────────────────────── log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$1] $*"; } # ── Проверка обязательных переменных ─────────────────────────────────────── check_required() { if [[ -z "${VPS_PUBLIC_IP:-}" ]]; then log "ERROR" "VPS_PUBLIC_IP не задан. Укажите публичный IP VPS." exit 1 fi if [[ -z "${SERVER_PUBLIC_KEY:-}" ]]; then log "ERROR" "SERVER_PUBLIC_KEY не задан. Укажите публичный ключ сервера." exit 1 fi } # ── Генерация ключей ─────────────────────────────────────────────────────── generate_keys() { local private_key_file="/etc/wireguard/client_private.key" local public_key_file="/etc/wireguard/client_public.key" if [[ -f "$private_key_file" ]] && [[ -f "$public_key_file" ]]; then log "INFO" "Ключи клиента уже существуют" else log "INFO" "Генерация ключей клиента..." wg genkey | tee "$private_key_file" | wg pubkey > "$public_key_file" chmod 600 "$private_key_file" log "INFO" "Ключи клиента сгенерированы" fi CLIENT_PRIVATE_KEY=$(cat "$private_key_file") CLIENT_PUBLIC_KEY=$(cat "$public_key_file") } # ── Создание конфигурации WireGuard ──────────────────────────────────────── create_wg_config() { # Всегда пересоздаём конфиг — ключи или эндпоинт могли измениться if [[ -f "$WG_CONF" ]]; then log "INFO" "Обновление конфигурации ${WG_CONF}..." rm -f "$WG_CONF" fi mkdir -p "$(dirname "$WG_CONF")" cat > "$WG_CONF" </dev/null; then log "INFO" "Удаление старого интерфейса wg0..." ip link del wg0 2>/dev/null || true sleep 1 fi wg-quick up wg0 log "INFO" "WireGuard интерфейс wg0 запущен" log "INFO" "Публичный ключ клиента: ${CLIENT_PUBLIC_KEY}" log "INFO" "Скопируйте его на сервер: CLIENT_PUBLIC_KEY=${CLIENT_PUBLIC_KEY}" } # ── Главная функция ──────────────────────────────────────────────────────── main() { log "INFO" "=== Запуск WireGuard VPS Tunnel (клиент) ===" log "INFO" "CLIENT_WG_IP=${CLIENT_WG_IP}" log "INFO" "VPS_PUBLIC_IP=${VPS_PUBLIC_IP}" log "INFO" "VPS_WG_PORT=${VPS_WG_PORT}" log "INFO" "PERSISTENT_KEEPALIVE=${PERSISTENT_KEEPALIVE}" check_required generate_keys create_wg_config start_wireguard # Запуск watchdog в фоне log "INFO" "Запуск watchdog..." /watchdog.sh & log "INFO" "Клиент запущен. Ожидание..." exec sleep infinity } main