# Протокол MTProto Proxy

## Официальная спецификация

Протокол определён Telegram. Официальный репозиторий: [TelegramMessenger/MTProxy](https://github.com/TelegramMessenger/MTProxy) (C, GPLv2).

## Три режима

### Classic (без префикса)

- **Секрет:** 32 hex-символа (16 байт)
- **Транспорт:** Intermediate (`0xeeeeeeee`) с обфускацией AES-256-CTR
- **Добавлен:** Май 2018 (первый коммит)
- **Защита от DPI:** Слабая — паттерны пакетов легко детектируются
- **Статус:** Устаревший, не использовать

### Secure / dd (Padded Intermediate)

- **Секрет:** `dd` + 32 hex-символа
- **Транспорт:** Padded Intermediate (`0xdddddddd`) — добавляет 0-15 случайных байт к каждому пакету
- **Добавлен:** Июль 2018
- **Защита от DPI:** Средняя — маскирует характерные размеры пакетов
- **Статус:** Можно использовать, но FakeTLS лучше

### FakeTLS / ee (рекомендуемый)

- **Секрет:** `ee` + 32 hex + hex-кодировка домена
- **Пример:** `ee0123...abcdef676f6f676c652e636f6d` (google.com)
- **Транспорт:** Весь трафик обёрнут в TLS 1.3 записи
- **Добавлен:** Июль 2019 (флаг `-D domain.com` в официальном MTProxy)
- **Защита от DPI:** Высокая — выглядит как обычный HTTPS

**Важно:** FakeTLS — это **НЕ настоящий TLS**. Это кастомный протокол, который *выглядит* как TLS на уровне байтов. Nginx/HAProxy не могут его терминировать.

## Как работает FakeTLS handshake

```
Клиент → Сервер: Фейковый TLS ClientHello (517 байт)
  - SNI = домен из секрета (например, google.com)
  - Random содержит HMAC-SHA256 дайджест для верификации секрета

Сервер → Клиент: Фейковый ServerHello + ChangeCipherSpec
  - Имитирует ответ реального TLS-сервера
  - Размер ответа копирует реальный сертификат домена

Далее: "Application Data" записи (тип 0x17)
  - Внутри: зашифрованный MTProto трафик
  - Макс. размер записи: 16408 байт
```

DPI видит обычное TLS 1.3 соединение к `google.com`.

## Формат секрета для клиента

```
Формат ee-секрета:
  ee + <16 байт секрета в hex> + <домен в hex>

Пример:
  Секрет сервера: 0123456789abcdef0123456789abcdef
  Домен: google.com

  ee0123456789abcdef0123456789abcdef676f6f676c652e636f6d
  ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
  ee   секрет (32 hex)                "google.com" в hex
```

Сервер использует только 16-байтный секрет (через `-S`), домен — через `-D`.
Префикс `ee` — это клиентский маркер, сервер его не использует.

## Middle Proxy

Два режима работы MTProxy:

| | Direct Mode | Middle Proxy Mode |
|---|---|---|
| Схема | Клиент → MTProxy → Telegram DC | Клиент → MTProxy → Middle Proxies → Telegram DC |
| Ad Tag | Нет | Да (через @MTProxyBot) |
| Производительность | Выше | Ниже (доп. hop) |
| Требования | Секрет | + proxy-secret + proxy-multi.conf |

Для работы Ad Tag нужен middle proxy. Файлы обновляются каждые 12 часов:
```bash
curl -sf https://core.telegram.org/getProxySecret -o proxy-secret
curl -sf https://core.telegram.org/getProxyConfig -o proxy-multi.conf
```

## Все три режима — официальные

Все три режима реализованы в **официальном** `TelegramMessenger/MTProxy`:
- Classic и dd — задокументированы в README
- FakeTLS — добавлен в июле 2019 (флаг `-D`), но **README не обновлён** (последнее обновление README — декабрь 2018)

Поддержка всех трёх режимов есть во всех клиентах Telegram (iOS, Android, Desktop).

## DC203/CDN

DC203 — CDN-датацентр Telegram для кэширования медиа из каналов с 100k+ подписчиков. Его IP не в публичном списке — старые прокси не знают куда подключаться.

**Симптомы:** текст работает, медиа из крупных каналов не грузится.
**Решение:** обновить прокси до актуальной версии (mtg v2.1.12+, telemt v3.0+).
