Зачем я сделал REST API для WireGuard?
Несколько лет назад у меня возникла весьма серьезная потребность в VPN. Честно говоря, до того времени VPN у меня ассоциировался исключительно с какими-то корпоративными сетями и трекерами, доступ к которым нельзя было получить из России. Как же хорошо, что все меняется!
Мне посчастливилось начать свое погружение в сети с WireGuard. WireGuard напоминает какое-то криптографическое произведение искусства — с учетом того, на сколько он миниатюрен и эффективен. Поначалу я вручную разворачивал WireGuard на сервере и затем, используя максимально неинтуитивный wg-tools, генерировал для каждого клиента конфиги. В какой-то момент, когда число друзей, нуждавшихся в ключике, перевалило за 50, это превратилось в ужасающе утомительную рутину. Даже несмотря на то, что я использовал скрипт, который одной командой выдавал готовый QR-код — нужно было только отправить его другу.
В какой-то момент я наткнулся на проект wg-easy. Это было просто глотком воздуха. Приложение разворачивалось одной командой и сразу же под капотом имело все необходимое. А через удобный веб-интерфейс было чертовски приятно управлять конфигурациями клиентов. Больше не было необходимости заходить на сервер. Честно говоря, если вам нужен просто VPN для себя и близких и вы не хотите особо заморачиваться, я думаю, это до сих пор один из самых удачных вариантов. Хоть WireGuard и не создан для мимикрии трафика, и довольно легко может отслеживаться, в 98% случаев он до сих пор эффективно работает. Во всяком случае, на дату публикации этой статьи, РКН не видит особого смысла в активной борьбе с ним. Они намного больше заняты «влесом», у которого изначально был целый вагон удобных API, — в следствие чего его стали использовать повсеместно все VPN-провайдеры.
Однако, как это всегда и бывает, заходить на сайт, чтобы создать ключик другу, тоже в какой-то момент стало надоедливой рутиной. Я захотел это автоматизировать. Идеальным вариантом стал бот, которому каждый из моих друзей мог написать и получить ключик. Я стал искать API и, к моему удивлению, не нашёл того, что мне нужно. Я хотел что-то максимально простое — в духе старого доброго wg-easy.
Все проекты, на которые я натыкался, были либо:
- слишком сложны в конфигурации. Я хотел, чтобы всё разворачивалось одной командой на любом хосте;
- слишком сложны по части API. Я хотел максимально прозрачный, нативный и понятный REST;
- без какого-либо тестового покрытия;
- Go имплементация самого WireGuard.
Возможно, я просто не нашёл проект, который удовлетворял всем требованиям, или же мне захотелось переизобрести велосипед — как это всегда и бывает 😂.
И так, вдохновившись уже несколько раз ранее упомянутым проектом, я начал пилить свою апишку. Первая, скажем, MVP-версия, которую уже кто-то мог бы полноценно использовать, появилась где-то через неделю.
Как ее использовать? #
Для начала, если вам это действительно нужно и вы уже дочитали до сюда, я бы попросил вас поставить звездочку проекту. Сделать это можно перейдя в репозиторий проекта.
И так, вы решили, что хотите автоматизировать процесс генерации ключей для ваших юзеров. Первое что вам нужно убедиться, что у вас установлен docker.
curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $(whoami)
exit
Далее вы просто запускаете контейнер на основе уже готового образа. Вам не надо ничего даже собирать.
docker run -d \
-e WG_HOST=<🚨YOUR_SERVER_IP> \
-e AUTH_TOKEN=<🚨YOUR_ADMIN_API_TOKEN> \
-e ENVIRONMENT=production \
-v ~/.wg-rest:/etc/wireguard \
-p 51820:51820/udp \
-p 3000:3000 \
--cap-add=NET_ADMIN \
--restart unless-stopped \
leonovk/wg-rest-api
Очевидно, но все же вместо <🚨YOUR_SERVER_IP> вы подставляете IP адрес вашего сервера. Да вам обязательно нужен выделенный Ipv4.
Вместо <🚨YOUR_ADMIN_API_TOKEN> любую строку которая будет использоваться для авторизации ваших запросов. Поэтому постарайтесь выбрать что нибудь посложнее. Авторизацию на основе генерации хеша тоже можно использовать. Об этом есть инструкция уже в самом репозитории.
Конфигурационные переменные окружения тоже можно задавать. Их полный перечень есть тут
В принципе это все. Да больше ничего не надо. Внутри запущенного контейнера уже будет сервер WireGuard и REST API которая позволит вам взаимодействовать с ним.
Что бы убедиться, что все ок сделайте запрос:
curl http://YOUR_SERVER_IP:3000/healthz
Запущенный контейнер будет иметь промапленный том на папку .wg-rest вашего хоста. Содержимое этой папки позволит вам сделать бекап. Полную документацию по эндпоинтам вы найдете в репозитории.