Предполагается, что для настройки WireGuard сервера, нужно вручную сгенерировать ключи, выбрать подсеть и задать ещё несколько параметров. Потом для каждого клиента также генерировать ключи, присваивать IP адрес и компоновать это всё в конфиг, чтобы было удобно импортировать на клиенте. Но если клиентов много и нужно время от времени их добавлять и удалять, то становится сложнее за ними уследить. Да и каждый раз генерировать вручную ключи и выбирать IP не очень удобно. Задачу автоматизации этих действий можно решить с помощью специальных программ. Каждое представленное тут решение я поднимал у себя на виртуальном сервере, попробовал в действии и написал краткий обзор с их возможностями, минусами и подводными камнями. Все программы разворачивал и тестировал на Ubuntu 22.04. Всем решениям проставил шкалу сложности: Простой - большая часть устанавливается и настраивается автоматически, требуются минимальные правки и знания. Сложный - придётся погрузиться в решение и поразбираться. Часть установки и настройки произвести самостоятельно. Средний - что-то между ними.  В большинстве решений в создаваемых конфигах есть строка с DNS-серверами  Эта строка обязательна для MacOS, iOS и Windows и работает там без проблем. А вот в Linux всё не так просто. Проблема в том, что wg-quick использует resolvconf для управления DNS и не поддерживает systemd-resolved, который используется почти везде. Поэтому есть три пути: Выпилить строку DNS из конфига. В этом случае будет использоваться DNS системы. Например, DNS-сервер на вашем домашнем роутере. Если ваш провайдер подменяет DNS запросы, то имеет смысл пустить DNS трафик через туннель. Для этого нужно оставить строку DNS и установить openresolv. Но это так себе решение, из-за него можно огрести проблем. сделать симлинк (спасибо @BulldozerBSG) Так же можно настроить клиент через systemd-networkd. Настройка WG на клиентах с готовым конфигом банальна. Но на всякий случай у меня есть инструкция, в которой описан процесс установки и настройки клиентов на всех платформах. Для управления этими решениями используется консоль сервера. Все решения работают сразу после установки, нужно только при желании подредактировать некоторые параметры. https://github.com/Nyr/wireguard-install Уровень: Простой Требования: Их нет Установка одной командой Далее нужно сделать скрипт исполняемым И после этого управление идёт просто через запуск скрипта ./wireguard-install.sh Меню скрипта: Установить WireGuard Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке Добавлять и удалять пользователей Делает сервер сразу маршрутизатором (Включение IP Forwarding) Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up Удалить себя Сразу после установки всё работает Для Endpoint использует IP адрес. Скрипт при установке обнаруживает внешний ip и использует его в качестве endpoint. Я считаю, что нужно использовать домены. IP адреса бывает меняются, и после этого нужно будет объяснять пользователям, что поправить или вообще конфиги пересоздавать. Делается это в /etc/wireguard/wg0.conf В строке вместо ip адреса можно прописать домен WG сеть прибита гвоздями по умолчанию на 10.7.0.0/24. Чтоб поменять, надо править скрипт во многих местах. Простое решение, работающее из коробки. https://github.com/angristan/wireguard-install Уровень: Простой Требования: Их нет Здесь в доке сразу упоминается chmod +x Дальнейшее управление также через вызов скрипта ./wireguard-install.sh Меню скрипта: Установить WireGuard Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке Задать домен для Endpoint при первоначальной настройке Задать подсеть для WG при первоначальной настройке Добавлять и удалять пользователей При добавлении пользователя даёт возможность выбрать IP адрес Делает сервер сразу маршрутизатором (Включение IP Forwarding) Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up Поддержка IPv6 из коробки Удалить себя Сразу после установки всё работает Тут можно прикопаться разве что к тому, что надо нажимать enter три раза при создании пользователя. Но это даёт выбор IP адреса. И то, что создаваемые конфиги имеют префикс wg0-client-. Тоже простое решение, работающее из коробки. Функциональности больше, чем у Nyr/wireguard-install. https://github.com/complexorganizations/wireguard-manager Уровень: Средний Требования: Их нет Скрипт скачивается в /usr/local/bin/, и поэтому его можно вызывать из любого места. Клиенты в /etc/wireguard/clients/ Дальнейшее управление через команду wireguard-install.sh Меню скрипта: Установить WireGuard Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке Задать подсеть для WG при первоначальной настройке Добавлять и удалять пользователей При добавлении пользователя даёт возможность выбрать IP адрес Делает сервер сразу маршрутизатором (Включение IP Forwarding) Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up Поддержка IPv6 из коробки Удалить себя Backup и Restore Можно сгенерировать qr коды для уже существующих пользователей через менюшку Использует в качестве firewall nftables Сразу после установки всё работает Бэкапы складываются в /var/backups/. Хранится только последняя копия Автоматический бэкап - это задача в крон. Выполняется раз в день Также есть restore. По умолчанию предлагает использовать Unbound в качестве DNS-сервера, в котором настроена какая-то минимальная блокировка рекламы. Не увидел в конфиге /etc/unbound/unbound.conf.d/hosts.conf каких-то российских рекламных платформ, только зарубежные. По умолчанию для endpoint он присваивает ip адрес, который определяет автоматически В меню есть функционал смены IP адреса 12) Update Interface IP, но домен прописать туда нельзя, он просто определяет IP у интерфейса. А меняется он в /etc/wireguard/wg0.conf первая строка, третий столбец. Изначально ставит значение при выборе пункта меню и дальнейших операциях. Например, для выбора пункта "Добавление клиента" надо стирать 0 и вводить 5. Потом он предлагает какое-то длинное рандомное имя для клиента, приходится стирать. Но зато, есть аргументы, описаны в документации например, добавление пользователя: Это не минус, это скорее странность. В readme есть список разных совместимостей, в том числе с cloud providers. Непонятно о чём именно речь, т.к. скрипт не разворачивает VM и устанавливает себя туда, а ставится в готовую VM. Hetnzer там отмечен как неподдерживаемый, но у меня он завёлся без проблем. Установка занимает чуть больше времени предыдущих двух, та же история с дальнейшим управлением. Нужны ли эти навороты решать вам. Решения разворачиваются через консоль, и потом управление идёт через веб-интерфейс. Решения очень разные, где-то данные хранятся в полноценной БД, где-то просто в json файлах и конфигах. Где-то есть https+LE из коробки, где-то его нужно прикручивать. https://github.com/firezone/firezone Это полностью коробочное решение: Wireguard настраивается сам и находится в контейнере с самой программой HTTPS присутствует Уровень: Простой Требования: Минимум 1CPU Минимум 1GB RAM Docker + docker-compose Домен Есть два типа установки: https://www.firezone.dev/docs/deploy/docker/#option-1-automatic-install При установке запрашивает домен, email, сделать ли https, куда установить. По умолчанию скромно ставит себя в $HOME/.firezone. Имеет смысл поменять просто на firezone, чтоб не потерять. Под капотом caddy, postgres и сам firezone, в котором находится WG. Для postgres используется volume, для остальных bind mount в эту же директорию. Настройки, заданные в визарде, находятся в .env. https://www.firezone.dev/docs/deploy/docker/#option-2-manual-install Действия из скрипта выполняются вручную. Скачивается compose, генерируется .env и т.д. Вся установка находится в docker, в том числе WG Использует домен для всего из коробки. Задаётся при установке. Поменять можно в .env HTTPS самонастраиваемый, использует Caddy Задать подсеть WG в .env Задать дефолтные для клиентских конфигураций Allowed IPs, DNS Servers, Endpoint в веб-интерфейсе Settings - Defaults Добавлять и удалять пользователей Каждый пользователь имеет свой список устройств Есть функционал "Forgot password" - отправка письма на email. Нужен SMTP relay Также есть функционал сброса пароля (или создания юзера) из env переменных DEFAULT_ADMIN_PASSWORD и DEFAULT_ADMIN_EMAIL Можно установить своё лого для веб-интерфейса При добавлении устройства можно изменить любые переменные в конфиге (DNS, IP-адрес в WG итд) Добавление и удаление пользователей проходит мягко Поддержка IPv6 из коробки Backup и Restore Веб-интерфейс имеет много настроек, вплоть до прикручивания SSO аутентификации Есть Egress Rules. Можно запретить определённые подсети/адреса или, наоборот, разрешить только их. В голову приходит только кейс, когда ВПН нужен для каких-то определённых ресурсов и нужно, чтоб сотрудники не заходили через него, например, в соцсети Есть отдельная статистика по каждому устройству. Сколько передано информации, когда было последнее подключение Сразу после установки всё работает Не обязательно создавать конфиги самому для каждого человека. Вы можете создать пользователя, отдать учётные данные человеку, и он сам себе нагенерит конфиги. Или бывают такие ситуации:   Можно дать человеку аккаунт и он сам для своих друзей нагенерит конфигов на вашем сервере.  https://www.firezone.dev/docs/administer/backup/ Копируется каталог с firezone и БД, находящаяся в volume. БД лучше при этом остановить. При генерации стандартно выдаётся QR-код, файл конфига и конфиг в текстовом формате. Но после создания устройства конфигурацию нельзя посмотреть. Это какая-то фича по безопасности или разработчики пока не дошли до этого функционала, непонятно. Это не минус, это предупреждение. Продукт серьёзный, поэтому собирает телеметрию для улучшения разработки. Можно отключить сразу при установке, либо уже потом через env переменную TELEMETRY_ENABLED. Не считаю это минусом, но должен предупредить, что IP использовать не получится: Отличный инструмент для компаний и для тех, у кого есть семья/друзья. Мне продукт очень понравился, если когда-нибудь понадобится веб-интерфейс, то выберу его. https://github.com/WeeJeWel/wg-easy Это почти коробочное решение: Wireguard настраивается сам и находится в контейнере с самой программой HTTPS нужно настроить отдельно Уровень: Простой Требования: Docker + docker-compose Как и в firezone, панель управления находится в одном контейнере вместе с WG. В readme предлагается запуск через docker run, но в репозитории есть готовый compose файл с описанием переменных. Через переменные можно задать подсеть WG, пароль для админки и т.д. Если захотите поменять подсеть после первого запуска, то потребуется удаление или редактирование wg0.conf и wg0.json. По умолчанию панель находится на порту 51821 без https:http://$DOMAIN:51821/ Замените $DOMAIN на свой домен и $EMAIL на свой емейл. Вся установка находится в docker, в том числе WG Можно использовать домен. Задаётся в .env Задать подсеть WG в .env Задать дефолтные для клиентских конфигураций Allowed IPs, DNS Servers тоже в .env Добавлять и удалять пользователей Добавление и удаление пользователей проходит мягко Включить/выключить клиентский конфиг Показать QR код и скачать конфигурацию уже существующих Статистика Download/Upload, но только в реальном времени База данных - это json файл Нет поддержки https из коробки. Но traefik прикручивается на раз два Один пользователь админки Нет поддержки IPv6 из коробки Очень простой и понятный UI. Нет зависимостей от БД, соответственно, требования минимальные. Все настройки в .env. Весь конфиг лежит в docker-compose.yml, wg0.conf и wg0.json. Значит, просто копируя каталог с docker-compose, у нас есть полный бэкап. https://github.com/h44z/wg-portal Это решение не коробочное. Устанавливается на уже подготовленный WG. Уровень: Сложный Требования: Docker + docker-compose Уже установленный wireguard со сгенерированным интерфейсом Установка предлагается через docker-compose. Отдельно нужно подготовить WG Требуется сгенерировать самостоятельно PrivateKey, а также задать Address и ListenPort в . Сделать wg-quick up wg0 и только после этого поднимать wg-portal. Но плюс в том, что вы можете скормить ему уже существующий конфиг с клиентами. У них будут такие комментарии: Без поднятого wg0 интерфейса wg-portal будет выдавать ошибку Таким образом, нужно будет добавить поднятие интерфейса в systemd при перезагрузке системы. Сразу после запуска wg-portal получите ошибку Warning: WireGuard Interface wg0 is not fully configured! Configurations may be incomplete and non functional! Это означает, что отсутствует обязательная переменная Public Endpoint for Clients. Добавляется в UI через редактирование интерфейса. Ещё сразу добавьте Default allowed IPs. Иначе все конфиги будут разворачиваться без этой переменной по дефолту. Дефолтный порт меняется через переменную а не через ports в compose. Она там вообще не нужна, т.к. контейнер разворачивается с типом сети host. Часть конфигурации (User, LDAP, SMTP etc) можно задавать через env, либо config.yaml. Можно обойтись без докера, в releases есть скомпилированные бинарники. Работать с LDAP (это главна фича) Добавлять и удалять пользователей База данных SQLite, либо MySQL RESTful API Импортировать уже существующий конфиг Можно использовать домен. Задаётся в UI (Public Endpoint for Clients) Можно подсеть WG при создании конфигурации, либо изменить через UI после создания Задать дефолтные для клиентских конфигураций Allowed IPs, DNS Servers в UI Добавлять и удалять пользователей Добавление и удаление пользователей проходит мягко Показать QR код, скачать конфигурацию уже существующих Можно отправлять письма с конфигами, нужен SMTP-relay Статистика Download/Upload, но только в реальном времени Есть кнопка, что бы разослать конфиги всем клиентам Есть поддержка IPv6 Включить/выключить клиентский конфиг Можно создавать пользователей админки, но они смогут только смотреть уже созданные конфиги. Добавлять не смогут. Только если дать им админские права, ну и тогда у пользователя будет доступ ко всем другим пользователям Нужно задавать email каждому клиенту. Поле обязательно и это не настраивается Кнопка Save при редактировании клиента сохраняет конфиг, но не делает переход обратно на список клиентов Нет поддержки https из коробки Много вещей нужно конфигурить самостоятельно Вижу это решение скорее корпоративным. Его плюсы в том, что он умеет LDAP и в него можно импортировать уже использующиеся пиры. Насколько хорошо работает связка с LDAP - не знаю, не проверял. Также можно накатить на уже поднятый WG сервер. А вот для домашнего использования не советую, другие варианты попроще и удобнее, здесь нужно много вещей конфигурить самостоятельно и не все они очевидные. https://github.com/ngoduykhanh/wireguard-ui Это не коробочное решение. Устанавливается на уже подготовленный WG. Уровень: Средний Требования: Docker + docker-compose Запуск предлагается через бинарник или docker-compose. Может работать с уже установленным в системе wireguard. Но существующий конфиг не подхватывает, перезатирает просто своим. Здесь есть примеры docker-compose: Для системы в которой уже стоит WG С контейнером от linuxserver, в котором развернут WG С контейнером от CF с boringtun Если будете разворачивать вариант от linuxserver, добавьте к нему Иначе он работает как клиент. Для первого запуска переменные настраиваются через env. После него меняются уже через UI, т.к. записываются в БД и потом берутся оттуда. Например, если WGUI_PASSWORD не задали сразу, то будет дефолтный пароль и изменить его можно будет уже только через UI или через прямое редактирование json файла db/users/admin.json. Также не забудьте про WGUI_SERVER_POST_UP_SCRIPT и WGUI_SERVER_POST_DOWN_SCRIPT, если у вас не настроен маскарадинг в другом месте. Можно использовать домен, задаётся через UI Задать подсеть WG через env, редактировать через UI Задать дефолтные DNS-серверы для клиентских конфигураций настраивается в Settings - Global Settings Добавлять и удалять пользователей Добавление и удаление пользователей проходит мягко Включить/выключить клиентский конфиг Показать QR код и скачать конфигурацию уже существующих База данных это json файлы, раскиданные по каталогам Есть какая-то фича с WoL Есть статистика в реальном времени Можно создать юзера без админских прав. У него будет возможность создавать, просматривать, редактировать и удалять все конфиги WG. А также есть доступ к статистике. Можно давать человеку, которому доверяете, но боитесь, что он испортит конфигурацию сервера. После добавления конфигов нужно делать Apply config, и он будет рестартить интерфейс. Бесячая штука Сам не поднимает wg, при этом существующий конфиг не подхватывает Есть задержка при входе, нет анимации ожидания. При тестах у меня бывало, что просто админка не открывалась или после ввода пароля не происходил логин Не минус, а скорее странность. IP адреса клиентов начинаются с x.x.x.1, а x.x.x.0 - это сам сервер. Вижу в этом смысл для выделенных IPv4, они дорогие. Зачем это делать для внутренних адресов мне непонятно. Я потратил на это решение много времени и результат мне не особо понравился. Если вам не подходят другие решения из подборки, то можно рассмотреть его. https://github.com/Place1/wg-access-server Проект не обновляется с 2021 года. По функционалу похож на wg-easy, при этом запарнее в установке. Использовать его, при наличии wg-easy, смысла не вижу. https://github.com/burghardt/easy-wg-quick Такое чувство, что писал какой-то студент, чтобы поупражняться в создании файлов через bash скрипт. Создаёт кучу .txt файлов. Каждая переменная в отдельном .txt файле Для каждого клиента создаёт файлы с preshared-key, qr-кодом, конфигом для openwrt и стандартным конфигом Удаление юзеров не предусмотрено By default easy-wg-quick use random port number from range 1025-65535. Но при этом всём он работает и имеет 800 звёзд на гитхабе. https://github.com/vx3r/wg-gen-web Предполагается, что будет использоваться o-auth аутентификация. Но каким образом это реализуется, кто туда может заходить и как распределяются права - неясно. При задании переменой OAUTH2_PROVIDER_NAME=fake получаем отсутствие какой-либо аутентификации. Можно, конечно, сделать basic auth с помощью того же traefik, но смысла я не вижу. Так же: QR-код маленький, из-за этого долго считывается Есть статистика, но для этого нужен отдельный контейнер и его настройка Не вижу причин использовать это решение. Возможно, я его просто не понял. https://github.com/trailofbits/algo Это решение разворачивает IPsec + WG. Нужен python3-virtualenv, внутри которого будут установлены ansible, jinja2 и netaddr. Установка и дальнейшее использование монструозно. Можно запустить локально, натравив на сервер, или запустить установку прямо на сервере При этом есть фича установки через API cloud провайдеров Есть блокировка рекламы с помощью https://github.com/StevenBlack/hosts Нужно обязательно сохранить CA key password из вывода установки. Он потребуется для добавления/удаления пользователей (секьюрити) Конфигурирует firewall, закрывает всё ненужное Чтобы добавить/удалить нужно отредактировать config.cfg и выполнить Для корпоративных юзеров, которым нужно страдать и списать куда-то таймшиты - рекомендую, остальным - нет. Держать сервер с публичным IP адресом без firewall плохая идея. Если у вашего VPS провайдера есть cloud firewall, то делайте через него, если нет, то для Ubuntu есть удобный и простой ufw. Это надстройка над iptables или nftables. Делаем открытыми только 22 и 51820 порты: Все остальные входящие порты будут закрыты. ufw enable стартует ufw и добавляет его в автозагрузку. Останавливается и удаляется из автозагрузки также просто: ufw disable. Если вам нужны другие порты, то делайте для них ufw allow. Примеры: Это минимум. Если хотите углубиться, то можно указывать протокол для каждого порта, с каких IP доступно и т.д. Второе, что нужно сделать обязательно - это настройка ssh. Самое главное - это доступ к серверу только по ключам. Скопируйте pubkey своего клиента в ~/.ssh/authorized_keys на сервере. Перед следующим действием обязательно проверьте, что у вас есть доступ по ключу до сервера. Настройте доступ только по ключам. В /etc/ssh/sshd_config строка PasswordAuthentication должна иметь значение no После этого нужен рестарт ssh сервера Это тоже минимум, с которым ваш сервер уже будет очень сложно взломать. Тут тоже можно углубиться и запретить логин для root, изменить порт с 22 на другой. И если очень захочется, установить и настроить Fail2ban или Crowdsec. В идеале, конечно, иметь инфраструктуру с внутренней сетью, доступ к которой осуществляется через другой VPN. И тогда, при добавлении этого хоста в подсеть, у нас есть защищённый доступ. Рассмотрим вариант, когда этот сервер сам по себе. Веб-интерфейс имеет юзер+пароль, и это взламывается брутфорсом. Тут, конечно, вопрос, нужен ли кому-то ваш VPN-сервер. Но давайте предполагать, что нужен. Как его можно защитить? Разрешить доступ к 80 и 443 только с вашего IP адреса через фаервол. Выделенный IPv4 адрес - это нынче роскошь и, скорее всего, ваш внешний IP динамический и будет меняться. По моим наблюдениям многие провайдеры используют одну-две подсети /24 для своих клиентов в одной локации. Таким образом, можно разрешить доступ только для этой подсети: Минусы подхода следующие: Во-первых, другие пользователи вашего провайдера могут побрутфорсить, но это уже не весь интернет. Во-вторых, если есть https и LE, сертификат обновляется через 80 порт. Придётся раз два месяца вручную разрешать к нему доступ всему интернету и обновлять сертификат. Разрешить 80 только для LE серверов не получится. Это можно решить через API DNS, если хотите заморочиться. Ходим через SSH туннель. В этом случае можно не запариваться насчёт https, т.к. SSH будет всё шифровать. И с запущенным туннелем можно ходить к веб-интерфейсу по адресу http://localhost:8080/ Настроить Fail2ban или Crowdsec. После N попыток перебора пароля будет блокироваться доступ с атакующего IP. Но тут нужен сценарий, который будет анализировать логи выбранного решения. Ходить к нему через этот же VPN. Это скорее вредный совет, можно выстрелить себе в ногу. На этот случай должен быть доступ к консоли. Если WG подсеть 10.20.0.0/24 и WG-сервер имеет адрес 10.20.0.1, то веб-интерфейс должен быть доступен по адресу WG-сервера. Применяя варианты 2 и 4 не забудьте запретить доступ до веб-интерфейса извне. Да, WireGuard обнаруживается провайдерами очень легко, он был сделан не для обхода блокировок. Но через несколько месяцев будет 5 лет, как я его использую в России именно для этого. И помимо меня это делают ещё большое количество людей. Могут ли начать его резать по протоколу завтра? Могут. Могут ли начать резать в марте 2024? Могут. Могут ли начать это делать только через год-другой или вообще отказаться от такой затеи? Могут. Можно ли в текущих реалиях на своём сервере держать только WG? Если есть время и желание, то изучите Shadowsocks и XRay (или любые другие решения, маскирующиеся под https) и поднимите их рядом с WG. По факту, мы сейчас без проблем можем использовать WG. И я считаю, что пока можем - нужно использовать. Если возникает вопрос, где купить VPS для VPN и платить за это российской картой, гляньте этот обзор. Материалы про VPN и точечный обход блокировок, которые не дотягивают до статьи на Хабре, публикую в моём телеграм-канале.