telemt/docs/fronting-splitting/TLS-F-TCP-s.ru.md

8.6 KiB
Raw Blame History

TLS-F и TCP-S в Telemt

Общая архитектура

Telemt - это прежде всего реализация MTProxy, через которую проходит payload Telegram

Подсистема TLS-Fronting / TCP-Splitting служит маскировочным транспортным слоем, задача которого - сделать MTProxy-соединение внешне похожим на обычное TLS-подключение к легитимному сайту

Таким образом:

  • MTProxy - основной функциональный слой Telemt для обработки Telegram-трафика
  • TLS-Fronting / TCP-Splitting - подсистема маскировки транспорта

С точки зрения сети Telemt ведёт себя как TLS-сервер, но фактически:

  • валидные MTProxy-клиенты остаются внутри контура Telemt
  • любые другие TLS-клиенты проксируются на обычный HTTPS-сервер-заглушку

Базовый сценарий / Best-practice

Предположим, у вас есть домен:

umweltschutz.de

1 DNS

Вы создаёте A-запись:

umweltschutz.de -> A-запись 198.18.88.88

где 198.18.88.88 - IP вашего сервера с telemt

2 TLS-домен

В конфигурации Telemt:

tls_domain = umweltschutz.de

Этот домен используется клиентом как SNI в ClientHello

3 Сервер-заглушка

Вы поднимаете обычный HTTPS-сервер, например nginx, с сертификатом для этого домена.

Он может работать:

  • на том же сервере
  • на другом сервере
  • на другом порту

В конфигурации Telemt:

mask_host = 127.0.0.1
mask_port = 8443

где 127.0.0.1 - IP сервера-заглушки, а 8443 - порт, который он слушает

Этот сервер нужен для обработки любых non-MTProxy запросов

4 Работа Telemt

После запуска Telemt действует следующим образом:

  1. принимает входящее TCP-соединение
  2. анализирует TLS-ClientHello
  3. пытается определить, является ли соединение валидным MTProxy FakeTLS

Далее работают два варианта логики:


Сценарий 1 - MTProxy клиент с валидным ключом

Если клиент предъявил валидный MTProxy-ключ:

  • соединение остаётся внутри Telemt
  • TLS используется только как транспортная маскировка
  • далее запускается обычная логика MTProxy

Для внешнего наблюдателя это выглядит как:

TLS connection -> umweltschutz.de

Хотя внутри передаётся MTProto-трафик Telegram

Сценарий 2 - обычный TLS-клиент - crawler / scanner / browser

Если Telemt не обнаруживает валидный MTProxy-ключ:

соединение переключается в режим TCP-Splitting / TCP-Splicing.

В этом режиме Telemt:

  1. открывает новое TCP-соединение к
mask_host:mask_port
  1. начинает проксировать TCP-трафик

Важно:

  • клиентский TLS-запрос НЕ модифицируется
  • ClientHello передаётся "как есть", без изменений
  • SNI остаётся неизменным
  • Telemt не завершает TLS-рукопожатие, а только перенаправляет его на более низком уровне сетевого стека - L4

Таким образом upstream-сервер получает оригинальное TLS-соединение клиента:

  • если это nginx-заглушка, он просто отдаёт обычный сайт
  • для внешнего наблюдателя это выглядит как обычный HTTPS-сервер

TCP-S / TCP-Splitting / TCP-Splicing

Ключевые свойства механизма:

Telemt работает как TCP-переключатель:

  1. принимает соединение 2) определяет тип клиента
  2. либо:
  • обрабатывает MTProxy внутри
  • либо проксирует TCP-поток

При проксировании:

  • Telemt разрешает mask_host в IP
  • устанавливает TCP-соединение
  • начинает bidirectional TCP relay

При этом:

  • TLS-рукопожатие происходит между клиентом и mask_host
  • Telemt выступает только на уровне L4 - как TCP-релей, такой же как HAProxy в TCP-режиме

Использование чужого домена

Можно использовать и внешний сайт.

Например:

tls_domain = github.com
mask_host = github.com
mask_port = 443

или

mask_host = 140.82.121.4

В этом случае:

  • цензор видит TLS-подключение к github.com
  • обычные клиенты/краулер действительно получают настоящий GitHub

Telemt просто проксирует TCP-соединение на GitHub

Что видит анализатор трафика?

Для DPI это выглядит так:

client -> TLS -> github.com

или

client -> TLS -> umweltschutz.de

TLS-handshake выглядит валидным, SNI соответствует домену, сертификат корректный - от целевого mask_host:mask_port

Что видит сканер / краулер?

Если сканер попытается подключиться:

openssl s_client -connect 198.18.88.88:443 -servername umweltschutz.de

он получит обычный HTTPS-сайт-заглушку

Потому что:

  • он не предъявил MTProxy-ключ
  • Telemt отправил соединение на mask_host:mask_port, на котором находится nginx

Какую проблему решает TLS-Fronting / TCP-Splitting?

Эта архитектура решает сразу несколько проблем обхода цензуры.

1 Закрытие плоскости MTProxy от активного сканирования

Многие цензоры:

  • сканируют IP-адреса
  • проверяют известные сигнатуры прокси

Telemt отвечает на такие проверки обычным HTTPS-сайтом, поэтому прокси невозможно обнаружить простым сканированием


2 Маскировка трафика под легитимный TLS

Для DPI-систем соединение выглядит как:

обычный TLS-трафик к популярному домену

Это делает блокировку значительно сложнее и непредсказуемее


3 Устойчивость к протокольному анализу

MTProxy трафик проходит внутри TLS-like-потока, поэтому:

  • не видны характерные сигнатуры MTProto
  • соединение выглядит как обычный HTTPS

4 Правдоподобное поведение сервера

Даже если краулер:

  • подключится сам
  • выполнит TLS-handshake
  • попытается получить HTTP-ответ

он увидит реальный сайт, а не telemt

Это устраняет один из главных признаков для антифрод-краулеров мобильных операторов

Схема

			Client
			  │
			  │ TCP
			  │
			  V
			Telemt
			  │
			  ├── valid MTProxy key
			  │        │
			  │        V
			  │     MTProxy logic
			  │
			  └── обычный TLS клиент
			  │
			  V
		 TCP-Splitting
			  │
			  V
	  mask_host:mask_port