Привет, Хабр!
Идея
С первых недель использования Wireguard у меня томилась идея сделать систему управления Wireguard , а также его установку максимально простой, хотя куда проще казалось бы.
Конечно сейчас уже есть проекты которые максимально упрощают установку Wireguard , тот-же wg-easy (https://github.com/wg-easy/wg-easy), но хотелось создать что-то свое, и вот руки дошли.
Используемый стек
С используемым инструментарием я определился практически сразу:
Python
Bash
Docker
Telegram
Как думаю уже понятно телеграмм бот написан на Python, c использованием библиотеки PyTelegramBotApi. Использовал эту библиотеку а не Aiogram потому-что уже был опыт работы с ней, да мощности асинхронности данному боту, по крайней мере в моей задумке не нужно. Все основные команды выполняются через bash скрипты, которые вызывает Python. И в итоге это все собирается через Docker.
Начало работы
Прежде чем начать использовать бота, необходимо добавить следующие параметры в файл `config.py`.
# config.py
mainid = [] # ID пользователей, которые имеют доступ к боту
api_tg = "" # API ключ Telegram
Свой id можно узнать у бота @get_myidbot, а APi ключ получить соответственно у @BotFather.
Запуск через Python
Установите зависимости, выполнив следующую команду:
pip install --no-cache-dir -r requirements.txt
Запустите бота с помощью следующей команды:
python3 main.py
Запуск через Docker
Запустите бота в режиме Docker с помощью следующей команды:
docker-compose up -d
Управление через Telegram
После запуска бота заходим в раздел администрирование и выбираем и нажимаем кнопку "Установка Wireguard", и ждем пока все установится. Здесь же можно сохранить настроенную конфигурацию и импортировать ее же как резервную копию
Затем можем перейти в панель управления и нажать кнопку "Конфиги", чтобы убедиться, что сервер Wireguard работает.
Чтобы добавить клиента, нажмем кнопку "Добавить конфиг", и введем имя для нового конфига. Бот выдаст QR-код, файл конфигурации и текст конфигурации.
Если потом нажать "Конфиги", то бот выдаст уже изменений конфигурационный файл сервера, конфиги клиентов, и ip адреса с названиями клиентов.
Для удаления конфига нажмем кнопку "Удалить конфиг", и в соответствии с инструкцией удалим нужный ненужный клиент
Что может данный бот
Данный проект нацелен на быстрое разворачивание VPN сети.
Функционал бота реализуемый на данный момент:
Доступ к боту ограниченному кругу лиц
Установка и настройка Wireguard сервера
Добавление/Удаление конфигураций пользователей
Сохранение и импорт конфигурации сервера
Функционал бота планируемый в реализации в будущем:
Оттачивание существующего функционала
Сохранение нескольких конфигураций
Импорт конфигураций из файла
Включение/Выключение конфигураций пользователей по таймеру
Управление несколькими VPN сетями одновременно
Объединение нескольких VPN сетей в одну
Заключение
Спасибо, что читаете мою первую статью! Оцените идею, дайте совет – вместе создадим идеальный инструмент для управления WireGuard.
Комментарии (28)
zartdinov
20.12.2023 17:33Немного не понял зачем устанавливать wireguard через бота? Установили бота, но не установили сам wireguard? В сосднем контейнере может сразу поднять.
djonyx756 Автор
20.12.2023 17:33У меня была идея в том, чтобы управлять сервером Wireguard через бота. Установка через бота сделана для упрощения. При установке через бота сразу создается файл wg0.conf для сервера, а так-же дополнительные настройки, по типу прописать "net.ipv4.ip_forward=1", автоматически определить белый ip сервера и тд. Вот сам скрипт установки Wireguard https://github.com/Djonyx756/wg_telegram/blob/main/scripts/start_wg.sh
MaKS_Ibl4
20.12.2023 17:33Мой вариант, развернут wg-esy, накидано несколько команд для бота. А именно создать, удалить, отключить, с возможностью посмотреть онлайн не онлайн и сколько трафика (за счёт готовых функций wg-esy). Минусы конечно есть, потому как можно напрямую общаться с wg-esy, но решил не заморачиваться и делаю запросы к web методам.
djonyx756 Автор
20.12.2023 17:33Выглядит интересно. Ну я своего и решил сделать, потому-что мне не нравится что у wg-easy есть общение через web. Первая версия была у меня раскидал все на 3 контейнера: Телеграм бот, wireguard и mqtt брокер сообщений (практиковался с брокерами сообщений). Вроде все работало, но выглядело громоздко. Ну мысль с подсчетом трафика интересная)
MaKS_Ibl4
20.12.2023 17:33Согласен, моя задача на коленке было собрать возможность через бота тыркать wg-easy) а у вас более правильная реализация получается, без лишних компонентов.
mehatron
20.12.2023 17:33По заголовку подумал, что предлагается передавать трафик Wireguard через сообщения в телеграмме о_О
Joyz
20.12.2023 17:33Вот еще одна интересная реализация https://github.com/mercurykd/vpnbot
MaKS_Ibl4
20.12.2023 17:33Отличное решение, AdGuard только моросит иногда. А так в целом стабильно работает. Тут зависит от цели, если для себя и друзей, отличное решение. Там под WG индивидуальные конфиги, а под SS и xRay общие. Понятно что на них в принципе нет контроля сколько человек через один конфиг сидит без дополнительного вмешательства.
MiraclePtr
Wireguard в России в 2023... ну такое.
Markscheider
Разделяю ваш скепсис, но, справедливости ради, отмечу: пока вполне работает
vvzvlad
У меня до серверов вне рф перестает раз в неделю работать, приходится порт менять.
Ninil
Почему? Можете пояснить для немного далеких от темы?
GfxMod
РКН уже успешно тестировал блокировку Wireguard, так теперь это что явно не самый надёжный метод обхода блокировок
MaKS_Ibl4
мне кажется все это странно работает, читал про несколько инцедентов так сказать, что во время массовых блокировок даже openvpn жил и не тужил. Возможно тонкостей больше, вплоть до способа подключения.
MiraclePtr
Это зависит от 1) наличия или отсутствия ТСПУ у провайдера 2) расположения сервера (в некоторых случаях трафик в некоторые направления не фильтруют) 3) региона, где находится клиент (интенсивность блокировок разница в зависимости от локации)
sasha_semen
У меня fastproxy вполне себе работает, вообще без этих ваших vpn.
Re1ter
Это не ваша заслуга, а наша недоработка! ©
Palesandr
спасибо, запесали! ©
MiraclePtr
Более того, из-за этого проблем были (и будут) в том числе и у тех, кто использует WG не для обхода блокировок, а по естественному назначению (объединение локальных сетей и удаленный доступ к корпоративным ресурсам).
MaKS_Ibl4
Согласен, тут Дом Ру с Cisco Any connect поругался) так что то ли ещё будет
MiraclePtr
Оппачки, а вот это уже интересно, есть подробности?
MaKS_Ibl4
Дак все тривиально, классический рабочий день, ни что не предвещало беды. Как у всех удаленщиков у кого дом ру, откинулся Any Connect, поднимается и падает минуты через 2 и так по кругу. Потом все прошло в какой-то момент)
MiraclePtr
Интересно было бы глянуть на логи клиентов и серверов в момент обрывов. Больше похоже не на намеренную блокировку, а на какие о проблемы с UDP у провайдера (например, кривой NAT)
djonyx756 Автор
В начале осени у меня и у знакомых были проблемы 1 день с подключением на операторе Теле2, возможно тестили блокировку, возможно просто проблемы на их стороне.
MiraclePtr
Тоже с Anyconnect?
MaKS_Ibl4
а тут не ясно, если предварительно завернуть трафик в другой то работало стабильно на сколько мне известно)
MiraclePtr
Ну это же Anyconnect - он поднимает сначала обычный TLS (TCP), а потом DTLS (UDP). Когда вы заворачиваете его во что-нибудь, то работает только TLS (TCP), а DTLS (UDP) скорее всего идет нафиг, клиент и сервер при подключении пожимают плечами, fallback'аются и продолжают работать как могут.
При прямом подключении же они успешно поднимают UDP и начинают работать через него, а через какое-то время оно отваливается (например, из-за криво настроенного conntrack), вполне возможно что такая ситуация неправильно хэндлится (если вообще хэндлится, может там и фолбэка на этом этапе уже нет) и подключение к серверу разрывается до следущего реконнекта.
Насчет того, что это намеренная блокировка - пока что сомнительно. Это TLS VPN, то есть его трафик снаружи неотличим от обычного HTTPS. Детектировать его можно или active probing'ом (в опенсорсном сервере для защиты от такого завесли режим камуфляжа), но тогда стоило бы ожидать бана IP/SNI целиком после такого обнаружения. Или могут детектировать по фингерпринту клиента, но для РКН это будет прям большой шаг вперед (пока не верится, все-таки они туповатые), и там то же самое что и в первом случае - подключения бы отстреливали еще на этапе хэндшейка, а не спустя две минуты.