Wireguard для Kubernetes и удобные GUI
Can I just once again state my love for [WireGuard] and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art.Linus Torvalds, on the Linux Kernel Mailing List
Уверен, что многие уже слышали про Wireguard. Некоторые даже щупали вживую. Мне он вполне понравился в продакшене как по производительности, так и по простоте настройки. Да, там нет миллиона загадочных конфигураций на все случаи жизни как у OpenVPN и XFRM+StrongSwan в IPSEC VPN. Он прост и лаконичен как в коде, так и в конфигах. Жирным и неповоротливым он станет еще нескоро. Короче, такой позитивный вариант сценария «сжечь легаси и написать все как надо».
Я решил не писать очередной гайд «как я поставил Wireguard», а поделиться некоторыми полезными утилитами. Некоторые с очень удачным, на мой вкус GUI, что уместно для сервисов со множеством пользователей. Разберем использование этого VPN для связи между нодами в разных кластерах Kubernetes, несколько web-GUI для генерации и пару полезных ресурсов.
Зачем он вообще нужен?
Ключевой вопрос. Одна из самых крутых его фишек — он очень производительный. В большинстве кейсов меньше задержки и выше пропускная способность при равной загрузке CPU. Если вы платите за потраченные ресурсы или планируете аренду виртуальных машин с учетом пиковых нагрузок, то этот тип VPN еще и сэкономит вам деньги. Объяснять, чем плохо гонять трафик по открытым сетям между отдельными нодами, я думаю не надо.
Источник: www.wireguard.com/performance
Причем стоит обратить внимание на то, что он был включен в состав ядра начиная с Linux 5.6, а с весны этого года он также включен в состав основной ветки ядра Android, что дает нам отличную энергоэффективность на мобильниках. Хотя, надо сказать, что он и до этого не особо напрягал батарею телефона.
Kilo — wireguard для Kubernetes
Очень часто у компаний крупнее среднего возникают ситуации, когда необходимо использовать несколько разных облаков. Причины разные — отказоустойчивость, хорошее присутствие в регионе и низкие пинги. Иногда цены на конкретные продукты. Например, вы можете крутить фронтенд и основную логику на собственных серверах, а GPU-hungry задачи выносить на AWS-инстансы.
Как это работает? Kilo требует наличия wireguard kernel-модуля на всех нодах. Если вы используете ядра новее 5.6, то модуль будет уже в основной ветке и допиливать ничего не придется. Далее, kilo agent, «kg», запускается на каждой ноде кластера, настраивая приватные и публичные ключи для организации VPN. Также автоматически настраиваются правила маршрутизации трафика между отдельными регионами. Также kilo может работать совместно с другими сетевыми решениями для кластеров, например с Flannel. При этом kilo будет обеспечивать связь между регионами, а Flannel позаботится о трафике внутри одной локации.
При построении сетевой топологии он опирается на topology.kubernetes.io/region, но можно разметить регионы и вручную.
Требования:
- Ядро новее 5.6 или отдельный модуль wireguard
- Белые IP у нод, для организации прямого коннекта между ними.
Более подробная информация есть в прошлогоднем выступлении разработчиков на Kubernetes Forums в Сеуле и в документации.
wg-gen-web
Что называется, «yet another config generator». Но очень приятный в работе. Основное отличие в подходе — автор не пытается на лету править конфигурацию работающего сервиса, а лишь предоставляет удобный GUI для генерации правил. Дальше вы сами имплементируете обновление конфигов на свой вкус.
Ключевые фичи — генерирует удобные QR-коды для мобильных клиентов и отправляет на почту клиенту все необходимые данные для подключения. Ну и докеризирован, само собой. Репозиторий тут.
Деплой довольно прост:
docker run --rm -it -v /tmp/wireguard:/data -p 8080:8080 -e "WG_CONF_DIR=/data" vx3r/wg-gen-web:latest
Subspace
Еще один GUI для удобной работы с множеством клиентских устройств.
Основные фичи:
- Single Sign-On с использованием SAML. Можно заходить под Google учеткой.
- Добавление и удаление устройств в несколько кликов
- Генерация индивидуальных конфигов для каждого устройства. Ну и QR-код, конечно.
- HTTPS от Let’s Encrypt из коробки и автоматический редирект на 443 порт
Легко деплоится на VPS. У нас, кстати, они есть. Можем отсыпать)
На сервере должен быть установлен wireguard и открыты порты: 80/tcp, 443/tcp, 51820/udp (WireGuard). При этом надо удалить штатный dnsmasq, так как он будет запущен в контейнере.
Дальше все довольно типично, только --env SUBSPACE_HTTP_HOST заменить на свой домен:
# Your data directory should be bind-mounted as `/data` inside the container using the `--volume` flag.
$ mkdir /data
docker create \
--name subspace \
--restart always \
--network host \
--cap-add NET_ADMIN \
--volume /usr/bin/wg:/usr/bin/wg \
--volume /data:/data \
--env SUBSPACE_HTTP_HOST=subspace.example.com \
subspacecloud/subspace:latest
$ sudo docker start subspace
Репозиторий тут.
Вместо выводов
Если вы еще не пробовали этот VPN — настоятельно рекомендую. Часто он способен оживить не очень мощное железо, которое не справлялось под нагрузкой ранее. А еще он не очень сложен в конфигурации. Правда, его основная задача все же пробивание прямых, заранее настроенных туннелей. Всякие динамические конфигурации ему недоступны в привычном понимании. Своеобразная плата за простоту и производительность.
Кстати, если вы еще не в курсе, то wireguard уже включен в бета-версию RouterOS 7.1 от MikroTik. Попробовать можно уже сейчас, но, по моим ощущениям, оно еще сыровато.
Ну и традиционно могу пригласить попробовать задеплоить wireguard на наших VPS. Например, чтобы заворачивать часть трафика домашней сети в Швейцарию или Нидерланды. У нас много разных локаций и ценовая политика весьма приятная для подобных задач.
Как я уже говорил, Wireguard очень экономно потребляет ресурсы, поэтому более чем достаточно будет минимальной конфигурации с 1 ядром и 1 ГБ оперативной памяти для поддержки большого количества клиентов. Цены тоже получаются довольно гуманные: