Рубрики
Интернет

MTProto Proxy с обфускацией: как работает с Telegram?

Что такое MTProto? MTProto — это собственный бинарный протокол Telegram, разработанный командой Дурова. Он работает поверх TCP (реже UDP и HTTP) и отвечает за шифрование, аутентификацию и доставку сообщений между клиентом и серверами Telegram.

В отличие от HTTPS-based мессенджеров, MTProto не «прячется» под стандартный веб-трафик — у него собственная структура пакетов, что делает его относительно легко идентифицируемым для DPI (Deep Packet Inspection) систем.

Зачем нужен прокси

Telegram-клиент устанавливает соединение напрямую с серверами Telegram (149.154.x.x и 91.108.x.x). В странах с интернет-цензурой (Иран, Россия 2018–2020, Китай и др.) эти IP-диапазоны блокируются на уровне провайдера.

MTProto Proxy — это специализированный ретранслятор: клиент подключается к прокси-серверу, а тот уже от своего имени общается с Telegram. С точки зрения провайдера — клиент общается с каким-то случайным сервером, не связанным с Telegram.

Но здесь возникает проблема: даже если IP не заблокирован, DPI может распознать трафик MTProto по сигнатуре и заблокировать его.

Обфускация: зачем и как

Проблема без обфускации

«Голый» MTProto имеет узнаваемые черты:

  • Первые байты соединения содержат предсказуемые паттерны
  • Длины пакетов и тайминги специфичны
  • Рукопожатие (handshake) имеет характерную структуру

Современные ТСПУ (технические средства противодействия угрозам) умеют детектировать MTProto именно по этим признакам, даже не зная IP назначения.

Что делает обфускация

Обфускация в контексте MTProto Proxy — это трансформация трафика таким образом, чтобы он выглядел как случайный поток байт (или имитировал другой протокол). Ключевые задачи:

  1. Скрыть сигнатуру первого пакета — рукопожатие не должно быть узнаваемым
  2. Убрать статистические паттерны — распределение длин пакетов и энтропия байт не должны выдавать протокол
  3. Предотвратить активное зондирование — если цензор отправит на порт «мусор», прокси не должен ответить ничем осмысленным

Режимы подключения MTProto Proxy

1. abridged (без обфускации)

Самый простой режим. Заголовок пакета — 1 или 4 байта длины. Легко обнаруживается.

2. intermediate

Всегда 4 байта длины, выравнивание убрано. Чуть лучше, но всё ещё узнаваем.

3. padded intermediate

Добавляет случайный padding к пакетам — это уже мешает анализу по длинам, но сигнатура начала соединения остаётся.

4. full

Исторический режим с 12-байтовым заголовком и CRC32. Практически не используется.

5. secret с обфускацией (он же faketls / dd-секрет)

Самый продвинутый режим. Именно о нём речь дальше.

Как работает обфускация с dd-секретом

Структура секрета

Секрет MTProto прокси — это 16 байт в hex (32 символа). Когда перед ним добавляется префикс dd, это сигнализирует клиенту использовать полную обфускацию.

Обычный секрет:  a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
С обфускацией:   dda1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

FakeTLS — имитация HTTPS

Наиболее современная техника — FakeTLS. Прокси и клиент имитируют TLS handshake (как будто устанавливается HTTPS-соединение), а настоящий MTProto-трафик «прячется» внутри этой обёртки.

Секрет в этом случае содержит ещё и имя домена:

ee<hex_секрет><домен_в_hex>

Пример: секрет с доменом cloudflare.com будет выглядеть как ee + 32 hex + hex(«cloudflare.com»).

Что происходит при подключении:

Клиент → Прокси:
  ClientHello (TLS 1.3)
  SNI: cloudflare.com  ← имя домена из секрета
  
Прокси → Клиент:
  ServerHello
  Certificate (фейковый)
  
Далее: весь трафик выглядит как зашифрованный TLS

DPI видит «обычное» TLS-соединение к известному CDN. Попытка активного зондирования ничего не даст — прокси ответит корректным (хотя и фейковым) TLS-потоком.

Математика обфускации (упрощённо)

При установке соединения с обфускацией:

  1. Клиент генерирует 64 случайных байта (nonce)
  2. Из этих байт + секрет прокси выводятся два ключа AES-256-CTR — один для исходящего, другой для входящего трафика
  3. Весь последующий трафик шифруется этими ключами поверх основного MTProto-шифрования
  4. Первые байты соединения выглядят как случайный шум — никакой предсказуемой структуры

Это двойное шифрование: сначала MTProto шифрует содержимое сообщений, потом обфускация шифрует транспортный слой.

Серверная часть: как устроен прокси

Популярные реализации

РеализацияЯзыкОсобенности
MTProxy (официальный, Telegram)CЭталонная реализация, высокая производительность
mtprotoproxyPythonПростота настройки, меньше производительность
MTProxybot-совместимыеGo, RustСторонние, часто с доп. функциями

Что делает прокси-сервер

  1. Слушает порт (обычно 443, чтобы выглядеть как HTTPS)
  2. Получает соединение от клиента
  3. Расшифровывает обфускацию — разворачивает внешний слой
  4. Аутентифицирует клиента по секрету
  5. Проксирует MTProto-трафик к реальным серверам Telegram
  6. Изолирует клиентов — каждый клиент видит только свой трафик

Конфигурация (пример для официального MTProxy)

./mtproto-proxy \
  -u nobody \
  -p 8888 \          # внутренний порт управления
  -H 443 \           # внешний порт
  -S <секрет> \      # 32 hex символа
  --aes-pwd <файл>   # файл с ключами Telegram

Активное зондирование и защита от него

Цензоры используют не только пассивный DPI, но и активное зондирование: когда обнаруживается «подозрительное» соединение, специальные боты подключаются к серверу и пробуют разные протоколы.

Защита в обфусцированном MTProto Proxy:

  • Без правильного секрета — прокси не отвечает ничем осмысленным или имитирует ошибку TLS
  • Replay-защита — каждый nonce используется один раз; повторное воспроизведение перехваченного трафика не работает
  • Тайм-аут без данных — если клиент не прислал валидное рукопожатие за N секунд, соединение сбрасывается без какого-либо ответа

Ограничения и слабые места

  1. IP-блокировка: обфускация прячет протокол, но не IP. Если сервер попадёт в чёрный список — ничего не поможет
  2. Корреляционные атаки: при наблюдении за трафиком одновременно с обеих сторон можно установить факт использования прокси по таймингам
  3. Домен в FakeTLS: если указанный домен (например, cloudflare.com) заблокирован — SNI-фильтр может отрезать соединение ещё до анализа содержимого
  4. Нет собственного шифрования содержимого: прокси-сервер видит MTProto-трафик (но не сами сообщения — они зашифрованы ключами Telegram)

MTProto Proxy с обфускацией — это многослойная система обхода блокировок:

Сообщение Telegram
    → MTProto шифрование (ключи Telegram)
        → Обфускация (AES-CTR, ключи из секрета)  
            → FakeTLS обёртка (имитация HTTPS)
                → TCP/IP (к прокси-серверу)

Каждый слой решает свою задачу: MTProto защищает содержимое от Telegram-сервера, обфускация прячет факт использования протокола от провайдера, FakeTLS делает трафик неотличимым от обычного HTTPS для систем цензуры.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *