WireGuard можно использовать для объединения офисов, серверов, доступа в инфраструктуру и т.д.
Предполагается, что для настройки 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
Удалить себя
Сразу после установки всё работает
Минусы:
Для Endpoint использует IP адрес. Скрипт при установке обнаруживает внешний ip и использует его в качестве endpoint. Я считаю, что нужно использовать домены. IP адреса бывает меняются, и после этого нужно будет объяснять пользователям, что поправить или вообще конфиги пересоздавать.
Делается это в /etc/wireguard/wg0.conf
В строке
# ENDPOINT $IP
вместо ip адреса можно прописать домен
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 каких-то российских рекламных платформ, только зарубежные.
Минусы:
По умолчанию для 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 первая строка, третий столбец.
Изначально ставит значение при выборе пункта меню и дальнейших операциях. Например, для выбора пункта "Добавление клиента" надо стирать 0 и вводить 5. Потом он предлагает какое-то длинное рандомное имя для клиента, приходится стирать.
Но зато, есть аргументы, описаны в документации например, добавление пользователя:
wireguard-manager.sh --add
Это не минус, это скорее странность. В 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. БД лучше при этом остановить.
Минусы
При генерации стандартно выдаётся QR-код, файл конфига и конфиг в текстовом формате. Но после создания устройства конфигурацию нельзя посмотреть. Это какая-то фича по безопасности или разработчики пока не дошли до этого функционала, непонятно.
Это не минус, это предупреждение. Продукт серьёзный, поэтому собирает телеметрию для улучшения разработки. Можно отключить сразу при установке, либо уже потом через env переменную
TELEMETRY_ENABLED
.Не считаю это минусом, но должен предупредить, что 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-сервер.
Но давайте предполагать, что нужен. Как его можно защитить?
Разрешить доступ к 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, если хотите заморочиться.
Ходим через SSH туннель. В этом случае можно не запариваться насчёт https, т.к. SSH будет всё шифровать.
ssh -L 8080:localhost:80 -N $USER@$SERVER_IP
И с запущенным туннелем можно ходить к веб-интерфейсу по адресу
Настроить Fail2ban или Crowdsec. После N попыток перебора пароля будет блокироваться доступ с атакующего IP. Но тут нужен сценарий, который будет анализировать логи выбранного решения.
Ходить к нему через этот же 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 и платить за это российской картой, гляньте этот обзор.
Обучающие материалы, не дотягивающие до полноценной статьи, публикую в моём телеграм-канале.