Что такое MTProto и MTProxy: как устроен прокси в Telegram
Как устроен протокол Telegram, что делает MTProxy, чем он отличается от VPN и из чего состоит ссылка.
Содержание
MTProto — собственный протокол Telegram, по которому приложения общаются с серверами мессенджера. MTProxy — прокси-сервер, который умеет принимать это соединение и передавать его дальше. Ниже — как устроен протокол, что именно делает прокси, чем он отличается от VPN и из чего состоит ссылка, которую вам присылают.
Что такое MTProto
По определению из документации Telegram, MTProto — протокол для доступа к серверному API из приложений на мобильных устройствах. Современные клиенты используют версию 2.0; первая версия считается устаревшей и выводится из обращения.
Протокол состоит из трёх уровней, и прокси работает только на последнем:
- API-запросы. Верхний уровень превращает вызовы и ответы в двоичные сообщения: запросы, ответы, подтверждения, контейнеры из нескольких сообщений.
- Шифрование. Каждое сообщение шифруется до отправки. У сообщения есть открытый заголовок с идентификатором ключа и ключом сообщения; всё остальное зашифровано алгоритмом AES-256. Сам ключ авторизации создаётся обменом Diffie-Hellman и по сети не передаётся.
- Транспорт. Нижний уровень переносит зашифрованные данные поверх обычного сетевого протокола: TCP, WebSocket, HTTP.
Для обычных чатов (облачных) шифрование идёт между клиентом и сервером Telegram. Секретные чаты используют сквозное шифрование и описаны отдельно; для прокси разницы нет: он работает на транспортном уровне и в любом случае видит только зашифрованные данные.
Что такое MTProxy
Прокси для Telegram — промежуточный сервер. Приложение подключается не к серверам Telegram напрямую, а к прокси; тот открывает соединение с нужным дата-центром и передаёт данные в обе стороны. Для приложения всё выглядит так, будто оно говорит с Telegram, а для сети — как соединение с прокси.
Название MTProxy носит официальная реализация, которую Telegram выкладывает на GitHub. В разговорах так же называют любой прокси, говорящий на MTProto: помимо официального, есть mtg на Go и telemt на Rust. Сам Telegram в документации говорит о двух типах прокси, которые поддерживают приложения: SOCKS5 и MTProto.
Как идёт трафик
- Клиент берёт из ссылки адрес сервера, порт и секрет.
- Он устанавливает с прокси соединение с обфускацией: ключи для потока выводятся из случайного начального пакета и секрета.
- В начальном пакете клиент указывает номер дата-центра, к которому нужно подключиться.
- Прокси открывает соединение с серверами Telegram и пересылает зашифрованные данные в обе стороны.
Куда именно прокси подключается дальше — к дата-центру напрямую или через промежуточные серверы Telegram (Middle-End) — зависит от реализации и настроек. Официальный MTProxy, например, берёт адреса из файла proxy-multi.conf, который скачивают с сайта Telegram, а telemt включает Middle-End параметром use_middle_proxy. Для клиента это незаметно.
Секрет здесь выполняет две роли: прокси принимает только тех, кто его знает, а в режиме FakeTLS в нём же записан домен маскировки. Об этом — в разделе про ссылку и в статье про FakeTLS.
Транспорты и первые 64 байта
Транспорт MTProto — это «обёртка», в которую упаковывают зашифрованные данные. Какая именно, клиент сообщает заголовком, который отправляет первым. В документации Telegram описаны четыре варианта:
| Транспорт | Заголовок | Особенность |
|---|---|---|
| Abridged | байт 0xef | длина — один байт (размер, делённый на 4), для больших пакетов — 0x7f и ещё три байта |
| Intermediate | 0xeeeeeeee | перед данными — 4-байтовая длина |
| Padded intermediate | 0xdddddddd | к данным добавляют от 0 до 15 случайных байт |
| Full | нет | конверт из 12 байт: длина, порядковый номер, данные и контрольная сумма CRC32 |
Такой заголовок открыт, и по нему соединение легко узнать. Поэтому придумали обфускацию — маскировку самого начала соединения. Клиент генерирует случайные 64 байта и отправляет их первыми, а дальше весь поток шифруется:
- в этих 64 байтах есть ограничения, чтобы они не совпали с заголовками других протоколов: первый байт не может быть
0xef, а первые четыре —0xdddddddd,0xeeeeeeeeили началом HTTP-запроса; - по смещению 56 лежит идентификатор транспорта, а у прокси по смещению 60 — номер дата-центра;
- ключ и вектор шифрования берутся из самих 64 байт, для обратного направления — из их «перевёрнутой» копии;
- поток шифруется алгоритмом AES-256 в режиме CTR, а для прокси ключ дополнительно хешируется вместе с секретом.
Последний пункт и делает секрет паролем: без него клиент выведет другой ключ, и прокси не сможет расшифровать даже заголовок. В документации Telegram этот механизм называется transport obfuscation, а в разговорах о прокси его обычно зовут obfuscated2.
Что видит прокси
Это главный вопрос недоверия: можно ли читать мою переписку через прокси? Нет. Содержимое шифруется ключом авторизации, которого у прокси нет, поэтому он передаёт непрозрачные для него данные. Документация Telegram формулирует это так: оператор прокси не может видеть ваш список чатов и активность в Telegram.
Но кое-что прокси знать всё же может:
- ваш IP-адрес — к нему он отправляет ответы;
- объём и время трафика;
- на какой дата-центр вы подключаетесь.
Поэтому Telegram советует брать данные прокси только из надёжных источников. Прокси из публичного списка в интернете может принадлежать кому угодно, и IP-адрес его владельцу вы отдаёте.
Чем прокси отличается от VPN
| MTProto-прокси | VPN | |
|---|---|---|
| Что пропускает | Только трафик Telegram | Весь трафик устройства |
| Как подключают | Ссылка или три параметра в настройках Telegram | Отдельное приложение и подписка |
| Остальные приложения | Идут как обычно | Идут через VPN |
| Звонки в Telegram | Через MTProto-прокси не работают | Работают, пока VPN подключён |
| Что видит сеть | Соединение с прокси, обфусцированное или под видом TLS | Соединение с VPN-сервером, его протокол |
Простое правило: если нужно только пользоваться Telegram, прокси проще и быстрее. Если нужен доступ к другим сервисам, звонки или вы подключаетесь к мобильному интернету с белыми списками, нужен VPN.
Когда прокси нужен, а когда нет
- Нужен, если блокируют именно Telegram, а остальной интернет работает как обычно и менять его не требуется.
- Не нужен, если Telegram и без него работает: прокси добавит лишний узел и может замедлить соединение.
- Не поможет, если нужны звонки, другие приложения или вы находитесь в сети с белыми списками.
Из чего состоит ссылка
Ссылка на MTProto-прокси имеет один формат в двух записях. Для приложения подходит tg://proxy, а в браузере и мессенджерах работает t.me/proxy: по ней Telegram открывает окно подключения.
tg://proxy?server=proxy.example.com&port=443&secret=ee…
Все три параметра обязательны. server — адрес или IP сервера, port — порт, secret — секрет. Секрет — 16 случайных байт в шестнадцатеричной записи; к нему могут добавляться префикс режима и домен.
Режимы прокси
Три режима различаются тем, как прячется соединение:
- обычный — поток шифруется (obfuscated2), но начало соединения и ритм пакетов остаются узнаваемыми;
- dd — к пакетам добавляется случайное дополнение, чтобы размеры не выдавали прокси;
- ee — режим FakeTLS: соединение начинается как обычный HTTPS-обмен с настоящим сайтом.
Реализации прокси
Прокси поднимают на собственном сервере разными программами. Основные три:
- MTProxy — официальная реализация Telegram: собирается из исходников или запускается в Docker. В её README описан режим dd (padding);
- mtg — минималистичный прокси на Go для режима FakeTLS: один секрет, без управления пользователями;
- telemt — реализация на Rust: поддерживает все три режима и спонсорский канал.
Спонсорский канал
Telegram разрешает владельцу прокси продвигать канал: он появляется в списке чатов тех, кто подключился через этот прокси, и помогает покрыть расходы на сервер. Владелец при этом не видит ни списка чатов, ни активности подключённых.
Словарь в одной таблице
| Термин | Что это |
|---|---|
| server | адрес или IP-адрес прокси; в ссылке — параметр server |
| port | порт прокси; чаще всего 443 |
| secret | ключ прокси: 16 байт, режим работы и, для FakeTLS, домен маскировки |
| DC | дата-центр Telegram, на который прокси передаёт трафик |
| ad_tag / тег | идентификатор, который выдаёт бот @MTProxybot и который включает показ спонсорского канала |
| padding | случайное дополнение пакетов; включается префиксом dd |
| FakeTLS | режим, который маскирует соединение под TLS-обмен с сайтом; префикс ee |
Где в Telegram настройки прокси
По документации Telegram, пункт меню зависит от платформы. На Android это «Настройки» → «Данные и память» → «Настройки прокси» (Settings → Data and Storage → Proxy Settings), на iPhone — «Данные и память» → «Прокси», в Telegram Desktop — «Настройки» → «Продвинутые настройки» → «Тип соединения», в приложении для macOS — «Данные и память» → «Использовать прокси».
Когда прокси подключён, над списком чатов появляется значок щита: нажатие открывает настройки прокси. В списке можно держать несколько прокси; функция автоматического переключения (Auto-Switch Proxies) переходит к следующему, если текущий отключился. Пошаговые инструкции — для Android, iPhone и компьютера.
Ограничения
- Через MTProto-прокси не работают звонки в Telegram — по FAQ проекта telemt, это ограничение архитектуры.
- Прокси не защищает остальные приложения устройства.
- У прокси ограниченный срок жизни: его адрес, порт или форму трафика может заблокировать оператор.
- Скорость и стабильность зависят от сервера и числа пользователей на нём.
Частые вопросы
Что такое MTProxy простыми словами?
Это промежуточный сервер для Telegram. Приложение подключается не к серверам мессенджера напрямую, а к прокси, и он передаёт зашифрованный трафик дальше. Название MTProxy носит официальная реализация Telegram; в разговорах так же называют любой прокси, говорящий на протоколе MTProto.
Чем MTProto-прокси отличается от VPN?
MTProto-прокси работает только внутри Telegram: другие приложения идут по сети как обычно. VPN пропускает через себя весь трафик устройства. Прокси проще подключить и он не требует отдельного приложения, но не защищает остальной трафик.
Видит ли владелец прокси мою переписку?
Нет. Сообщения шифруются ключом, который есть только у клиента и сервера Telegram. Владелец прокси видит IP-адрес подключающегося и объём трафика. По документации Telegram, оператор не видит ни списка чатов, ни активности в аккаунте.
Из чего состоит ссылка на MTProto-прокси?
Из трёх обязательных параметров: server (адрес сервера), port (порт) и secret (секрет). Формат: tg://proxy?server=…&port=…&secret=… либо такая же ссылка вида t.me/proxy.