# Маскировка MEDIA — принцип работы и параметры
## 1. Что это
MEDIA — режим маскировки, при котором трафик между двумя обфускаторами во внешней сети
выглядит как **непрерывный медиапоток RTP/H.264 поверх UDP** (видеозвонок или просмотр стрима).
Цель — чтобы системы глубокого анализа трафика (DPI) видели «видео», а не WireGuard/VPN.
Важно: это **маскировка, а не шифрование**. Конфиденциальность и целостность данных
обеспечивает сам WireGuard. Задача MEDIA — спрятать факт использования WireGuard.
---
## 2. Принцип работы
### Топология
```
Устройство (WireGuard)
│ обычный трафик WireGuard
▼
Клиентский обфускатор ──────────────► Серверный обфускатор
(маскирует под RTP/видео) внешняя (снимает маскировку)
сеть / DPI │
▼
WireGuard-сервер
```
- WireGuard на устройстве отправляет свои пакеты не напрямую в интернет, а локальному
**клиентскому обфускатору**.
- Клиентский обфускатор маскирует их под медиапоток и шлёт **серверному обфускатору** по сети.
- Серверный обфускатор снимает маскировку и отдаёт обычный WireGuard локальному WireGuard-серверу.
- Ответы идут тем же путём в обратную сторону.
Параметры маскировки заданы заранее с обеих сторон — рукопожатий и «приветствий» уровня
VPN/прокси во внешней сети нет.
### Что происходит с каждым пакетом
1. **Старт сессии — фаза STUN/ICE.** Первые пакеты выглядят как проверка связности STUN
(как в WebRTC перед видеозвонком). Это делает появление последующего RTP-потока
правдоподобным. В простое периодически отправляются такие же STUN-сообщения
(имитация keepalive-проверок WebRTC и поддержание NAT).
2. **Передача данных — RTP-пакеты.** Каждый пакет получает 12-байтовый RTP-заголовок:
- версия RTP (2),
- payload type (тип «кодека»),
- sequence number (монотонно растёт),
- timestamp (растёт по «частоте кадров»),
- SSRC (идентификатор потока, постоянный в пределах сессии).
После заголовка — полезная нагрузка (зашифрованный WireGuard).
3. **Сокрытие сигнатуры WireGuard.** У WireGuard опознаваемы первые байты пакета
(тип сообщения и нулевые служебные байты). Они скрываются «частичным шифрованием» —
обратимым преобразованием первых нескольких байт. Остальная часть пакета WireGuard
и так выглядит как случайные данные, поэтому шифровать её целиком не нужно
(это экономит ресурсы процессора).
### Что видит DPI
На внешнем участке — поток UDP-пакетов с корректным RTP-заголовком: растущие sequence number
и timestamp, постоянный SSRC, правдоподобный payload type, в начале — STUN/ICE-сигнализация.
Это соответствует картине видеозвонка/стрима, а не VPN.
### Ограничения
Продвинутый DPI со статистическим/энтропийным анализом может заметить, что «содержимое видео»
по статистике похоже на шифрование (полезная нагрузка WireGuard — равномерно случайная).
MEDIA рассчитан на массовый DPI, который классифицирует по заголовкам, портам и поведению,
а не на целевой статистический анализ конкретного потока.
---
## 3. Параметры
Параметры задаются в конфигурации инстанса.
| Параметр | Значения | По умолчанию | Назначение |
|----------|----------|--------------|------------|
| `masking` | `MEDIA` | — | включение режима MEDIA |
| `key` | строка 1–255 символов | — | ключ обфускации (преобразование, скрывающее сигнатуру WireGuard) |
| `obfuscate-bytes` | `0` или число байт | `16` для MEDIA | сколько первых байт пакета преобразовывать. `0` = весь пакет. Минимум для MEDIA — `4` (этого хватает, чтобы скрыть сигнатуру WireGuard); больше — лишняя нагрузка |
| `max-dummy` | `0`…`1024` | — | размер случайной добавки к пакету. **В режиме MEDIA не действует** (частичное преобразование её отключает) |
| `media-pt` | `0` или `96`–`127` | `0` | RTP payload type («тип кодека»). `0` = случайный из набора типовых H.264-комбинаций на каждое подключение |
| `media-ssrc` | `0` или число (hex/dec) | `0` | RTP SSRC (идентификатор потока). `0` = случайный на каждое подключение, свой в каждую сторону |
| `media-clock` | `0` или `1`–`1000` (fps) | `0` | «частота кадров» для шага RTP timestamp. `0` = случайная из набора пресетов |
| `verbose` | `error`/`warn`/`info`/`debug`/`trace` | `info` | уровень логирования |
### Подробнее о значениях
- **`media-pt = 0`, `media-clock = 0`, `media-ssrc = 0` (значения по умолчанию)** — обфускатор
на каждое подключение случайно выбирает один из ~50 заранее заготовленных пресетов
типовых H.264-комбинаций (payload type + частота кадров) и случайные SSRC/sequence
number/timestamp. Это снижает узнаваемость и мешает построению «слепка» паттерна
анализом трафика. В этом режиме **согласование с сервером не требуется** — стороны
выбирают значения независимо.
- **Ненулевые `media-pt` / `media-ssrc`** — фиксированные («статические») значения с проверкой
на приёме. В этом случае значение **должно быть одинаковым на обеих сторонах**, иначе
обратное направление будет отклонено.
- **`media-clock`** приёмником не проверяется никогда — задаёт лишь скорость роста timestamp.
Согласование не требуется ни при каком значении.
- **`verbose`** на боевой работе — `error`. Уровни `debug`/`trace` выводят дамп каждого пакета
и резко повышают нагрузку на процессор.
### Влияние на ресурсы
- На нагрузку процессора влияют `obfuscate-bytes` (объём преобразования) и `verbose`.
- `media-pt`, `media-ssrc`, `media-clock` на нагрузку и на размер пакета **не влияют** — это
лишь значения полей фиксированного 12-байтного RTP-заголовка.
- Накладные расходы на маскировку — фиксированные **12 байт на пакет** (RTP-заголовок).
---
## 4. Что должно совпадать на обеих сторонах
Обязательно одинаковые:
- `key`;
- `obfuscate-bytes`;
- `masking = MEDIA`.
Должны совпадать **только если заданы статически** (ненулевыми):
- `media-pt`;
- `media-ssrc`.
Согласование не требуется (можно оставить по умолчанию / случайными): `media-pt`, `media-ssrc`,
`media-clock`, `verbose`, а также сетевые параметры подключения каждой стороны.
Правило: для `media-pt` и `media-ssrc` используйте либо `0` на обеих сторонах (случайно),
либо одно и то же ненулевое значение. Не смешивайте.
---
## 5. Пример
### Клиент (на устройстве/роутере)
```ini
[client]
source-lport = 13800 # сюда указывает Endpoint WireGuard-интерфейса (127.0.0.1:13800)
target = SERVER_IP:13255 # публичный адрес серверного обфускатора
key = <общий ключ>
masking = MEDIA
obfuscate-bytes = 4
max-dummy = 0
verbose = error
# media-pt / media-ssrc / media-clock не заданы = случайные (рекомендуется)
```
### Сервер
```ini
[server]
source-lport = 13255 # публичный порт приёма маскированного трафика
target = 127.0.0.1:51820 # локальный WireGuard-сервер
key = <тот же ключ>
masking = MEDIA
obfuscate-bytes = 4
max-dummy = 0
verbose = error
```
WireGuard-клиент на устройстве должен иметь `Endpoint = 127.0.0.1:13800`,
WireGuard-сервер слушает `127.0.0.1:51820`.
---
## 6. Эксплуатационные замечания
- **Выход в интернет через VPN (полный туннель):** на стороне сервера должны быть включены
IP-форвардинг и NAT (маскарадинг) для туннельной подсети. Без этого рукопожатие пройдёт,
но реальных данных в интернет не будет.
- **MTU:** маскировка добавляет 12 байт (RTP) к каждому пакету. Если часть сайтов грузится
частично — уменьшите MTU WireGuard-интерфейса (ориентир: ~1400 при сетевом MTU 1500).
- **Снижение нагрузки на процессор без потери маскировки:** `verbose = error`,
`obfuscate-bytes = 4`, `max-dummy = 0`, по возможности повысить MTU (меньше пакетов при
той же скорости).