Протоколы

Свой VPN с Telegram-ботом: почему статус Connected ещё не значит работающий интернет

Всё началось с одного виртуального сервера в Нидерландах и четырёх клиентских профилей OpenVPN. Постепенно к схеме добавился Telegram-бот для управления доступом, отдельные сертификаты для каждого устройства, несколько транспортов на Linux и самостоятельная точка входа на Windows Server. По дороге случались переподключения каждые шестнадцать секунд, работающий TLS при мёртвом интернете и путаница между старыми и новыми конфигурациями.

Главная трудность оказалась в том, что запущенный процесс и статус Connected ещё не означали работающий интернет. Несколько раз сервер выглядел исправным, а сайты на телефоне не открывались. Это ключевой момент всей истории: внешние признаки жизни VPN-туннеля могут обманывать, и диагностика требует более глубокого взгляда.

Архитектура развивалась в три этапа. Первая версия была классической: устройство подключалось к OpenVPN на голландском узле NL, трафик уходил через NAT в интернет. Затем Windows стала дополнительной точкой входа — TCP-посредник принимал соединение и передавал байты отдельному экземпляру OpenVPN на NL, не расшифровывая трафик.

На третьем этапе появился самостоятельный Windows-маршрут с локальным обработчиком, TAP-адаптером и WinNAT, а бот на NL управлял профилями через SSH и SFTP. Telegram-бот стал центральным инструментом выдачи доступа. Через меню /vpn можно создать профиль, выбрать платформу — iOS, Android или Windows — и сразу получить готовый конфигурационный файл.

Бот работает на сервере, поэтому держать ноутбук включённым для этого не нужно. Генератору требуются серверный конфиг, каталог Easy-RSA и ключ tls-crypt. Первые исправления касались вполне земных вещей: утилита Easy-RSA лежала глубже ожидаемого, а относительный путь к tls-crypt нужно было считать от каталога конфигурации, а не от текущего рабочего каталога скрипта.

С ростом числа серверных конфигураций стало критически важно явно указывать, к какому экземпляру относится профиль. Иначе можно без единой синтаксической ошибки собрать файл с неправильным адресом, портом или центром сертификатов. Скрипт ovpn_make.sh использовал awk для извлечения пути к tls-crypt из конфига, но полноценным парсером всех вариантов OpenVPN такой подход не является — кавычки, подключаемые файлы и несколько экземпляров требуют отдельного учёта.

Вместо четырёх общих файлов автор перешёл к именным профилям устройств. Имя стало одновременно частью имени файла и CN сертификата — идентификатора в системе ключей. Валидация имени включает нормализацию Unicode, транслитерацию русских букв и строгую проверку: от 3 до 24 латинских символов, цифр или дефисов.

Слишком длинное имя отклоняется целиком, чтобы молчаливое обрезание не превратило два разных запроса в один идентификатор. Отправить профиль по нику оказалось сложнее, чем казалось. Обычный Telegram-бот не может первым начать личный разговор с произвольным человеком — это ограничение платформы.

Поэтому автор предусмотрел два способа доставки: прямую отправку через личную Telegram-сессию с помощью Telethon и приглашение по одноразовой ссылке, после которого человек сам открывает бота. Создание и отправка доступны только управляющим аккаунтам, которые бот определяет по числовым ID. Для прямой отправки требуется совпадение нескольких условий: команда должна прийти от разрешённого владельца в личном чате, сессия Telegram принадлежит ожидаемому аккаунту, получатель — обычный пользователь, а не бот или канал, и файл является обычным закрытым .ovpn.

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

В новых Windows-профилях эти проверки развиты дальше, чем в старом NL-генераторе, что снижает риск конфликтов и ошибок конфигурации. Любопытно, что подход с поэтапным усложнением инфраструктуры и самостоятельной сборкой инструментов управления напоминает то, как устроен, например, портал GTAcraft с трейлерами, картой, персонажами и системными требованиями. Такая же ставка на постепенное расширение функциональности без переписывания всего с нуля.

Сейчас VPN работает у всех, кому автор предоставил доступ: профиль можно получить через бота, импортировать на телефоне или ноутбуке и пользоваться интернетом. При этом пользовательский трафик в последней схеме не ходит через NL, но выдача нового профиля по-прежнему зависит от управляющего узла. Уже импортированный профиль и возможность выпустить следующий — разные зависимости, что важно учитывать при планировании отказоустойчивости.

История показывает, что даже в личном проекте на OpenVPN количество нюансов быстро растёт. Статус Connected — лишь начало диагностики, а удобная выдача профилей через мессенджер требует аккуратной работы с ограничениями платформы и проверки каждого шага генерации конфигураций.

кибербезопасность vpn боты протоколы

Обсуждение

Комментариев пока нет.

Читайте также