# Режим маскировки MEDIA — руководство по настройке
## Общие сведения
MEDIA — режим маскировки wg-obfuscator, при котором трафик между двумя обфускаторами
во внешнем контуре выглядит как **непрерывный медиапоток RTP/H.264 поверх UDP**.
- Сессия начинается с короткой **STUN/ICE-фазы** (как в WebRTC), затем данные идут как RTP.
- Полезная нагрузка WireGuard переносится внутри RTP-пакетов (заголовок RTP 12 байт:
версия 2, payload type, монотонные sequence number и timestamp, постоянный SSRC).
- Для DPI это похоже на видеозвонок/стрим, а не на WireGuard или VPN.
- Это **маскировка, а не шифрование**. Конфиденциальность обеспечивает сам WireGuard.
Режим **задаётся явно на обеих сторонах** (автоопределение не используется). Какие именно
параметры обязаны совпадать — см. колонку «Должен совпадать» в таблице ниже.
---
## Параметры конфигурации
| Параметр | Назначение | Должен совпадать на обеих сторонах |
|----------|------------|:---:|
| `masking = MEDIA` | включение режима | да |
| `key` | ключ обфускации (1–255 символов) | **да** |
| `obfuscate-bytes` | сколько первых байт пакета шифровать XOR (0 = весь пакет). В MEDIA по умолчанию 16 | **да** |
| `max-dummy` | макс. размер dummy-добавки. В MEDIA **не действует** (частичный XOR отключает dummy) | — |
| `media-pt` | RTP payload type. **`0` (по умолчанию) = случайный** из ~50 типовых H.264-пресетов на каждое подключение — согласование не нужно, проверка PT отключена. Ненулевое (96–127) = статичный, с проверкой (**должен совпадать**) | только если задан статично |
| `media-ssrc` | RTP SSRC. **`0` (по умолчанию) = случайный** на каждое подключение (своё значение в каждую сторону) — согласование не нужно, проверка SSRC отключена. Ненулевое значение = статичный токен с проверкой (тогда **должен совпадать**) | только если задан статично |
| `media-clock` | частота кадров (fps) для RTP timestamp. **`0` (по умолчанию) = случайная** из пресетов. Приёмником не проверяется — согласование не требуется никогда | нет |
| `verbose` | уровень логирования: `error`/`warn`/`info`/`debug`/`trace` | нет |
Параметры подключения (`source-lport`, `target`, и т.п.) задаются как обычно и от режима не зависят.
> **Важно для нагрузки:** на боевой работе ставьте `verbose = error`.
> Уровни `debug`/`trace` делают hex-дамп каждого пакета и резко повышают нагрузку на CPU.
---
## Пример конфигурации
### Сторона клиента (устройство/роутер)
```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-clock / media-ssrc не заданы = 0 = случайные значения (рекомендуется,
# снижает узнаваемость). Для статичных значений задайте их ОДИНАКОВО на обеих сторонах.
```
### Сторона сервера
```ini
[server]
source-lport = 13255 # публичный порт, принимает обфусцированный трафик
target = 127.0.0.1:51820 # локальный WireGuard-сервер
key = <тот же ключ>
masking = MEDIA
obfuscate-bytes = 4
max-dummy = 0
verbose = error
# media-pt / media-clock / media-ssrc не заданы = 0 = случайные значения (рекомендуется,
# снижает узнаваемость). Для статичных значений задайте их ОДИНАКОВО на обеих сторонах.
```
WireGuard-клиент на устройстве должен иметь `Endpoint = 127.0.0.1:13800` (локальный обфускатор),
WireGuard-сервер слушает `127.0.0.1:51820`.
---
## Эксплуатационные замечания
- **Полный туннель (выход в интернет через VPN):** на сервере нужны проброс и NAT:
```
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s <туннельная_подсеть> -o <wan-iface> -j MASQUERADE
iptables -A FORWARD -i <wg-iface> -o <wan-iface> -j ACCEPT
iptables -A FORWARD -i <wan-iface> -o <wg-iface> -m state --state RELATED,ESTABLISHED -j ACCEPT
```
Без этого рукопожатие пройдёт, но реальных данных в интернет не будет.
- **MTU:** учитывайте накладные расходы (RTP 12 байт + WireGuard + UDP/IP). Если часть сайтов
грузится частично — понизьте MTU WireGuard-интерфейса (ориентир: ~1400 при WAN 1500).
- **Снижение нагрузки на CPU без потери маскировки:**
- `verbose = error`;
- `obfuscate-bytes` минимальный (4 достаточно, чтобы скрыть сигнатуру WireGuard);
- `max-dummy = 0`;
- по возможности повысить MTU (меньше пакетов при той же скорости).
- Однопоточный путь обфускатора использует пакетный ввод-вывод (recvmmsg/sendmmsg) и
сборку RTP-заголовка без копирования полезной нагрузки.
- **Минимальный безопасный `obfuscate-bytes` — 4.** Меньше нельзя: обнажится сигнатура
WireGuard (тип сообщения + reserved-байты).
- **Рандомизация и согласованность:** по умолчанию (`media-pt = media-clock = media-ssrc = 0`)
обфускатор на каждое подключение случайно выбирает H.264-пресет (payload type + частота кадров)
и случайные SSRC, sequence number, timestamp — это снижает узнаваемость и мешает построению
слепка паттерна анализом трафика. **Согласование с сервером не требуется** (проверки PT/SSRC
при значении `0` отключены, timestamp не проверяется никогда).
Если задаёте статичные `media-pt`/`media-ssrc` — они должны быть **одинаковыми на обеих
сторонах** (иначе обратное направление будет отклонено проверкой). Не смешивайте: для каждого
параметра либо `0` на обеих сторонах, либо одно и то же ненулевое значение.