Привет, Хабр!

Идея

С первых недель использования 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

  1. Установите зависимости, выполнив следующую команду:

pip install --no-cache-dir -r requirements.txt
  1. Запустите бота с помощью следующей команды:

python3 main.py

Запуск через Docker

Запустите бота в режиме Docker с помощью следующей команды:

docker-compose up -d

Управление через Telegram

После запуска бота заходим в раздел администрирование и выбираем и нажимаем кнопку "Установка Wireguard", и ждем пока все установится. Здесь же можно сохранить настроенную конфигурацию и импортировать ее же как резервную копию

Затем можем перейти в панель управления и нажать кнопку "Конфиги", чтобы убедиться, что сервер Wireguard работает.

Чтобы добавить клиента, нажмем кнопку "Добавить конфиг", и введем имя для нового конфига. Бот выдаст QR-код, файл конфигурации и текст конфигурации.

Если потом нажать "Конфиги", то бот выдаст уже изменений конфигурационный файл сервера, конфиги клиентов, и ip адреса с названиями клиентов.

Для удаления конфига нажмем кнопку "Удалить конфиг", и в соответствии с инструкцией удалим нужный ненужный клиент

Что может данный бот

Данный проект нацелен на быстрое разворачивание VPN сети.
Функционал бота реализуемый на данный момент:

  • Доступ к боту ограниченному кругу лиц

  • Установка и настройка Wireguard сервера

  • Добавление/Удаление конфигураций пользователей

  • Сохранение и импорт конфигурации сервера

Функционал бота планируемый в реализации в будущем:

  • Оттачивание существующего функционала

  • Сохранение нескольких конфигураций

  • Импорт конфигураций из файла

  • Включение/Выключение конфигураций пользователей по таймеру

  • Управление несколькими VPN сетями одновременно

  • Объединение нескольких VPN сетей в одну

Заключение

Ссылка на GitHub

Спасибо, что читаете мою первую статью! Оцените идею, дайте совет – вместе создадим идеальный инструмент для управления WireGuard.

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


  1. MiraclePtr
    20.12.2023 17:33

    Wireguard в России в 2023... ну такое.


    1. Markscheider
      20.12.2023 17:33

      Разделяю ваш скепсис, но, справедливости ради, отмечу: пока вполне работает


      1. vvzvlad
        20.12.2023 17:33

        У меня до серверов вне рф перестает раз в неделю работать, приходится порт менять.


    1. Ninil
      20.12.2023 17:33

      Почему? Можете пояснить для немного далеких от темы?


      1. GfxMod
        20.12.2023 17:33

        РКН уже успешно тестировал блокировку Wireguard, так теперь это что явно не самый надёжный метод обхода блокировок


        1. MaKS_Ibl4
          20.12.2023 17:33

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


          1. MiraclePtr
            20.12.2023 17:33

            Это зависит от 1) наличия или отсутствия ТСПУ у провайдера 2) расположения сервера (в некоторых случаях трафик в некоторые направления не фильтруют) 3) региона, где находится клиент (интенсивность блокировок разница в зависимости от локации)


          1. sasha_semen
            20.12.2023 17:33

            У меня fastproxy вполне себе работает, вообще без этих ваших vpn.


            1. Re1ter
              20.12.2023 17:33

              Это не ваша заслуга, а наша недоработка! ©


            1. Palesandr
              20.12.2023 17:33

              спасибо, запесали! ©


        1. MiraclePtr
          20.12.2023 17:33

          Более того, из-за этого проблем были (и будут) в том числе и у тех, кто использует WG не для обхода блокировок, а по естественному назначению (объединение локальных сетей и удаленный доступ к корпоративным ресурсам).


          1. MaKS_Ibl4
            20.12.2023 17:33

            Согласен, тут Дом Ру с Cisco Any connect поругался) так что то ли ещё будет


            1. MiraclePtr
              20.12.2023 17:33

              Оппачки, а вот это уже интересно, есть подробности?


              1. MaKS_Ibl4
                20.12.2023 17:33

                Дак все тривиально, классический рабочий день, ни что не предвещало беды. Как у всех удаленщиков у кого дом ру, откинулся Any Connect, поднимается и падает минуты через 2 и так по кругу. Потом все прошло в какой-то момент)


                1. MiraclePtr
                  20.12.2023 17:33

                  Интересно было бы глянуть на логи клиентов и серверов в момент обрывов. Больше похоже не на намеренную блокировку, а на какие о проблемы с UDP у провайдера (например, кривой NAT)


                  1. djonyx756 Автор
                    20.12.2023 17:33

                    В начале осени у меня и у знакомых были проблемы 1 день с подключением на операторе Теле2, возможно тестили блокировку, возможно просто проблемы на их стороне.


                    1. MiraclePtr
                      20.12.2023 17:33

                      Тоже с Anyconnect?


                  1. MaKS_Ibl4
                    20.12.2023 17:33

                    а тут не ясно, если предварительно завернуть трафик в другой то работало стабильно на сколько мне известно)


                    1. MiraclePtr
                      20.12.2023 17:33

                      Ну это же Anyconnect - он поднимает сначала обычный TLS (TCP), а потом DTLS (UDP). Когда вы заворачиваете его во что-нибудь, то работает только TLS (TCP), а DTLS (UDP) скорее всего идет нафиг, клиент и сервер при подключении пожимают плечами, fallback'аются и продолжают работать как могут.
                      При прямом подключении же они успешно поднимают UDP и начинают работать через него, а через какое-то время оно отваливается (например, из-за криво настроенного conntrack), вполне возможно что такая ситуация неправильно хэндлится (если вообще хэндлится, может там и фолбэка на этом этапе уже нет) и подключение к серверу разрывается до следущего реконнекта.

                      Насчет того, что это намеренная блокировка - пока что сомнительно. Это TLS VPN, то есть его трафик снаружи неотличим от обычного HTTPS. Детектировать его можно или active probing'ом (в опенсорсном сервере для защиты от такого завесли режим камуфляжа), но тогда стоило бы ожидать бана IP/SNI целиком после такого обнаружения. Или могут детектировать по фингерпринту клиента, но для РКН это будет прям большой шаг вперед (пока не верится, все-таки они туповатые), и там то же самое что и в первом случае - подключения бы отстреливали еще на этапе хэндшейка, а не спустя две минуты.


  1. zartdinov
    20.12.2023 17:33

    Немного не понял зачем устанавливать wireguard через бота? Установили бота, но не установили сам wireguard? В сосднем контейнере может сразу поднять.


    1. 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


  1. MaKS_Ibl4
    20.12.2023 17:33

    Мой вариант, развернут wg-esy, накидано несколько команд для бота. А именно создать, удалить, отключить, с возможностью посмотреть онлайн не онлайн и сколько трафика (за счёт готовых функций wg-esy). Минусы конечно есть, потому как можно напрямую общаться с wg-esy, но решил не заморачиваться и делаю запросы к web методам.


    1. djonyx756 Автор
      20.12.2023 17:33

      Выглядит интересно. Ну я своего и решил сделать, потому-что мне не нравится что у wg-easy есть общение через web. Первая версия была у меня раскидал все на 3 контейнера: Телеграм бот, wireguard и mqtt брокер сообщений (практиковался с брокерами сообщений). Вроде все работало, но выглядело громоздко. Ну мысль с подсчетом трафика интересная)


      1. MaKS_Ibl4
        20.12.2023 17:33

        Согласен, моя задача на коленке было собрать возможность через бота тыркать wg-easy) а у вас более правильная реализация получается, без лишних компонентов.


  1. mehatron
    20.12.2023 17:33

    По заголовку подумал, что предлагается передавать трафик Wireguard через сообщения в телеграмме о_О


  1. vvzvlad
    20.12.2023 17:33

    Конигурация.


  1. Joyz
    20.12.2023 17:33

    Вот еще одна интересная реализация https://github.com/mercurykd/vpnbot


    1. MaKS_Ibl4
      20.12.2023 17:33

      Отличное решение, AdGuard только моросит иногда. А так в целом стабильно работает. Тут зависит от цели, если для себя и друзей, отличное решение. Там под WG индивидуальные конфиги, а под SS и xRay общие. Понятно что на них в принципе нет контроля сколько человек через один конфиг сидит без дополнительного вмешательства.