WireGuard в Docker на VPS: автоматизация деплоя
Пошаговое руководство по автоматизированному развёртыванию WireGuard в Docker на VPS: docker-compose, sysctl, резервное копирование и обновление.
Содержание
WireGuard — современный VPN-протокол, который легко развернуть на VPS. Использование Docker упрощает установку и изоляцию, а автоматизация деплоя позволяет быстро воспроизводить конфигурацию на новых серверах или обновлять существующие. В этой статье разберём, как автоматизировать запуск WireGuard в Docker-контейнере, настроить клиентов и обеспечить надёжную работу без ручного вмешательства.
Зачем автоматизировать деплой WireGuard в Docker
Ручная установка WireGuard на VPS требует компиляции модулей или установки пакетов, зависит от дистрибутива и версии ядра. Docker абстрагирует этот процесс: контейнер содержит все зависимости, а конфигурация хранится в понятном виде. Автоматизация деплоя даёт несколько преимуществ:
- Воспроизводимость: один файл docker-compose.yml и каталог с конфигами позволяют развернуть VPN за минуты.
- Обновление: достаточно пересоздать контейнер с новой версией образа.
- Управление через git: конфигурацию можно версионировать и отслеживать изменения.
Рекомендуется использовать docker-compose, так как он позволяет декларативно описать сервис, volumes, порты и переменные окружения. Для автоматического обновления можно добавить Watchtower — инструмент, который периодически проверяет новые версии образов и перезапускает контейнеры. Но это опционально.
Подготовка VPS и установка Docker
Прежде чем разворачивать 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-stoppedWatchtower будет ежедневно проверять обновления для всех запущенных контейнеров. Для резервного копирования достаточно сохранить каталог config — в нём лежат все ключи и настройки. Используйте tar или систему бэкапов, например restic: tar -czf wireguard-backup.tar.gz config/.
Проверка и мониторинг
После деплоя проверьте логи контейнера:
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, если нужно пропускать весь трафик.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ