Предполагается, что для настройки WireGuard сервера, нужно вручную сгенерировать ключи, выбрать подсеть и задать ещё несколько параметров. Потом для каждого клиента также генерировать ключи, присваивать IP адрес и компоновать это всё в конфиг, чтобы было удобно импортировать на клиенте.

Но если клиентов много и нужно время от времени их добавлять и удалять, то становится сложнее за ними уследить. Да и каждый раз генерировать вручную ключи и выбирать IP не очень удобно.

Задачу автоматизации этих действий можно решить с помощью специальных программ. Каждое представленное тут решение я поднимал у себя на виртуальном сервере, попробовал в действии и написал краткий обзор с их возможностями, минусами и подводными камнями.

Все программы разворачивал и тестировал на Ubuntu 22.04.

Всем решениям проставил шкалу сложности:

  • Простой - большая часть устанавливается и настраивается автоматически, требуются минимальные правки и знания.

  • Сложный - придётся погрузиться в решение и поразбираться. Часть установки и настройки произвести самостоятельно.

  • Средний - что-то между ними.

Про DNS и Linux клиенты

В большинстве решений в создаваемых конфигах есть строка с DNS-серверами

DNS = $DNS1, $DNS2

Эта строка обязательна для MacOS, iOS и Windows и работает там без проблем.

А вот в Linux всё не так просто. Проблема в том, что wg-quick использует resolvconf для управления DNS и не поддерживает systemd-resolved, который используется почти везде.

Поэтому есть три пути:

  • Выпилить строку DNS из конфига. В этом случае будет использоваться DNS системы. Например, DNS-сервер на вашем домашнем роутере.

  • Если ваш провайдер подменяет DNS запросы, то имеет смысл пустить DNS трафик через туннель. Для этого нужно оставить строку DNS и установить openresolv. Но это так себе решение, из-за него можно огрести проблем. сделать симлинк (спасибо @BulldozerBSG)

ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
  • Так же можно настроить клиент через systemd-networkd.

Настройка WG на клиентах с готовым конфигом банальна. Но на всякий случай у меня есть инструкция, в которой описан процесс установки и настройки клиентов на всех платформах.

Решения на базе скриптов

Для управления этими решениями используется консоль сервера. Все решения работают сразу после установки, нужно только при желании подредактировать некоторые параметры.

Nyr/wireguard-install

https://github.com/Nyr/wireguard-install

Уровень: Простой

Требования:
Их нет

Установка

Установка одной командой

wget https://git.io/wireguard -O wireguard-install.sh && bash wireguard-install.sh

Далее нужно сделать скрипт исполняемым

chmod +x wireguard-install.sh

И после этого управление идёт просто через запуск скрипта ./wireguard-install.sh

Меню скрипта:

WireGuard is already installed.

Select an option:
   1) Add a new client
   2) Remove an existing client
   3) Remove WireGuard
   4) Exit
Option: 

Что умеет:

  • Установить WireGuard

  • Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке

  • Добавлять и удалять пользователей

  • Делает сервер сразу маршрутизатором (Включение IP Forwarding)

  • Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up

  • Удалить себя

  • Сразу после установки всё работает

Минусы:

  1. Для Endpoint использует IP адрес. Скрипт при установке обнаруживает внешний ip и использует его в качестве endpoint. Я считаю, что нужно использовать домены. IP адреса бывает меняются, и после этого нужно будет объяснять пользователям, что поправить или вообще конфиги пересоздавать.

Делается это в /etc/wireguard/wg0.conf

В строке

# ENDPOINT $IP

вместо ip адреса можно прописать домен

  1. WG сеть прибита гвоздями по умолчанию на 10.7.0.0/24. Чтоб поменять, надо править скрипт во многих местах.

Простое решение, работающее из коробки.

angristan/wireguard-install

https://github.com/angristan/wireguard-install

Уровень: Простой

Требования:
Их нет

Установка

Здесь в доке сразу упоминается chmod +x

curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
chmod +x wireguard-install.sh
./wireguard-install.sh

Дальнейшее управление также через вызов скрипта ./wireguard-install.sh

Меню скрипта:

Welcome to WireGuard-install!
The git repository is available at: https://github.com/angristan/wireguard-install

It looks like WireGuard is already installed.

What do you want to do?
   1) Add a new user
   2) List all users
   3) Revoke existing user
   4) Uninstall WireGuard
   5) Exit
Select an option [1-5]: 

Что умеет:

  • Установить WireGuard

  • Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке

  • Задать домен для Endpoint при первоначальной настройке

  • Задать подсеть для WG при первоначальной настройке

  • Добавлять и удалять пользователей

  • При добавлении пользователя даёт возможность выбрать IP адрес

  • Делает сервер сразу маршрутизатором (Включение IP Forwarding)

  • Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up

  • Поддержка IPv6 из коробки

  • Удалить себя

  • Сразу после установки всё работает

Минусы:

Тут можно прикопаться разве что к тому, что надо нажимать enter три раза при создании пользователя. Но это даёт выбор IP адреса.
И то, что создаваемые конфиги имеют префикс wg0-client-.

Тоже простое решение, работающее из коробки. Функциональности больше, чем у Nyr/wireguard-install.

complexorganizations/wireguard-manager

https://github.com/complexorganizations/wireguard-manager

Уровень: Средний

Требования:
Их нет

Установка

Скрипт скачивается в /usr/local/bin/, и поэтому его можно вызывать из любого места.

curl https://raw.githubusercontent.com/complexorganizations/wireguard-manager/main/wireguard-manager.sh --create-dirs -o /usr/local/bin/wireguard-manager.sh
chmod +x /usr/local/bin/wireguard-manager.sh
wireguard-manager.sh

Клиенты в /etc/wireguard/clients/

Дальнейшее управление через команду wireguard-install.sh

Меню скрипта:

root@vpn:~# wireguard-manager.sh 
What do you want to do?
   1) Show WireGuard
   2) Start WireGuard
   3) Stop WireGuard
   4) Restart WireGuard
   5) Add WireGuard Peer (client)
   6) Remove WireGuard Peer (client)
   7) Reinstall WireGuard
   8) Uninstall WireGuard
   9) Update this script
   10) Backup WireGuard
   11) Restore WireGuard
   12) Update Interface IP
   13) Update Interface Port
   14) Purge WireGuard Peers
   15) Generate QR Code
   16) Check Configs
Select an Option [1-16]:0

Что умеет:

  • Установить WireGuard

  • Задать нестандартный порт, имя первого клиента, DNS-серверы при первоначальной настройке

  • Задать подсеть для WG при первоначальной настройке

  • Добавлять и удалять пользователей

  • При добавлении пользователя даёт возможность выбрать IP адрес

  • Делает сервер сразу маршрутизатором (Включение IP Forwarding)

  • Добавление и удаление пользователей проходит мягко, без wg-quick down && wg-quick up

  • Поддержка IPv6 из коробки

  • Удалить себя

  • Backup и Restore

  • Можно сгенерировать qr коды для уже существующих пользователей через менюшку

  • Использует в качестве firewall nftables

  • Сразу после установки всё работает

Backup/Restore

Would you like to setup real-time backup?
  1) Yes (Recommended)
  2) No (Advanced)

Бэкапы складываются в /var/backups/. Хранится только последняя копия
Автоматический бэкап - это задача в крон. Выполняется раз в день

0 0 * * * /usr/local/bin/wireguard-manager.sh --backup

Также есть restore.

DNS и блокировка рекламы

Which DNS provider would you like to use?
  1) Unbound (Recommended)
  2) Custom (Advanced)

По умолчанию предлагает использовать Unbound в качестве DNS-сервера, в котором настроена какая-то минимальная блокировка рекламы. Не увидел в конфиге /etc/unbound/unbound.conf.d/hosts.conf каких-то российских рекламных платформ, только зарубежные.

Минусы:

  1. По умолчанию для endpoint он присваивает ip адрес, который определяет автоматически

IPv4 Choice [1-2]:1
How would you like to detect IPv6?
  1) Curl (Recommended)
  2) Custom (Advanced)

В меню есть функционал смены IP адреса 12) Update Interface IP, но домен прописать туда нельзя, он просто определяет IP у интерфейса.

А меняется он в /etc/wireguard/wg0.conf первая строка, третий столбец.

  1. Изначально ставит значение при выборе пункта меню и дальнейших операциях. Например, для выбора пункта "Добавление клиента" надо стирать 0 и вводить 5. Потом он предлагает какое-то длинное рандомное имя для клиента, приходится стирать.

Но зато, есть аргументы, описаны в документации например, добавление пользователя:

wireguard-manager.sh --add
  1. Это не минус, это скорее странность. В readme есть список разных совместимостей, в том числе с cloud providers. Непонятно о чём именно речь, т.к. скрипт не разворачивает VM и устанавливает себя туда, а ставится в готовую VM. Hetnzer там отмечен как неподдерживаемый, но у меня он завёлся без проблем.

Установка занимает чуть больше времени предыдущих двух, та же история с дальнейшим управлением. Нужны ли эти навороты решать вам.

Решения с веб-интерфейсом

Решения разворачиваются через консоль, и потом управление идёт через веб-интерфейс.
Решения очень разные, где-то данные хранятся в полноценной БД, где-то просто в json файлах и конфигах. Где-то есть https+LE из коробки, где-то его нужно прикручивать.

Firezone

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

docker exec -it firezone-firezone-1 bin/create-or-reset-admin
  • Можно установить своё лого для веб-интерфейса

  • При добавлении устройства можно изменить любые переменные в конфиге (DNS, IP-адрес в WG итд)

  • Добавление и удаление пользователей проходит мягко

  • Поддержка IPv6 из коробки

  • Backup и Restore

  • Веб-интерфейс имеет много настроек, вплоть до прикручивания SSO аутентификации

  • Есть Egress Rules. Можно запретить определённые подсети/адреса или, наоборот, разрешить только их. В голову приходит только кейс, когда ВПН нужен для каких-то определённых ресурсов и нужно, чтоб сотрудники не заходили через него, например, в соцсети

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

  • Сразу после установки всё работает

Суперфича

Не обязательно создавать конфиги самому для каждого человека. Вы можете создать пользователя, отдать учётные данные человеку, и он сам себе нагенерит конфиги.

Или бывают такие ситуации:

Можно дать человеку аккаунт и он сам для своих друзей нагенерит конфигов на вашем сервере.

Backup и Restore

https://www.firezone.dev/docs/administer/backup/

Копируется каталог с firezone и БД, находящаяся в volume. БД лучше при этом остановить.

Минусы

  1. При генерации стандартно выдаётся QR-код, файл конфига и конфиг в текстовом формате. Но после создания устройства конфигурацию нельзя посмотреть. Это какая-то фича по безопасности или разработчики пока не дошли до этого функционала, непонятно.

  2. Это не минус, это предупреждение. Продукт серьёзный, поэтому собирает телеметрию для улучшения разработки. Можно отключить сразу при установке, либо уже потом через env переменную TELEMETRY_ENABLED.

  3. Не считаю это минусом, но должен предупредить, что IP использовать не получится:

ERROR! Config provider Config.Reader failed with:
** (RuntimeError) Invalid configuration for 'external_url' retrieved from environment variable EXTERNAL_URL.

Отличный инструмент для компаний и для тех, у кого есть семья/друзья.
Мне продукт очень понравился, если когда-нибудь понадобится веб-интерфейс, то выберу его.

WeeJeWel/wg-easy

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/

Пример docker-compose c traefik для https
version: "3.8"
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=raspberrypi.local

      # Optional:
      # - PASSWORD=foobar123
      # - WG_PORT=51820
      # - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_DEFAULT_DNS=1.1.1.1
      # - WG_MTU=1420
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt

    image: weejewel/wg-easy
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
#      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wg-easy.rule=Host(`$DOMAIN`)"
      - "traefik.http.routers.wg-easy.entrypoints=websecure"
      - "traefik.http.routers.wg-easy.tls.certresolver=myresolver"
      - "traefik.http.services.wg-easy.loadbalancer.server.port=51821"

  traefik:
    image: "traefik:v2.9"
    container_name: "traefik"
    command:
#      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.myresolver.acme.email=$EMAIL"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"

Замените $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, у нас есть полный бэкап.

h44z/wg-portal

https://github.com/h44z/wg-portal

Это решение не коробочное. Устанавливается на уже подготовленный WG.

Уровень: Сложный

Требования:

  • Docker + docker-compose

  • Уже установленный wireguard со сгенерированным интерфейсом

Установка

Установка предлагается через docker-compose.

Отдельно нужно подготовить WG

apt update && sudo apt install wireguard

Требуется сгенерировать самостоятельно PrivateKey, а также задать Address и ListenPort в [Interface].
Сделать wg-quick up wg0 и только после этого поднимать wg-portal.

Но плюс в том, что вы можете скормить ему уже существующий конфиг с клиентами. У них будут такие комментарии:

# -WGP- Peer: Autodetected Client (iCOPsJD6) / Updated: 2023-04-27 15:27:19.310533869 +0000 UTC / Created: 2023-04-27 15:20:31.335605924 +0000 UTC
# -WGP- Peer email: autodetected@example.com

Без поднятого wg0 интерфейса wg-portal будет выдавать ошибку

setup failed: unable to setup peer manager: unable to initialize peer manager: failed to get peer list for device wg0: could not get WireGuard device: file does not exist 

Таким образом, нужно будет добавить поднятие интерфейса в 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. Иначе все конфиги будут разворачиваться без этой переменной по дефолту.

Дефолтный порт меняется через переменную

      - LISTENING_ADDRESS=:80

а не через 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 сервер.

А вот для домашнего использования не советую, другие варианты попроще и удобнее, здесь нужно много вещей конфигурить самостоятельно и не все они очевидные.

ngoduykhanh/wireguard-ui

https://github.com/ngoduykhanh/wireguard-ui

Это не коробочное решение. Устанавливается на уже подготовленный WG.

Уровень: Средний

Требования:

  • Docker + docker-compose

Установка

Запуск предлагается через бинарник или docker-compose.
Может работать с уже установленным в системе wireguard. Но существующий конфиг не подхватывает, перезатирает просто своим.

Здесь есть примеры docker-compose:

  • Для системы в которой уже стоит WG

  • С контейнером от linuxserver, в котором развернут WG

  • С контейнером от CF с boringtun

Если будете разворачивать вариант от linuxserver, добавьте к нему

    environment:
     - PEERS=1

Иначе он работает как клиент.

Для первого запуска переменные настраиваются через 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, они дорогие. Зачем это делать для внутренних адресов мне непонятно.

Я потратил на это решение много времени и результат мне не особо понравился. Если вам не подходят другие решения из подборки, то можно рассмотреть его.

Решения, которые я не рекомендую

Place1/wg-access-server

https://github.com/Place1/wg-access-server

Проект не обновляется с 2021 года. По функционалу похож на wg-easy, при этом запарнее в установке. Использовать его, при наличии wg-easy, смысла не вижу.

burghardt/easy-wg-quick

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 звёзд на гитхабе.

vx3r/wg-gen-web

https://github.com/vx3r/wg-gen-web

Предполагается, что будет использоваться o-auth аутентификация. Но каким образом это реализуется, кто туда может заходить и как распределяются права - неясно.
При задании переменой OAUTH2_PROVIDER_NAME=fake получаем отсутствие какой-либо аутентификации.
Можно, конечно, сделать basic auth с помощью того же traefik, но смысла я не вижу.

Так же:

  • QR-код маленький, из-за этого долго считывается

  • Есть статистика, но для этого нужен отдельный контейнер и его настройка

Не вижу причин использовать это решение. Возможно, я его просто не понял.

trailofbits/algo

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 и выполнить

./algo update-users

Для корпоративных юзеров, которым нужно страдать и списать куда-то таймшиты - рекомендую, остальным - нет.

Бонус. Настройка firewall, SSH и защита веб-интерфейса

Firewall

Держать сервер с публичным IP адресом без firewall плохая идея.
Если у вашего VPS провайдера есть cloud firewall, то делайте через него, если нет, то для Ubuntu есть удобный и простой ufw.

Это надстройка над iptables или nftables. Делаем открытыми только 22 и 51820 порты:

ufw allow 22
ufw allow 51820
ufw enable

Все остальные входящие порты будут закрыты.
ufw enable стартует ufw и добавляет его в автозагрузку.
Останавливается и удаляется из автозагрузки также просто: ufw disable.

Если вам нужны другие порты, то делайте для них ufw allow. Примеры:

ufw allow 1194
ufw allow 80
ufw allow 443

Это минимум. Если хотите углубиться, то можно указывать протокол для каждого порта, с каких IP доступно и т.д.

SSH

Второе, что нужно сделать обязательно - это настройка ssh.
Самое главное - это доступ к серверу только по ключам. Скопируйте pubkey своего клиента в ~/.ssh/authorized_keys на сервере.
Перед следующим действием обязательно проверьте, что у вас есть доступ по ключу до сервера.

Настройте доступ только по ключам.
В /etc/ssh/sshd_config строка PasswordAuthentication должна иметь значение no

PasswordAuthentication no

После этого нужен рестарт ssh сервера

sudo systemctl restart sshd.service

Это тоже минимум, с которым ваш сервер уже будет очень сложно взломать. Тут тоже можно углубиться и запретить логин для root, изменить порт с 22 на другой. И если очень захочется, установить и настроить Fail2ban или Crowdsec.

Веб-интерфейс

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

Рассмотрим вариант, когда этот сервер сам по себе.
Веб-интерфейс имеет юзер+пароль, и это взламывается брутфорсом. Тут, конечно, вопрос, нужен ли кому-то ваш VPN-сервер.
Но давайте предполагать, что нужен. Как его можно защитить?

  1. Разрешить доступ к 80 и 443 только с вашего IP адреса через фаервол. Выделенный IPv4 адрес - это нынче роскошь и, скорее всего, ваш внешний IP динамический и будет меняться. По моим наблюдениям многие провайдеры используют одну-две подсети /24 для своих клиентов в одной локации. Таким образом, можно разрешить доступ только для этой подсети:

ufw allow from 10.0.0.0/24 port 80
ufw allow from 10.0.0.0/24 port 443

Минусы подхода следующие:

Во-первых, другие пользователи вашего провайдера могут побрутфорсить, но это уже не весь интернет.
Во-вторых, если есть https и LE, сертификат обновляется через 80 порт. Придётся раз два месяца вручную разрешать к нему доступ всему интернету и обновлять сертификат. Разрешить 80 только для LE серверов не получится. Это можно решить через API DNS, если хотите заморочиться.

  1. Ходим через SSH туннель. В этом случае можно не запариваться насчёт https, т.к. SSH будет всё шифровать.

ssh -L 8080:localhost:80 -N $USER@$SERVER_IP

И с запущенным туннелем можно ходить к веб-интерфейсу по адресу

http://localhost:8080/

  1. Настроить Fail2ban или Crowdsec. После N попыток перебора пароля будет блокироваться доступ с атакующего IP. Но тут нужен сценарий, который будет анализировать логи выбранного решения.

  2. Ходить к нему через этот же VPN. Это скорее вредный совет, можно выстрелить себе в ногу. На этот случай должен быть доступ к консоли.
    Если WG подсеть 10.20.0.0/24 и WG-сервер имеет адрес 10.20.0.1, то веб-интерфейс должен быть доступен по адресу WG-сервера.

Применяя варианты 2 и 4 не забудьте запретить доступ до веб-интерфейса извне.

Но зачем это всё? Wireguard легко обнаруживается, его заблочат вот-вот!

Да, WireGuard обнаруживается провайдерами очень легко, он был сделан не для обхода блокировок.
Но через несколько месяцев будет 5 лет, как я его использую в России именно для этого. И помимо меня это делают ещё большое количество людей.

Могут ли начать его резать по протоколу завтра? Могут.

Могут ли начать резать в марте 2024? Могут.

Могут ли начать это делать только через год-другой или вообще отказаться от такой затеи? Могут.

Можно ли в текущих реалиях на своём сервере держать только WG? Если есть время и желание, то изучите Shadowsocks и XRay (или любые другие решения, маскирующиеся под https) и поднимите их рядом с WG.

По факту, мы сейчас без проблем можем использовать WG. И я считаю, что пока можем - нужно использовать.


Если возникает вопрос, где купить VPS для VPN и платить за это российской картой, гляньте этот обзор.

Материалы про VPN и точечный обход блокировок, которые не дотягивают до статьи на Хабре, публикую в моём телеграм-канале.

Комментарии (16)


  1. 13werwolf13
    31.05.2023 11:59
    +3

    разработчики wg: сделаем максимально простой конфиг чтобы не понадобилось никаких дополнительных инструментов и можно было развернуть побыстрому vpn в пару тыков по клавиатуре

    васяны с гитхуба: я прикручу к этому вашему wg nodejs+docker+nginx+python+go+ещёкучувсего чтобы вместо 2 тыков по клавиатуре надо было сделать 20, чтобы ресурсов жрало побольше, чтобы уровень абстракций был повыше и чтобы в акке в гитхабе хоть какая-то активность отображалась

    хотел поставить тег <joke> но нет.. в каждой шутке есть лишь доля шутки..


    1. Ryav
      31.05.2023 11:59

      Не знаю, мне через wg-easy оч удобно тут же добавить клиента, скачать для него конфиг и qr вместо того, чтобы лезть на сервер, генерировать конфиг, потом оттуда его вытягивать/отправлять, перезапускать службу. А потом ещё и генерировать qr-код, если нужно на телефоне быстро добавить.


    1. itdog Автор
      31.05.2023 11:59
      +1

      Если несколько серверов надо связать, то, конечно, это не нужно. А когда WG используется для обхода блокировок, то уже на 10ом клиенте начинает надоедать собирать конфигурацию через wg genkey | tee privatekey | wg pubkey > publickey


      1. 13werwolf13
        31.05.2023 11:59

        Я конечно сонласен, но это задача уровня "скрипт в 5 строчек" или ансибловая плейбука, но никак не огромный комбайн включающий в себя столько всего что у слова "перебор" появляется новое значение..


    1. goldenzol
      31.05.2023 11:59

      В первую очередь разработчики сделали быстрый и лаконичный протокол на уровне ядра. Все эти решения на гитхабе вполне уместны - упрощают развёртку, сам протокол не меняют


    1. sermart1234
      31.05.2023 11:59

      И зачем мне это, если я устанавливаю wg-easy и одной кнопкой добавляю пользователей и получаю qr или конфиг для клиента? Мне больше заняться нечем как конфиги крутить?


  1. at5Fd8NVdfpf
    31.05.2023 11:59

    Если уже есть сервер на убунте, или есть заодно другие задачи кроме VPN, то норм. Если надо именно сервер под VPN то практичнее сразу поставить OpenWRT, в котором удобный gui и куча разных протоколов кроме wg.


  1. skymal4ik
    31.05.2023 11:59

    В опросе о решении для управления WireGuard не хватает варианта «роутер предоставляет свой интерфейс».

    У меня микротик, и через winbox элементарно всё настраивается прямо на роутере.


    1. amethystium81
      31.05.2023 11:59

      Есть такое! А может ли Микрот через VPN гнать траффик только определенных клиентов, а остальные чтобы шли напрямую?


  1. kravec
    31.05.2023 11:59

    cyber5k/mistborn? Почему то не рассмотрен.


  1. iv13
    31.05.2023 11:59

    спасибо, открыл для себя удивительный мир ) может стоит тоже запилить свою мини - автоматизацию WG...



  1. DragonZet
    31.05.2023 11:59

    Для wireguard-ui от автора есть решение на базе systemd юнитов service и path для перезапуска после каждого сохранения конфига. Вроде как и для OpenRC и докера есть штуки там же на странице.


  1. BulldozerBSG
    31.05.2023 11:59
    +1

    А вот в Linux всё не так просто. Проблема в том, что wg-quick использует
    resolvconf для управления DNS и не поддерживает systemd-resolved,
    который используется почти везде.

    В комплект systemd входит утилита resolvectl. Которая прекрасно может прикидываться resolvconf-ом (с некоторыми ограничениями: man resolvectl #COMPATIBILITY_WITH_RESOLVCONF(8)).
    Достаточно создать символическую ссылку (как пример /usr/bin/resolvconf -> resolvectl)


    1. itdog Автор
      31.05.2023 11:59

      Добавил, спасибо


  1. Marwin
    31.05.2023 11:59

    А какое-то из этих решений позволяет управлять несколькими wg интерфейсами? Для ситуации, когда на сервере несколько внешних ip адресов... и раскидывать wireguard клиентов между ними...