# 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:

```toml
[censorship]
tls_domain = "umweltschutz.de"
```

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

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

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

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

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

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

```toml
[censorship]
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
```

2. начинает **проксировать TCP-трафик**

Важно:

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

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

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

# TCP-S / TCP-Splitting / TCP-Splicing

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

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

1) принимает соединение
2️) определяет тип клиента
3) либо:

- обрабатывает MTProxy внутри
- либо проксирует TCP-поток

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

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

При этом:

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

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

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

Например:

```toml
[censorship]
tls_domain = "github.com"
mask_host = "github.com"
mask_port = 443
```

или

```toml
[censorship]
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

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

# Схема

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