В какой-то момент написанного кода становится слишком много для того, чтобы просто на него забить.

Предыстория

Я backend разработчик с опытом около 3-х лет, пишу в основном на Golang. Проработал в нескольких крупных российских компаниях. Сейчас я параллельно со своей работой пытаюсь сделать удобный, дешевый VPN сервис с высокой пропускной способностью. В этой статье я хочу просто рассказать про жизненный цикл своего проекта. Возможно кому-то будет просто интересно почитать, а кто-то может почерпнуть что-то новое для себя.

Как и у всех жителей в РФ в какой-то момент времени у меня возникла потребность использовать VPN. Я начал использовать платный VPN сервис, но потом блокировки добрались и до него. Блокировки начали происходить все чаще и чаще, и я понял что надо попробовать сделать свой.

Я начал выбирать протокол для VPN и через некоторое время мой выбор пал на wireguard. Причиной данного выбора стала простота настройки, высокая пропускная способность, наличие sdk для различных платформ, а также приятное в использовании приложение.

Я арендовал сервер, и настроил на нем wireguard. В интернете есть много статей, в которых рассказывается, как настраивается wireguard на сервере. Я пользовался данной статьей от digital ocean. Сделал себе конфигурацию и начал пользоваться своим собственным сервером. Моя история могла закончиться на этом месте, но, как оказалось, я был не единственным, кому нужен был VPN. Сначала VPN понадобился членам моей семьи, потом VPN понадобился друзьям, потом друзьям друзей и тд.

Серверы стоят довольно дешево, можно за 10 евро арендовать сервер, который будет обслуживать до 200 пользователей, при этом у некоторых cloud провайдеров практически отсутствует ограничение по трафику. Bandwidth в 1 Гбит тоже очень сложно забить. Самое тонкое место оказалось CPU.

Когда количество пользователей начало увеличиваться, я принял решение автоматизировать процесс получения доступа к своим серверам за небольшую оплату. Количество пользователей быстро выросло, и надо было думать над тем, как балансировать нагрузку на какой-то пул серверов.

Немного про деплой

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

Я решил сделать отдельный сервер, который занимается вопросами подписки пользователей, далее - master_server. Серверы на которые установлен wireguard, и идет трафик от пользователей, далее буду называть - slave_server.

В то время я не знал про github actions, поэтому использовал самописную либу для мониторинга обновлений в github, для пересборки проекта при обновлении master branch.

https://github.com/tarmalonchik/git_trigger (не рекомендую пользоваться этим)

Я уже опубликовывал эту библиотеку на хабре, и мне в комментариях посоветовали перейти на github actions, что я в последствии и сделал.

Так как на master_server стоит http_server, grpc_server и большое количество воркеров для обработки телеграма, рассылок уведомлений и тд, пришлось написать отдельную библиотеку для запуска сервиса. Тут есть graceful shutdown с таймаутом, обработка паник, а также возможность добавлять воркеры на лету.

https://github.com/vkidmode/server-core (этим можно пользоваться)

Про взаимодействие slave_server и master_server я расскажу подробнее в следующей статье.

Проблема балансировки

Минимальная конфигурация wireguard выглядит примерно вот так:

[Interface]
PrivateKey = <client_private_key>
Address = <cient_address_on_server>/32
DNS = 8.8.8.8, 1.1.1.1
[Peer]
PublicKey = <server_private_key>
AllowedIPs = 0.0.0.0/0
Endpoint = <server_ip_address>:<server_port>

Можно заметить, что в данной конфигурации явно прописан IP адрес сервера. Это одна из проблем, так как хочется иметь возможность поменять сервер. Если просто прописать в конфигурации адрес сервера, то при изменении сервера придется вносить изменения во все конфигурации. Некоторые пользователи устанавливают VPN своим родителям, бабушкам, дедушкам, которые не будут иметь возможности поменять IP адрес в случае необходимости.

Я решил найти балансировщик нагрузки, для того чтобы указывать в конфигурации wireguard адрес load balancer. Так как пакеты wireguard передаются по UDP протоколу, надо искать балансировщик UDP трафика. Данная схема должна была выглядеть вот так:

Для того чтобы реализовать данную схему, необходимо использовать балансировщик нагрузки. Тут стоит упомянуть, что балансировка бывает на разных уровнях: Прикладной, Транспортный и Сетевой. В моем кейсе я использовал балансировку на сетевом транспортном уровне. Также бывают разные алгоритмы балансировки. К примеру Round Robin и Least Connections. К слову, балансировка Round Robin - это самый тупой и простой способ балансировки, можно сказать, рандомная балансировка. Балансировка по алгоритму Least Connections более предпочтительна, так как она учитывает количество соединений, когда решает куда отправить запрос.

Некоторые cloud провайдеры, такие как hetzner или digital ocean предоставляют отдельные серверы, выполняющие роль балансировщика нагрузки. Но, как оказалось, они предоставляют только балансировку tcp трафика. Связано это с тем, что балансировка tcp и udp происходит по-разному. Нам важно, чтобы пакеты в рамках одного запроса отправлялись на один и тот же сервер, иначе один запрос размажется на несколько серверов, и мы не получим ответа. Tcp запрос имеет сессию, поэтому можно производить балансировку по tcp сессии, udp же не имеет такого понятия как сессия, поэтому механизмы балансировки tcp и udp различные.

В итоге, я остановил свой выбор на nginx. Nginx дает возможность балансировать udp трафик. Это делается довольно просто. Для этого в конфигурации nginx есть отдельный блок для настойки балансировки:

upstream stream_backend {  
    least_conn;  
    server server1:51810;  
    server server2:51810;  
    server server3:51810;  
}  

У nginx есть еще более продвинутые методы балансировки, нежели Least Connections. К примеру least_time, который учитывает не только количество соединений, но также среднее время ответа с сервера. Для меня эта настройка не имеет особого смысла, так как мой сервер будет проксировать запросы через себя, и nginx будет учитывать время ответа каких-то внешних ресурсов, поэтому использовал просто least_conn.

Под выбором алгоритма балансировки необходимо указать пулл серверов. То есть теперь для добавления сервера необходимо всего лишь поправить конфигурацию в nginx и сделать service nginx reload.

Плюсы и минусы данного решения

Изначально предполагалось, что балансировка нагрузки с помощью load balancer - хорошая идея. Я думал, что большая часть вычислительных мощностей серверов расходуется на encryption/decryption upd пакетов в wireguard, и load balancer не будет сильно нагружаться, так как занимается только пробрасыванием пакетов. Но я ошибался, после того как я нагрузил серверы, оказалось, что нагрузка на load balancer получается примерно такой же как и на конечном сервере. Выходит, что балансировать нагрузку таким образом (в моем кейсе) не самая лучшая идея. Дополнительную проблему создает то, что трафик считается на load balancer как суммарный трафик со всех серверов. Так что, даже в том случае, если бы CPU нагрузка на load balancer была низкой, мне пришлось бы платить двойную стоимость за трафик.

Плюсы:

  • Легко добавлять и убирать новые серверы

  • Качественная балансировка, нагрузка равномерно распределяется по серверам (она не учитывает количество трафика от пиров, но лучше, чем слепое распределение)

Минусы:

  • Load Balancer сервер нужно выбирать мощный, а значит, увеличивается стоимость

  • Переплата за трафик

  • Существует единая точка отказа, если Load Balancer чувствует себя плохо, то все клиенты испытывают проблемы

  • Сложность масштабирования, если количество серверов превысит 10-15, то невозможно будет найти сервер на роль балансировщика

  • Ограниченность канала балансировщика.

Далее

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

Вторая часть

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


  1. cartonworld
    00.00.0000 00:00

    This is package to create workers pull …

    Это из readme на гитхабе. Наверное, имеется в виду workers pool?


    1. far-rainbow
      00.00.0000 00:00
      -1

      имеется в виду PULL -- скачать данные из репозитория


      1. cartonworld
        00.00.0000 00:00
        +3

        Переведите, пожалуйста, это предложение с учетом вашего комментария: This is package to create workers pull with graceful shutdown and panics catcher.


        1. 0x7o
          00.00.0000 00:00
          +2

          "Это пакет для создания рабочей тяги с изящным завершением работы и ловцом паники." :)


  1. fk0
    00.00.0000 00:00
    +30

    Почему не рассматривается балансировка на уровне DNS? Начиная с множественных A-записей. В показанной схеме весь траффик приходит на один сервер с которого распределяется дальше и это единственная точка отказа. Он может упасть сам, может потерять соединение с интернетом и т.п. Наконец, точек входа же должно быть много, ибо любая попадает в блокировки роскомпозора.

    Потом непонятен смысл балансировать VPN-траффик. Там входящий траффик строго равен исходящему, и смысл балансировки казалось бы, чтоб раскидать траффик по разным серверам, а здесь опять же нужен мега-сервер способный переварить многие гигабиты. Если Wireguard настолько тяжёл, что упирается в CPU, то наверное проще было бы обратить взор в сторону менее популярных технологий VPN. В первую очередь способных мимикрировать под HTTPS, во-вторую может быть, если клиентов достаточно, перейти с VDS на реальный сервер (ибо на VDS очень мелко нарезают CPU) или сменить хостера.

    Не рассмотрен вопрос, что клиенты начнут безобразия хулиганить или качать торренты. Сразу проблемы с хостингом (почему опять же нужны множественные серверы и привязка клиента к ограниченному числу точек выхода, чтоб проблемный клиент не сломал всю сеть). Ну или кто-то политоту в российских сетях через VPN устроит и за тобой быстро приедет машина с голубым огоньком в которой тебя будут долго мутузить и заставлять сознаться что ты агент навального. Платить за хостинг со своей карты стразу становится как-то не очень удобно. Сразу нужны какие-то схемы, как шифроваться в интернете, как платить, как получать деньги без документов. А настроить впн -- любой ботаник умеет. Ну почти.

    Потом мне кажется, VPN продать скорей невозможно. Я бы не покупал: потому, что когда я иду к хостеру я знаю, что у него несколько другой профиль деятельности и ему главное бабки получить и он не знает чем я там заниматься буду, пока у него от меня нет проблем. И подсмотреть ему тяжело. Да он может снять снашпоты с виртуалки, но там внутри чёрт ногу сломит, у всех всё по-разному, нужны специлисты чтоб разбираться, а им зарплату платить. А когда я покупаю VPN -- там сразу во-первых понятно зачем оно и сразу даже не весь траффик пишется, а просто софт стоит слегонца патченный (тот же wireguard -- где он брался?), так что траффик в канале абонент -- VPN-сервер изначально оказывается фактически открытый (во всей системе какой-нибудь PRNG не RNG и всё). И там регистрация с почтой, телефоном, и банковской картой, и номером паспорта. Тем более если VPN с русскими корнями или стоит у хостера с русскими корнями. На одном VPN уже сотни абонентов и имеет смысл подсмотреть что там на машине делается.


    1. ky0
      00.00.0000 00:00
      +2

      Такое иногда случается, когда разработчик залезает на поле эксплуатации :) Цель видит, но пути решения выбирает «специфические».


    1. tarmalonchik Автор
      00.00.0000 00:00

      Здравсвтуйте) Про балансировку DNS я напишу в следующей статье, это как раз один из вариантов к которому я пришел в дальнейшем.


  1. MagisterAlexandr
    00.00.0000 00:00
    +17

    Когда количество пользователей начало увеличиваться

    На самое интересное выделено всего пять слов.

    Насущная проблема pet-проектов именно в том, чтобы найти заказчиков.


    1. tarmalonchik Автор
      00.00.0000 00:00

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


      1. MagisterAlexandr
        00.00.0000 00:00
        +5

        Один миллионер рассказывает, как он достиг такого благосостояния:

        - Когда я был молодым, я приехал в Америку. В кармане у меня было два цента. На них, я купил два грязных яблока. Помыл и продал каждое яблоко за четыре цента. Потом купил четыре яблока и также продал все яблоки...

        - И что было дальше?

        ...


  1. ammo
    00.00.0000 00:00
    +6

    В моем кейсе я использовал балансировку на сетевом уровне

    В вашем кейсе вы использовали балансировку на транспортном уровне. Балансировкой на сетевом уровне занимаются маршрутизаторы


    1. tarmalonchik Автор
      00.00.0000 00:00

      Да, вы правы, допустил ошибку, сейчас поправлю)


  1. maikuss
    00.00.0000 00:00
    +10

    Уже есть люди, которые затеяли такой же или похожий бизнес, и пострадали на этом. В РФ , если я не ошибаюсь, предоставление услуг связи - деятельность, подлежащая лицензированию. А появление среди ваших клиентов каких-нибудь любителей "веществ" или "детского питания" может подвести вас под уголовное преследование сразу в нескольких странах. Про политически активных граждан и качателей торрентов выше уже написано.


    1. gmtd
      00.00.0000 00:00

      А ещё помощь в обходе блокировок РКН тоже вроде наказуемо с точки зрения российского contemporary law


    1. vadimr
      00.00.0000 00:00
      +2

      А для получения лицензии наверняка надо установить у себя оборудование СОРМ-3 и хранить трафик 3 года. Знающие люди, поправьте меня, если я ошибаюсь.

      Услуга технически предельно ясная и при этом востребованная, но почему-то очень плохо представленная на рынке. Что заставляет задуматься о причинах.


      1. fk0
        00.00.0000 00:00

        Хранить траффик 3 года -- это что стёб такой или правда? А траффик между абонентами тоже три года хранить? Такой траффик нагенерировать -- запросто. Йобибайтами. Жёсткие диски не резиновые пока ещё.


        1. vadimr
          00.00.0000 00:00
          +2

          Закон Яровой. Там попроще немножко требования, но суть такая.


        1. vadimr
          00.00.0000 00:00

          К слову, если вы будете генерировать трафик ёбибайтами, провайдер вас забанит. Обычный договор оказания услуг связи подразумевает нагрузку в пределах среднестатистической.


        1. GiGteG
          00.00.0000 00:00

          у нас на диски ВLueRay отдельный сервак логи пишит. Посчитали, что так, самое дёшево и сердито. Яровая с гоп-компашкой хотели в Думе протащить, что б и медио контент сохраняли)))бу-га-га, весь спам пересылаемый с поздравлениями от бабушек и дедушек..ковид ей планы подпортил, а потом не до этого.


    1. tarmalonchik Автор
      00.00.0000 00:00
      +1

      Про скачивание торрентов я напишу в следующих статьях. А можете привести примеры кейсов, где люди с похожим бизнесом пострадали. Я просто таких случаев не знаю, хотелось бы ознакомиться с ними подробнее, заранее спасибо)


      1. maikuss
        00.00.0000 00:00
        +2

        Вообще-то рекомендуется, начиная любую деятельность, даже если это выращивание петрушки, задуматься о том, почему вокруг так мало людей, которые уже занимаются чем-то подобным, несмотря на то, что это так несложно, и клиентов много. Задумавшись, изучить хоть немного законодательство и возможные риски. Навскидку вспоминается Фёдор Власов, придумавший приложение-прокси для доступа к VK.COM с территории цивилизованных стран. На этом ресурсе есть о нём. И австриец William Weber, который нашёл своё счастье, запустив exit node TOR. Про него тоже много, где писали.


        1. fk0
          00.00.0000 00:00
          +1

          Проще говоря: "свято место пусто не бывает".


      1. FreeNickname
        00.00.0000 00:00

        DEL, уже написали


      1. mmaks17
        00.00.0000 00:00
        +2

        почему бы сразу не написать статью как сделать хорошо ?

        получаются какие то урывки из серии " так вот туда , вам не надо"


    1. heejew
      00.00.0000 00:00
      +3

      Все гораздо проще. Ст 15.8 149ФЗ.

      В РФ предоставление возможности доступа к заблокированным ресурсам незаконно в случае неопределенного количества лиц, что и предполагается при коммерциализации. ТС буквально находится в серой зоне, если он не блокирует запрещенку по спискам РКН.

      Вы думаете, почему всякие впн сервисы зарегистрированы в других странах. Так вот именно поэтому.


  1. Daddy_Cool
    00.00.0000 00:00
    +1

    Я замечал, что популярные VPN работают нынче в мерцающем режиме, то работают, то не работают. У некоторых людей стоит аж по десятку разных VPNок. Так что возможно идея "каждому жителю РФ по своему собственному VPN" вполне здрава.


    1. Areso
      00.00.0000 00:00

      Надеюсь, Amnezia VPN или Outline VPN станут на этом фоне гораздо более популярными


      1. FreeNickname
        00.00.0000 00:00

        Пользуясь Amnezia VPN Вы поддерживаете появление вот таких статей на хабре. Оригинальный заголовок гласил "7 января". Только получив почти 200 минусов автор, видимо, о чём-то задумался. На 100 минусах в комментариях автор всё ещё полагал, что всё хорошо, всё правильно, эта статья – отличная идея.


        1. SpectrumOS
          00.00.0000 00:00
          +1

          Не вижу вообще никакой проблемы в статье даже с оригинальным заголовком. Была поставлена цель получить огромный охват. Охват получен.

          Минусов накидали? Так это даже лучше: теперь у всех на слуху. Было бы столько просмотров у статьи с названием "Рассказ про наш бесплатный впн"?

          16 рандомных чуваков из комментариев написали "теперь не буду пользоваться вашим впном"? Зато 400 других, узнавших о нём только что, установили.

          Помимо всего прочего, качество софта никак не зависит от качества заголовков на Хабре.


          1. FreeNickname
            00.00.0000 00:00

            Ну, спасибо за подтверждение моих слов :) Используя Amnezia VPN вы поддерживаете появление таких статей на Хабре. Вас, как директора по маркетингу, видимо, всё устраивает в этом раскладе. Меня нет.

            Со своей стороны я могу сделать не так много. Например, напоминать про ту статью везде, где попадётся рекомендация этого VPN-сервиса. Видите ли, статья действительно очень запоминающаяся, и я не единственный, кто, увидев такую статью, никогда подобным сервисом пользоваться не будет. Другие люди со схожим взглядом на мир будут чаще натыкаться на эту статью и реже пользоваться сервисом. А может быть нет. Как я сказал, я могу сделать не так много. Но уж что могу)

            Впрочем, мне, думаю, следовало бы действовать эффективнее. Охват у подобных моих комментариев действительно смешной. Мне нужно было бы написать статью с заголовком "Создателя Amnezia VPN арестовали за изнасилование страуса в Венском зоопарке", а в статье написать, что это шутка такая. Вот здорово было бы на Хабр заходить, да? :) Когда каждая первая статья такая. Весело-задорно.


            1. SpectrumOS
              00.00.0000 00:00

              Это не мой продукт, поэтому я только рад буду, если вы сделаете подобную статью))

              Мне, как любознательному маркетологу, крайне интересно наблюдать за нестандартными кейсами и последующими за ними эффектами. Так что, как по мне, статья вышла примечательная. И со своей задачей, видимо, справилась)

              Из недавнего можете почитать про Тануки, вокруг которых разгорелся безумный скандал. Со свечкой не стоял, но часто говорят, что их выручка после этого выросла.


  1. BobArctor
    00.00.0000 00:00
    -3

    Сейчас придёт какое-нибудь комьюнити и за master-slave напихает в панамку.


  1. Dzhonny
    00.00.0000 00:00

    Автор, а у вас получилось собрать нужное количество покупателей для того, чтобы ваше решение оказалось более эффективным, чем вести таблицу в екселе?

    Как по мне, с VPN основной вопрос в том, что эта услуга недостаточно востребована, и при цене продажи в 250-500 рублей таргетированная реклама становится невыгодной после десятка кликов без конверсии, а какие-то другие способы заявить о своём продукте с таким бюджетом вовсе недоступны.

    Я помню, как кто-то из активистов пиарился с "блокчейн VPN" и всё кончилось пшиком — думаю, просто из-за отсутствия спроса.


    1. tarmalonchik Автор
      00.00.0000 00:00

      Вы правы, когда подписка стоит копейки, условно 100-200 рублей, очень сложно делать рекламу, так как стоимость одной конверсии выходит гораздо выше чем приносит один покупатель. Но мы сейчас не делаем рекламу, и весь трафик пользователей - это пользователи которые приходят сами по рекомендации и тд. И на текущий момент этот трафик меня устраивает. Условно можно увеличивать количество пользователей на 10 процентов каждый месяц. Если сделать грамотно воронку то реклама особо и не нужна.


  1. Ulibka
    00.00.0000 00:00
    +1

    Добрый день, хотелось бы увидеть вторую часть - что у Вас получилось с балансировщиком ?


  1. quarus
    00.00.0000 00:00

    Централизованный подзаконный сервис рано или поздно будет вскрыт... а если пойти по пути децентрализации (сегментации) доступа пользователей к сервису? Кто-нибудь ходил этим путём?


    1. tarmalonchik Автор
      00.00.0000 00:00

      Кроме проблемы с настройкой сервера под VPN есть и другая проблема для большинства пользователей. Сейчас рублями сложно оплатить заграничные сервера. Нужна иностранная карта, которая есть не у всех.


  1. Vlafy2
    00.00.0000 00:00

    Автор, говорите за себя. Не всем жителям РФ понадобился этот ваш впн. И даже не большинству.


  1. AlikhanAkhmetov
    00.00.0000 00:00
    -1

    У меня тоже есть свой пет проект. Вот скидываю ссылку

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

    http://ahmetovalihan.pythonanywhere.com/


  1. Huanito
    00.00.0000 00:00

    Интересный пост. столкнулся с ситуацией когда знакомые/друзья/ и тд расхватали мои сервера и понимаю что спрос есть даже по сарафанному радио. А возможно ли автора попросить сделать некий howto, касающийся балансировщика