| #!/bin/bash |
| set -e |
|
|
| |
| WG_CONF_TEMPLATE="/etc/wireguard/wg0.conf.template" |
| WG_CONF="/etc/wireguard/wg0.conf" |
| VPN_SUBNET_BASE="10.8.0" |
|
|
| |
| if [ -z "${SERVER_PRIVATE_KEY}" ]; then |
| echo "Секрет SERVER_PRIVATE_KEY не найден. Генерирую новую пару ключей..." |
| |
| SERVER_PRIVATE_KEY=$(wg genkey) |
| echo "ВАЖНО: Сохраните этот приватный ключ, если хотите перезапустить Space с той же конфигурацией." |
| echo "SERVER_PRIVATE_KEY: ${SERVER_PRIVATE_KEY}" |
| else |
| echo "Использую приватный ключ сервера из секрета." |
| fi |
|
|
| |
| SERVER_PUBLIC_KEY=$(echo "${SERVER_PRIVATE_KEY}" | wg pubkey) |
| echo "=============================================================" |
| echo "Публичный ключ сервера (Server Public Key):" |
| echo "${SERVER_PUBLIC_KEY}" |
| echo "=============================================================" |
|
|
|
|
| |
| cp "${WG_CONF_TEMPLATE}" "${WG_CONF}" |
|
|
| |
| sed -i "s|__SERVER_PRIVATE_KEY__|${SERVER_PRIVATE_KEY}|g" "${WG_CONF}" |
|
|
|
|
| |
| echo "Поиск публичных ключей клиентов в секретах (CLIENT_PUBLIC_KEY_1, _2, ...)" |
| CLIENT_PEERS_CONFIG="" |
| CLIENT_COUNT=0 |
|
|
| |
| for i in {1..20}; do |
| |
| CLIENT_KEY_VAR="CLIENT_PUBLIC_KEY_${i}" |
| |
| |
| if [ -n "${!CLIENT_KEY_VAR}" ]; then |
| CLIENT_COUNT=$((CLIENT_COUNT + 1)) |
| CLIENT_PUBLIC_KEY="${!CLIENT_KEY_VAR}" |
| |
| CLIENT_IP="${VPN_SUBNET_BASE}.$((i + 1))/32" |
|
|
| echo "Найден клиент #${i} с IP ${CLIENT_IP}" |
|
|
| |
| CLIENT_PEERS_CONFIG+=$(cat <<EOF |
| |
| [Peer] |
| # Клиент ${i} |
| PublicKey = ${CLIENT_PUBLIC_KEY} |
| AllowedIPs = ${CLIENT_IP} |
| EOF |
| ) |
| fi |
| done |
|
|
| if [ ${CLIENT_COUNT} -eq 0 ]; then |
| echo "ПРЕДУПРЕЖДЕНИЕ: Не найдено ни одного секрета клиента (CLIENT_PUBLIC_KEY_...). Сервер запустится, но никто не сможет подключиться." |
| else |
| |
| |
| REPLACEMENT=$(echo "${CLIENT_PEERS_CONFIG}" | tr '\n' '\r') |
| sed -i "s|# __CLIENT_PEERS__|${REPLACEMENT}|g" "${WG_CONF}" |
| |
| sed -i 's/\r/\n/g' "${WG_CONF}" |
| fi |
|
|
| echo "Финальная конфигурация сервера (/etc/wireguard/wg0.conf):" |
| cat "${WG_CONF}" |
| echo "-------------------------------------------------------------" |
|
|
|
|
| |
| echo "================== КОНФИГУРАЦИЯ ДЛЯ КЛИЕНТА ==================" |
| echo "Используйте эту информацию для настройки вашего клиента." |
| echo "ВАЖНО: Endpoint Hostname - это адрес вашего Space (${SPACE_HOST})." |
| echo "ВАЖНО: Endpoint Port - это ПЕРЕНАЗНАЧЕННЫЙ порт. Ищите его в логах выше (строка 'remaped port 51820 into ...')." |
| echo "" |
| echo "[Interface]" |
| echo "PrivateKey = <ВАШ_КЛИЕНТСКИЙ_ПРИВАТНЫЙ_КЛЮЧ>" |
| echo "Address = ${VPN_SUBNET_BASE}.2/32 # (для клиента 1, для клиента 2 будет 10.8.0.3 и т.д.)" |
| echo "DNS = 1.1.1.1" |
| echo "" |
| echo "[Peer]" |
| echo "PublicKey = ${SERVER_PUBLIC_KEY}" |
| echo "AllowedIPs = 0.0.0.0/0, ::/0" |
| echo "Endpoint = ${SPACE_HOST}:<ВНЕШНИЙ_ПОРТ_ИЗ_ЛОГОВ>" |
| echo "PersistentKeepalive = 25" |
| echo "=============================================================" |
|
|
|
|
| |
| shutdown() { |
| echo "Остановка WireGuard сервера..." |
| wg-quick down "${WG_CONF}" |
| exit 0 |
| } |
| trap 'shutdown' SIGTERM SIGINT |
|
|
| echo "Запуск WireGuard сервера на интерфейсе wg0..." |
| wg-quick up "${WG_CONF}" |
|
|
| echo "Сервер WireGuard запущен. Контейнер работает." |
|
|
| |
| tail -f /dev/null |