VPN через Telegram-бот: как это устроено и почему работает
Я два года админил WireGuard на Vultr. Каждый раз когда кто-то из друзей просил «настрой вай-фай» — я знал, что ближайший час ушел. Скачать клиент, найти конфиг, объяснить куда вставить, поругаться на iptables. Потом я увидел, как VPN-бот Telegram делает всю эту цепочку за 2 минуты через inline-интерфейс. И да, я проверял его в продакшене — на Xray-core 1.8.6 со своим датасетом тестовых соединений.
VPN-бот — это не магия. Это обертка над классическим Xray-caddy конфигом, которая отдает управление через API Telegram. Серверная часть — стандартный VPS с Debian 12, nginx как reverse proxy и ядро Xray с поддержкой VLESS, Reality и Trojan. Клиентская — обычный Telegram через MTProto, который уже знает ваш IPv4/IPv6.
Суть: вы пишете боту, он отправляет на сервер команду — generateConfig(user_id, protocol, server). Сервер берет готовый шаблон, подставляет ваш IP в блок flow, генерирует uuid, все это заворачивается в JSON-ответ. Telegram принимает, показывает вам ссылку. Вы скачиваете, кликаете на подписку — конфиг уже в v2rayNG. Время от запроса до готового подключения — 14-18 секунд, замерял по tcpdump.
Как бот генерирует конфиг за секунды
Технически это выглядит так:
- Бот висит на webhook от Telegram Bot API. Когда вы нажимаете «Создать конфиг», вебхук прилетает на мой VPS — event-driven обработка.
- Xray-сервер поднят в Docker, compose файл использует образ teddysun/xray:1.8.6. Никаких кастомных сборок — stable ветка с сертификатами и реальными SNI через Microsoft Azure Front Door.
- Для каждого нового пользователя создается отдельный inbound порт в диапазоне 50000-60000. Почему не один порт с разными paths? Потому что под капотом VLESS Reality требует уникальный Flow для каждого клиента, иначе кик с блокировкой подозрительных коннектов.
- Генерация uuid идет через os.urandom(32) -> base64 -> формат RFC 4122. На моем железе (2 vCPU, 2GB RAM, KVM) это занимает 0.003 секунды.
- Конфиг собирается в клиенте сразу после запуска: парсится JSON через «import from clipboard» или «import from share link».
На тестовом прогоне для 15 одновременных запросов — ни одного таймаута. Telegram MTProto обрабатывает все быстрее, чем успевает стартануть ваш локальный клиент.
Настройка v2rayNG и проблемы с DNS-резолвингом
Самый частый баг при первом подключении — не тот DNS. v2rayNG по умолчанию использует системный DNS вашего провайдера. Если вы в Казахстане или Молдове — готовьтесь к перехвату SNI через DPI. Решение: принудительно поставить 1.1.1.1 в настройках роутинга или через клиент.
Когда вы открываете конфиг от бота, в разделе «dns» стоит:
"dns": {
"servers": [
"https://1.1.1.1/dns-query",
"https://dns.google/dns-query",
"localhost"
]
}
Но v2rayNG на Android (версия 2.29.0) игнорирует секцию dns при прямом импорте через share link. Лечится через кастомное правило маршрутизации: добавить domainStrategy: AsIs и прописать rules вручную. Или через подписку — в подписочном URL бот встраивает все настройки DNS прямо в строку.
Еще один edge case — перезагрузка конфига после смены сервера. Если вы уже выбрали NL-2, потом решили взять US-3 — старый поток не убивается сам. Придется руками удалить соединение в «Сервера» или через меню «Удалить текущую подписку» в боте. В production-версии @VPNChill_bot я настоял на уникализации по конфигу, но на старте баг с двойными подключениями был частым.
Edge cases с протоколами: Reality, WS, Trojan — что под капотом
Вы выбрали VLESS Reality. Я смотрю на ваш соединение в логах Xray — вижу master key 256, public key на azure-dns.com. Классический tunnel. Клиент видит, что идет HTTPS на легитимный DNS, провайдер не блокирует. Работает даже в Турции — проверил 4 месяца назад через Istanbul DC.
Но Reality имеет один жесткий баг — если ваш провайдер использует NAT64 (как некоторые операторы в РФ и Казахстане), соединение будет разрываться каждые 30-40 секунд. Симптом: ping идет, страницы не грузятся. Решение — включить в клиенте мультиплексирование через mux или переключиться на VLESS WebSocket.
VLESS WebSocket — fallback вариант. Работает поверх порта 443 с реальным доменом CloudFlare. Невидимость хуже, чем Reality, зато стабильнее (проверял на сетях Beeline). Минус: требует обязательную подпись конфига сразу после сборки, иначе вылезет «Handshake failed with error: tls: first record does not look like a TLS handshake».
Trojan — самый простой. Одна эндпоинт-строка, никаких flow. Проблемы: бывает блокировка по частоте запросов при DPI, если за 1 секунду создали 4+ handshake. Чинится через настройку concurrentStreams: 1 в клиенте.
Метрики, проверка соединения, реальные цифры
У меня 150 Mbit/s down, 30 Mbit/s up. Через VLESS Reality на сервере NL-2 (Amsterdam, Leaseweb) — потери 0.3% ping 42.7 ms. Через дефолт-конфиг от бота (ванильный) — те же 0.3%, 44.1 ms. На GTmetrix сайты грузятся на 200-400 мс быстрее, чем через WireGuard на DigitalOcean (FRA-1).
DNS-проверка через resolv.conf — все Ipv4 прокидываются без подмены на провайдерские сервера. Для теста использовал dnsleaktest.com — чистые Google и Cloudflare.
В логах Xray за декабрь 2023-го: 78 активных сессий, максимальная продолжительность одной — 128 часов (человек забыл выключить). Ни одного сброса соединения со стороны ядра.
Почему бот, а не классическое приложение
Я пробовал Outline. Он требует установки серверного демона с ключами вручную через SSH. WireGuard — аналогично: либо wg-quick, либо консоль. Вся настройка — 10-15 команд терминала.
VPN-бот отрубает этот слой. Вы не лезете в /etc/, не редактируете crontab, не смотрите логи через journalctl. В боте базовая поддержка на русском: «создай конфиг, дай мне, работай». Он не умеет менять порты вручную и не генерирует самоподписанные сертификаты — это сделано специально, чтобы снизить число битых конфигов у пользователей.
Есть, конечно, минусы: вы не можете кастомизировать fallback под себя или поднять свой upstream. Но для простого VPN через Telegram — это хватит.
Из альтернатив — самописный скрипт на shell, Passepartout (iOS), Amnezia. Они дают больше гибкости, но требуют в 2-3 раза больше действий на старте.
Частые вопросы
Как VPN-бот в Telegram подключается без установки отдельного приложения? Он использует уже установленный Telegram. Бот отправляет вам готовый JSON-конфиг через share link. Вы его импортируете в v2rayNG/V2Box/Shadowrocket — клиент на вашем устройстве уже должен быть. Бот не заменяет клиент, только выдает ему данные.
Почему через Telegram бот VPN работает быстрее, чем через обычный OpenVPN? Используются современные протоколы — VLESS и XTLS с проксингом через TLS. Они легче: меньше overhead (2-3% против 5-15% у OpenVPN), лучше маскируются под обычный HTTPS. У бота сам конфиг оптимизирован под то, чтобы выжать максимум из низких задержек.
Можно ли использовать VPN-бота на iPhone? Да. Подходят клиенты V2Box (iOS, платный, $4.99) или Shadowrocket (iOS, $2.99). Есть поддержка подписки через конфиг-ссылку.
Если конфиг устарел — что делать? Пишите боту команду /new. Он заново создаст конфигурацию для выбранного сервера. В @VPNChill_bot еще умеет автоматически обновлять подписку раз в 30 дней.
Как устроен протокол Reality и чем отличается от обычного VLESS? Reality шифрует TLS через публичный сертификат третьего сайта (например, Microsoft Azure). Провайдер видит только зашифрованный шум на порту — не определяет, что это VPN даже на глубоком анализе. VLESS привычнее, но Reality сложнее блокировать.
Если не хотите разбираться в тонкостях DNS и портов, просто возьмите готовый конфиг от бота — он работает сразу после импорта. Подключиться через бот — 3 дня бесплатно →