Разворачиваем свой VPN-сервер для себя и друзей с оплатой через Telegram
Шалом! В этой статье я покажу не только как сделать свой собственный VPN-сервис на основе WireGuard, но и как его настроить, чтобы им смогли пользоваться все твои друзья и знакомые. И даже, если пожелаешь, закидывать тебе свою долю за хостинг, пользуясь простым ботом в Telegram.
Возможность шифровать трафик и проксировать его через другие страны сейчас настолько необходима, что я не стану тратить твое время и в очередной раз перечислять все случаи, когда без VPN не обойтись. При этом большинство пользователей выбирают готовые сервисы: либо бесплатные, но ненадежные и со встроенной рекламой и слежкой, либо платные, но дорогие в сравнении с хостингом.
Чтобы сделать свой VPN, требуется поморочиться с командной строкой. Гикам вроде нас с тобой такое занятие в радость: я, не имея никакого опыта, поднял такой сервис за один вечер. Друзья стали спрашивать, нельзя ли и им получить такой же быстрый, надежный и дешевый сервис. Однако копаться с настройками никто из них не хотел.
Я долгое время генерил и раздавал готовые конфиги, но потом это стало надоедать. Тогда я задумал создать собственное решение с возможностью быстрого деплоя, администрированием через Telegram и временными квотами для пользователей. В этой статье я расскажу тебе о нем подробнее и поделюсь всеми нужными для деплоя исходниками.
WARNING! Предоставляя сторонним лицам прокси‑сервис через зарегистрированный на тебя хостинг, ты берешь на себя ответственность за все их действия в сети. Не забудь заранее обговорить, что можно делать с твоего IP-адреса, а что нельзя. А если планируешь предоставлять коммерческий сервис, подумай о составлении пользовательского соглашения, которое снимет с тебя ответственность.
ПОЧЕМУ ИМЕННО WIREGUARD?
Я выбрал WireGuard из‑за его скорости в сравнении с OpenVPN и IPSec. Ты только посмотри на эти графики.
Похожую статистику показывают тесты Protectli и Entrostat. В Linux WireGuard работает на уровне ядра, что дает дополнительный прирост в скорости.
В WireGuard не такой большой выбор асимметричных шифров, как в OpenVPN и других протоколах. Но это одновременно и плюс: меньше поверхность атаки на протокол.
АДМИН-ПАНЕЛЬ И БОТ В TELEGRAM
Итак, как для пользователя выглядит общение с моим ботом? Начнем знакомство с главного меню.
При первом входе пользователь получает приветственное сообщение от бота и тестовую подписку. В конфигах бота ты сможешь сам задать все тексты и параметры вроде времени, на которое предоставляется тестовая подписка.
В главном меню пользователь может ознакомиться со статусом своей подписки, продлить ее и получить конфиг с подробной инструкцией для подключения, а в разделе «Продлить» — приобрести подписку на определенное время.
Оплата выполняется онлайн, через сам Telegram. Соответственно, мы можем выбрать любую платежную систему, с которой сотрудничает Telegram.
INFO
Я планировал использовать для оплаты Qiwi, так как там есть открытый API для создания счетов и не требуется становиться самозанятым или ИП. К сожалению, недавно в Qiwi приостановили выпуск необходимых токенов и не сообщают о сроках возобновления. Однако в исходниках ты найдешь вариант админской панели для Qiwi.
После того как пользователь выбрал и оплатил подписку, ему приходит сообщение об удачной оплате и сразу же обновляется информация о его подписке.
В разделе «Как подключить» пользователь может получить свой конфиг для подключения к VPN-серверу и подробную инструкцию, как настроить WireGuard на своем телефоне и как им пользоваться.
И наконец, самый главный раздел — «Админ‑панель», к которому имеет доступ только админ бота.
Раздел «Вывести пользователей» позволяет получить список всех пользователей системы или только пользователей с оплаченной подпиской.
В разделе «Редактировать пользователя по id», введя Telegram ID пользователя, мы можем добавить время или обнулить его (то есть забрать подписку).
Раздел «Статичные пользователи» может понадобиться для предоставления доступа к VPN пользователям, которые не зарегистрированы в Telegram. В этом разделе мы можем создавать статичных пользователей, удалять их и получать конфиги для подключения.
НАСТРОЙКА БОТА
С тем, как выглядит бот, я тебя познакомил, теперь покажу настройки и скрипт, который разворачивает и настраивает WireGuard в пару кликов.
Начнем с конфигов бота. Первый конфиг называется config.json, в нем содержатся основные настройки бота.
«tg_shop_token»: «56456767:TEST: 343455»
- admin_tg_id — Telegram ID админа. Узнать свой ID можно у бота userinfobot.
- one_month_cost — цена в рублях за месяц подписки. Минимальная сумма в рублях должна быть эквивалента одному доллару, но, как показала практика, стоит выставлять немного больше, чем актуальный курс доллара. Курс, который использует Telegram, можно узнать на официальном сайте.
- trial_period — период пробной подписки. По умолчанию установлено 45 минут, то есть 2700 секунд.
- UTC_time — часовой пояс в формате UTC. Бот будет учитывать его при выводе времени. По умолчанию установлено UTC+3, то есть московское время.
- tg_token — токен бота, полученный от @BotFather.
- tg_shop_token — токен магазина в Telegram. Нужен, если мы хотим принимать оплату. Если оставить это значение пустым, то бот просто не будет отправлять форму для оплаты и, соответственно, оплата онлайн будет недоступна.
Как получить tg_shop_token? Переходи в Telegram к боту @BotFather и пиши /mybots. Затем выбирай нужного бота и переходи в раздел Payments. Тут ты можешь ознакомиться со всеми доступными платежными системами и узнать, как их подключить. После подключения платежной системы возвращайся в BotFather. В разделе Payments должен появиться наш заветный ключ.
И последний конфигурационный файл хранит в себе текст сообщений, которые бот присылает пользователям. Сообщения могут быть оформлены с применением HTML-стилей Telegram, а как ими пользоваться, можешь посмотреть в документации.
«hello_message»: «<b>Почему стоит выбрать Obi VPN?</b>…»,
«trial_message»: «Чтобы вы смогли оценить наш VPN…»,
«how_to_connect_info»: «Ваш конфиг для подключения к VPN…»,
«success_pay_message»: «Оплата прошла успешно…»,
«ended_sub_message»: «Ваша подписка закончилась…»,