# Режим маскировки 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 -j MASQUERADE iptables -A FORWARD -i -o -j ACCEPT iptables -A FORWARD -i -o -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` на обеих сторонах, либо одно и то же ненулевое значение.