Быстрый старт Сеть Обновлено 6 Docker

WireGuard в Docker на VPS: автоматизация деплоя

Пошаговое руководство по автоматизированному развёртыванию WireGuard в Docker на VPS: docker-compose, sysctl, резервное копирование и обновление.

WireGuardDockerVPSдеплойавтоматизация
Схема сетевого шлюза WireGuard на VPS
WireGuard в Docker на VPS: автоматизация деплоя
Содержание
КороткоАвтоматизация деплоя WireGuard в Docker сводится к использованию docker-compose, передаче конфигурации через переменные окружения и монтированию каталогов с ключами. Важно настроить sysctl, capabilities и периодически обновлять контейнер.

WireGuard — современный VPN-протокол, который легко развернуть на VPS. Использование Docker упрощает установку и изоляцию, а автоматизация деплоя позволяет быстро воспроизводить конфигурацию на новых серверах или обновлять существующие. В этой статье разберём, как автоматизировать запуск WireGuard в Docker-контейнере, настроить клиентов и обеспечить надёжную работу без ручного вмешательства.

Зачем автоматизировать деплой WireGuard в Docker

Ручная установка WireGuard на VPS требует компиляции модулей или установки пакетов, зависит от дистрибутива и версии ядра. Docker абстрагирует этот процесс: контейнер содержит все зависимости, а конфигурация хранится в понятном виде. Автоматизация деплоя даёт несколько преимуществ:

  • Воспроизводимость: один файл docker-compose.yml и каталог с конфигами позволяют развернуть VPN за минуты.
  • Обновление: достаточно пересоздать контейнер с новой версией образа.
  • Управление через git: конфигурацию можно версионировать и отслеживать изменения.

Рекомендуется использовать docker-compose, так как он позволяет декларативно описать сервис, volumes, порты и переменные окружения. Для автоматического обновления можно добавить Watchtower — инструмент, который периодически проверяет новые версии образов и перезапускает контейнеры. Но это опционально.

Подготовка VPS и установка Docker

Параметры сетевого интерфейса WireGuard на сервере
WireGuard в Docker на VPS: автоматизация деплоя

Прежде чем разворачивать WireGuard, убедитесь, что VPS работает под управлением Linux (Ubuntu, Debian или CentOS). Для работы WireGuard требуется загруженный модуль ядра wireguard. В большинстве современных ядер он уже есть, но на старых или кастомных ядрах его может не быть. Проверьте:

modprobe wireguard && lsmod | grep wireguard

Если модуль не загружается, обновите ядро или используйте дистрибутив с поддержкой WireGuard. Для установки Docker выполните официальный скрипт или следуйте документации для вашего дистрибутива. Проверьте версию Docker для вашей системы:

curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker

Добавьте пользователя в группу docker, чтобы не использовать sudo: sudo usermod -aG docker $USER, затем выйдите и зайдите заново. Проверьте установку: docker --version.

Конфигурация WireGuard через docker-compose

Создайте директорию для проекта, например ~/wireguard, и внутри создайте файл docker-compose.yml. В качестве образа возьмём популярный linuxserver/wireguard — он поддерживает аmtu и настройку через переменные окружения. Этот образ активно обновляется и содержит всё необходимое.

version: "3.8"
services:
  wireguard:
    image: linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - SERVERURL=vpn.example.com
      - SERVERPORT=51820
      - PEERS=5               # количество клиентов
      - PEERDNS=8.8.8.8
      - INTERNAL_SUBNET=10.13.13.0
      - ALLOWEDIPS=0.0.0.0/0  # весь трафик
    volumes:
      - ./config:/config
    ports:
      - "51820:51820/udp"
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped

Перед запуском измените SERVERURL на публичный IP вашего VPS или доменное имя. Переменная PEERS определяет, сколько клиентских конфигураций будет сгенерировано автоматически. Образ создаст приватные и публичные ключи в каталоге config.

Обратите внимание на sysctls: они разрешают передачу трафика (IP forwarding) и необходимы для работы VPN. Если ваш провайдер или панель управления VPS блокирует изменение sysctl, проверьте, что параметры прописаны в /etc/sysctl.conf на хосте.

Запустите контейнер:

docker compose up -d

Логи сгенерированных клиентских конфигов появятся в папке config/peerX. При необходимости можно пересоздать контейнер с другим количеством пиров, изменив переменную PEERS и выполнив снова docker compose up -d. Существующие конфигурации пиров сохранятся, если не удалять их вручную.

Настройка клиентов и маршрутизация

Файлы клиентских конфигураций находятся в config/peerX/peerX.conf. Их нужно скопировать на устройства: для Android — через QR-код, для iOS — через приложение, для Linux/Windows — импортировать в клиент WireGuard. В каждом конфиге уже заданы адрес, ключи и маршрут через сервер.

Если вы подключаетесь из ненадёжной сети, рекомендуется ограничить ALLOWEDIPS для отдельных пиров, чтобы не пускать весь трафик через VPN. Например, для доступа только к внутренним ресурсам VPS используйте ALLOWEDIPS=10.13.13.1/32. Для этого придётся вручную отредактировать конфиг пира или пересоздать с нужными параметрами.

Проверьте подключение: ping 10.13.13.1 с клиента. Также можно убедиться, что контейнер видит клиентов, выполнив docker exec wireguard wg show.

Обновление и резервное копирование

Для обновления образа выполните:

docker compose pull
sudo docker compose up -d

Если вы хотите автоматизировать это, добавьте сервис Watchtower в compose:

watchtower:
  image: containrrr/watchtower
  container_name: watchtower
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  restart: unless-stopped

Watchtower будет ежедневно проверять обновления для всех запущенных контейнеров. Для резервного копирования достаточно сохранить каталог config — в нём лежат все ключи и настройки. Используйте tar или систему бэкапов, например restic: tar -czf wireguard-backup.tar.gz config/.

Проверка и мониторинг

Проверка маршрутизации WireGuard на VPS
WireGuard в Docker на VPS: автоматизация деплоя

После деплоя проверьте логи контейнера:

docker logs wireguard

Следите за состоянием VPN с помощью wg show. Для мониторинга можно настроить отправку метрик в Prometheus через официальный язык WireGuard, но это уже за рамками статьи. Регулярно проверяйте, что контейнер работает после перезагрузки VPS (restart: unless-stopped это обеспечит). Для дистрибутивов с systemd также можно создать сервис, запускающий docker compose при старте.

Не забывайте про безопасность: обновляйте образы, не открывайте лишние порты, и используйте брандмауэр. На VPS ограничьте доступ к порту 51820 только с необходимых IP, если клиенты имеют фиксированные адреса.

Мини-чеклист

  • Проверьте, что модуль ядра wireguard загружен командой modprobe wireguard
  • Убедитесь, что в docker-compose указан правильный публичный IP или домен (SERVERURL)
  • Проверьте, что порт 51820/udp доступен на VPS и не блокируется файрволом
  • Сделайте резервную копию папки config после первой настройки и перед обновлениями

Частые ошибки

  • Забывают включить sysctl net.ipv4.ip_forward=1 — VPN работает, но нет доступа в интернет у клиентов
  • Используют несовместимый образ или старую версию Docker, не проверяя поддержку сетевых возможностей контейнера
  • Не сохраняют ключи вне контейнера — при пересоздании контейнера теряются все клиентские конфигурации
  • Указывают SERVERURL с http:// или без протокола — нужно просто IP или домен без порта

Источники и документация

FAQ

Можно ли использовать WireGuard в Docker на macOS или Windows?

Напрямую нет, так как Docker на этих ОС работает через виртуализацию. VPS с Linux — оптимальный вариант, так как WireGuard требует модуль ядра. Docker Desktop для macOS/Windows не поддерживает TUN-интерфейсы напрямую без дополнительных настроек.

Как изменить количество клиентов (пиров) после первичного деплоя?

Измените переменную PEERS в docker-compose.yml и выполните `docker compose up -d`. Образ автоматически сгенерирует недостающие конфигурации в папке config, не трогая существующие. Проверьте свои версии образа на предмет возможных отличий.

Что делать, если клиенты подключаются, но трафик не идёт через VPN?

Проверьте, что на сервере включён IP-forwarding (`sysctl net.ipv4.ip_forward` должен вернуть 1), и в контейнере есть NET_ADMIN capability. Также убедитесь, что клиентский конфиг использует AllowedIPs = 0.0.0.0/0, если нужно пропускать весь трафик.

Хотите перейти сразу к рабочему доступу?

Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.

Получить доступ

Дальше по теме

Связанные статьи