Резервное копирование и DR: WireGuard Relay wg_check wg_fvpn

Руководство, адаптированное под конфигурацию каскадного VPN (серверная часть wg_check с пирами 10.20.99.x + транзитный зарубежный шлюз wg_fvpn).

1 Архитектура вашей конфигурации

На основе диагностических данных wg show ваш сервер работает по схеме транзитного шлюза (VPN-over-VPN):

[Клиенты: 10.20.99.x] │ ▼ (Входящий порт UDP 51820) ┌────────────────────────────────────────────────────────┐ │ ИНТЕРФЕЙС 1: wg_check (Сервер) │ │ Подсеть: 10.20.99.0/24 │ │ Конфиг: /etc/wireguard/wg_check.conf │ │ Пиры: десятки клиентов (10.20.99.2 ... 10.20.99.77) │ └──────────────────────────┬─────────────────────────────┘ │ Маршрутизация ядра (ip_forward) ▼ ┌────────────────────────────────────────────────────────┐ │ ИНТЕРФЕЙС 2: wg_fvpn (Uplink клиент к внешнему VPN) │ │ Конфиг: /etc/wireguard/wg_fvpn.conf │ │ Порт прослушивания: 59808 │ │ Внешний пир (Endpoint): 148.253.214.253:51820 │ │ AllowedIPs: 0.0.0.0/0 (Весь трафик уходит сюда!) │ └──────────────────────────┬─────────────────────────────┘ │ 171+ GiB трафика ▼ [Зарубежный Интернет]
Интерфейс Файл конфига Служба systemd Роль и настройки
wg_check /etc/wireguard/wg_check.conf wg-quick@wg_check Серверный узел. Слушает порт 51820. Хранит всех пользователей сети 10.20.99.0/24.
wg_fvpn /etc/wireguard/wg_fvpn.conf wg-quick@wg_fvpn Uplink-туннель. Подключается к серверу 148.253.214.253:51820 с маршрутом 0.0.0.0/0.
Защита от смены IP для всех клиентов wg_check

Убедитесь, что в конфигурациях всех ваших клиентов (10.20.99.x) в поле Endpoint указан домен, а не "голый" IP-адрес:

Endpoint = vpn.yourdomain.com:51820

Если ваш текущий VPS сгорит, вы развернете бэкап на новом VPS, измените A-запись домена на новый IP, и все пиры подключатся автоматически без ручной перенастройки клиентов!

2 Что входит в состав бэкапа

Для мгновенного восстановления обеих частей цепочки необходимо сохранить:

Внимание: конфиденциальность ключей
В wg_fvpn.conf хранится закрытый ключ туннеля к зарубежному серверу, а в wg_check.conf — закрытый ключ сервера. Архив обязательно шифруется перед отправкой в любые каналы связи.

3 Скрипт резервного копирования (/usr/local/bin/wg-backup.sh)

Создайте исполняемый файл /usr/local/bin/wg-backup.sh, который упаковывает всю директорию WireGuard с сохранением прав (-p) и шифрует архив через OpenSSL AES-256.

#!/usr/bin/env bash
# /usr/local/bin/wg-backup.sh
# Бэкап WireGuard: wg_check (клиенты) + wg_fvpn (uplink)
set -eo pipefail

# ================= НАСТРОЙКИ =================
BACKUP_PASS="УКАЖИТЕ_СВОЙ_СЛОЖНЫЙ_ПАРОЛЬ"  # Запомните его для расшифровки!
BACKUP_DIR="/tmp/wg_backup_tmp"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE_TAR="$BACKUP_DIR/wg_backup_$TIMESTAMP.tar.gz"
ARCHIVE_ENC="/var/backups/wireguard/wg_backup_$TIMESTAMP.tar.gz.enc"

# Опционально: Отправка копии в Telegram
# TG_BOT_TOKEN="ВАШ_ТОКЕН_БОТА"
# TG_CHAT_ID="ВАШ_CHAT_ID"

# Опционально: Выгрузка в облако через rclone (Яндекс Диск / Google Drive / S3)
# RCLONE_DEST="mycloud:vps_backups/wireguard"

# ================= ШАГ 1: ПОДГОТОВКА =================
mkdir -p "$BACKUP_DIR" /var/backups/wireguard
chmod 700 "$BACKUP_DIR" /var/backups/wireguard

# Фиксируем текущий статус и таблицы маршрутизации
wg show > "$BACKUP_DIR/wg_show_dump.txt" 2>/dev/null || true
ip route show > "$BACKUP_DIR/ip_route_dump.txt" 2>/dev/null || true
iptables-save > "$BACKUP_DIR/iptables_dump.txt" 2>/dev/null || true

# ================= ШАГ 2: АРХИВАЦИЯ =================
# Сохраняем всю папку /etc/wireguard (включая wg_check.conf, wg_fvpn.conf и ключи)
tar -czpf "$ARCHIVE_TAR" \
    -C / \
    etc/wireguard \
    etc/sysctl.conf \
    etc/sysctl.d/99-wireguard.conf 2>/dev/null || \
tar -czpf "$ARCHIVE_TAR" \
    -C / \
    etc/wireguard

# ================= ШАГ 3: ШИФРОВАНИЕ (AES-256) =================
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
    -in "$ARCHIVE_TAR" \
    -out "$ARCHIVE_ENC" \
    -k "$BACKUP_PASS"

chmod 600 "$ARCHIVE_ENC"

# ================= ШАГ 4: ОТПРАВКА =================
# Вариант 1: Telegram (архив весит всего 15-50 Кб)
# if [ -n "$TG_BOT_TOKEN" ] && [ -n "$TG_CHAT_ID" ]; then
#     curl -s -F chat_id="$TG_CHAT_ID" \
#          -F caption="Резервная копия WG (wg_check + wg_fvpn) [$TIMESTAMP]" \
#          -F document=@"$ARCHIVE_ENC" \
#          "https://api.telegram.org/bot$TG_BOT_TOKEN/sendDocument" > /dev/null
# fi

# Вариант 2: Rclone
# if command -v rclone &> /dev/null && [ -n "$RCLONE_DEST" ]; then
#     rclone copy "$ARCHIVE_ENC" "$RCLONE_DEST"
#     rclone delete --min-age 30d "$RCLONE_DEST"
# fi

# Хранить на сервере последние 14 копий
find /var/backups/wireguard/ -name "wg_backup_*.tar.gz.enc" -type f -mtime +14 -delete

# Очистка временных файлов
rm -rf "$BACKUP_DIR"

echo "[$TIMESTAMP] Бэкап создан: $ARCHIVE_ENC"

Права и автозапуск по расписанию:

chmod 700 /usr/local/bin/wg-backup.sh

# Добавляем в cron (каждую ночь в 03:00)
(crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/wg-backup.sh >> /var/log/wg-backup.log 2>&1") | crontab -

4 Скрипт быстрого восстановления (/root/wg-restore.sh)

На чистом новом сервере (Debian 12 / Ubuntu 22.04 / 24.04) этот скрипт разворачивает все компоненты, адаптирует имя сетевой карты под новый хостинг и поднимает туннели в правильном порядке.

#!/usr/bin/env bash
# /root/wg-restore.sh
# Восстановление связки wg_fvpn + wg_check с автоподстройкой сети
set -eo pipefail

if [ -z "$1" ]; then
    echo "Использование: $0 <файл_бэкапа.tar.gz.enc>"
    exit 1
fi

ENC_FILE="$1"
TMP_TAR="/tmp/restore_wg.tar.gz"

echo "=== 1. Установка пакетов WireGuard и утилит маршрутизации ==="
apt-get update
apt-get install -y wireguard iptables iptables-persistent resolvconf curl

echo "=== 2. Расшифровка архива ==="
read -s -p "Введите пароль шифрования бэкапа: " PASS
echo ""

openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 \
    -in "$ENC_FILE" \
    -out "$TMP_TAR" \
    -k "$PASS"

echo "=== 3. Распаковка конфигураций ==="
tar -xzpf "$TMP_TAR" -C /
rm -f "$TMP_TAR"

# Восстанавливаем строгие права
chmod 700 /etc/wireguard
chmod 600 /etc/wireguard/*

echo "=== 4. Настройка ядра (IP Forwarding) ==="
cat << 'EOF' > /etc/sysctl.d/99-wireguard.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --system > /dev/null

echo "=== 5. Адаптация внешнего интерфейса (WAN) ==="
NEW_WAN=$(ip route show default | awk '{print $5}' | head -n1)
echo "Новый физический интерфейс сервера: $NEW_WAN"

# Корректируем PostUp/PostDown, если там было жестко зашито старое имя карты
for cfg in /etc/wireguard/wg_check.conf /etc/wireguard/wg_fvpn.conf; do
    if [ -f "$cfg" ]; then
        sed -i -E "s/-o (eth[0-9]+|ens[0-9]+|enp[0-9]+s[0-9]+)/-o $NEW_WAN/g" "$cfg"
    fi
done

echo "=== 6. Запуск служб в строгом порядке ==="
# Сначала запускаем Uplink-шлюз (wg_fvpn)
echo "Запуск wg_fvpn (Uplink)..."
systemctl enable --now wg-quick@wg_fvpn

# Пауза 2 секунды для установки маршрутов
sleep 2

# Затем запускаем серверную часть для клиентов (wg_check)
echo "Запуск wg_check (Сервер для клиентов)..."
systemctl enable --now wg-quick@wg_check

echo "=== 7. Проверка состояния туннелей ==="
wg show

echo "=========================================================="
echo "ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНО УСПЕШНО!"
echo "1. Проверьте, что в 'wg show' для wg_fvpn появился handshake."
echo "2. Новый IP сервера: $(curl -s https://ifconfig.me || ip -4 addr show $NEW_WAN | grep -oP '(?<=inet\s)\d+(\.\d+){3}')"
echo "3. Обновите DNS A-запись (vpn.yourdomain.com) на этот IP."
echo "=========================================================="

5 Нюансы транзитной маршрутизации (wg_check → wg_fvpn)

Поскольку клиенты приходят на wg_check, а выходят в интернет через wg_fvpn, проверьте секцию PostUp в ваших текущих файлах конфигов.

Как работает NAT для транзита:
В секции [Interface] файла /etc/wireguard/wg_check.conf правило маскарадинга направляет трафик клиентов подсети 10.20.99.0/24 в интерфейс wg_fvpn:
PostUp = iptables -A FORWARD -i wg_check -o wg_fvpn -j ACCEPT; iptables -A FORWARD -i wg_fvpn -o wg_check -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.20.99.0/24 -o wg_fvpn -j MASQUERADE
PostDown = iptables -D FORWARD -i wg_check -o wg_fvpn -j ACCEPT; iptables -D FORWARD -i wg_fvpn -o wg_check -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.20.99.0/24 -o wg_fvpn -j MASQUERADE
(В вашем бэкапе эти настройки уже сохранены внутри wg_check.conf и при распаковке применятся автоматически).
Что делать, если внешний VPN (148.253.214.253) перестанет отвечать?
Если зарубежный хост 148.253.214.253 будет заблокирован или выйдет из строя:
  • Хендшейк на wg_fvpn пропадет.
  • У клиентов wg_check пропадет интернет (хотя подключение к вашему серверу сохранится).
  • В этом случае достаточно обновить настройки только в /etc/wireguard/wg_fvpn.conf (новый Endpoint и ключи зарубежного провайдера) и перезапустить: systemctl restart wg-quick@wg_fvpn. Пиров перенастраивать не потребуется!

6 Чек-лист экстренного переезда за 3 шага

  1. Новый сервер: Арендуйте VPS у любого хостинга (Debian/Ubuntu) и загрузите файл бэкапа и wg-restore.sh.
  2. Восстановление: Запустите bash wg-restore.sh wg_backup_xxx.tar.gz.enc и введите пароль. Скрипт сам поставит WireGuard, восстановит ключи, подправит сетевую карту и запустит сначала wg_fvpn, а затем wg_check.
  3. DNS: Зайдите в DNS (Cloudflare / регистратор) и смените IP в A-записи вашего домена (например, vpn.domain.com) на новый IP-адрес.

Все пиры (10.20.99.x) восстановят доступ к интернету через зарубежный туннель без вашего вмешательства.