Руководство, адаптированное под конфигурацию каскадного VPN (серверная часть wg_check с пирами 10.20.99.x + транзитный зарубежный шлюз wg_fvpn).
На основе диагностических данных wg show ваш сервер работает по схеме транзитного шлюза (VPN-over-VPN):
| Интерфейс | Файл конфига | Служба 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. |
Убедитесь, что в конфигурациях всех ваших клиентов (10.20.99.x) в поле Endpoint указан домен, а не "голый" IP-адрес:
Endpoint = vpn.yourdomain.com:51820
Если ваш текущий VPS сгорит, вы развернете бэкап на новом VPS, измените A-запись домена на новый IP, и все пиры подключатся автоматически без ручной перенастройки клиентов!
Для мгновенного восстановления обеих частей цепочки необходимо сохранить:
/etc/wireguard/wg_check.conf — все клиентские публичные ключи, IP и preshared-ключи./etc/wireguard/wg_fvpn.conf — приватный ключ этого сервера и параметры подключения к внешнему шлюзу 148.253.214.253./etc/wireguard/.net.ipv4.ip_forward=1).wg_fvpn.conf хранится закрытый ключ туннеля к зарубежному серверу, а в wg_check.conf — закрытый ключ сервера. Архив обязательно шифруется перед отправкой в любые каналы связи.
Создайте исполняемый файл /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 -
На чистом новом сервере (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 "=========================================================="
Поскольку клиенты приходят на wg_check, а выходят в интернет через wg_fvpn, проверьте секцию PostUp в ваших текущих файлах конфигов.
[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 и при распаковке применятся автоматически).
148.253.214.253 будет заблокирован или выйдет из строя:
wg_fvpn пропадет.wg_check пропадет интернет (хотя подключение к вашему серверу сохранится)./etc/wireguard/wg_fvpn.conf (новый Endpoint и ключи зарубежного провайдера) и перезапустить: systemctl restart wg-quick@wg_fvpn. Пиров перенастраивать не потребуется!wg-restore.sh.bash wg-restore.sh wg_backup_xxx.tar.gz.enc и введите пароль. Скрипт сам поставит WireGuard, восстановит ключи, подправит сетевую карту и запустит сначала wg_fvpn, а затем wg_check.vpn.domain.com) на новый IP-адрес.Все пиры (10.20.99.x) восстановят доступ к интернету через зарубежный туннель без вашего вмешательства.