Files
free-turn-proxy/docs/modes.md
T
samosvalishe 4bedd00662 refactor(wire): переименовать srtpmimicry → rtpopus, заменить bool -obf на -obf-profile
Готовим зонтик `internal/wire/` под будущие профили мимикрии (rtph264, vp8
и т.д.). Сейчас интерфейс/registry не вводим — родится при появлении второго
профиля; пока только перепаковываем единственный профиль в собственный namespace.

Пакет:
- `internal/wire/srtpmimicry` → `internal/wire/rtpopus`
- error-префикс `"wrap: ..."` → `"rtpopus: ..."`
- wire-формат не тронут (заморожен — совместимость с задеплоенными пирами)

CLI (breaking):
- `-obf` (bool) удалён
- добавлен `-obf-profile none|rtpopus` (default `none`)
- `ObfOpts.Mode bool` → `Profile ObfProfile` + `Enabled()` helper
- консты `ObfProfileNone`/`ObfProfileRTPOpus`
- validation invalid-value error для `-obf-profile`

Docker (breaking):
- env `OBF_MODE=true` → `OBF_PROFILE=rtpopus`

Callsites:
- `common.NewClientWrap` → `NewClientObf`
- vars `wc`/`relayWC` → `obfConn`, `wrapListener` → `obfListener`
- log `obf=%t` → `obf-profile=%s`

Доки + тесты подтянуты под новые имена.
2026-05-23 15:24:00 +03:00

3.1 KiB

Режимы

UDP-Релей (WireGuard / Hysteria)

Дефолт (-mode udp). Клиент слушает локальный UDP, сервер форвардит UDP в backend (WG 127.0.0.1:51820).

TCP-Форвардер (Xray / sing-box)

Флаг -mode tcp на обеих сторонах. Сервер коннектит локальный TCP backend (Xray inbound 127.0.0.1:443). Клиент слушает локальный TCP, на него смотрит Xray/v2rayN/sing-box.

Поверх DTLS — KCP + smux.

./server -listen 0.0.0.0:56000 -connect 127.0.0.1:443 -mode tcp
./client -listen 127.0.0.1:9000 -peer <vps>:56000 -link "<vk-link>" -mode tcp

Bonding — распределение одного TCP-соединения по всем активным smux-сессиям, флаг только клиентский:

./client -listen 127.0.0.1:9000 -peer <vps>:56000 -link "<vk-link>" -mode tcp -bond -n 4

Серверного -bond нет — сервер автоопределяет bond по magic-префиксу в стриме.

OBF (wire-профили обфускации)

-obf-profile выбирает wire-профиль маскировки TURN-payload. Не защита (DTLS уже шифрует), а обфускация — иначе VK content-filter дропает payload, не похожий на голосовой трафик. Профиль и ключ должны совпадать на клиенте и сервере.

Доступные профили:

  • none (default) — обфускация выключена.
  • rtpopus — RTP/opus-заголовок + ChaCha20-Poly1305 AEAD на теле.

Будущие профили (rtph264, vp8 и т.д.) добавятся по мере необходимости.

Сгенерировать ключ:

./server -gen-obf-key

Запуск:

./server ... -obf-profile rtpopus -obf-key <64-hex>
./client ... -obf-profile rtpopus -obf-key <64-hex>

TURN Транспорт

По умолчанию клиент подключается к TURN-реле по TCP/TLS. Флаг -transport udp переключает на UDP:

./client ... -transport udp

Captcha

Клиент сам проходит VK captcha. Если автоматика не справилась — открывается локальный браузер. Принудительно ручной:

./client -manual-captcha ...

Профиль браузера: vk_profile.json рядом с бинарником.

DNS

Флаг -dns-mode управляет транспортом резолвера самого клиента (VK API, токены, captcha) — не DNS-маршрутизацией пользовательского трафика.

  • plain — только UDP/53;
  • doh — только DNS-over-HTTPS (Yandex DoH);
  • auto (дефолт) — сначала UDP/53, sticky-fallback на DoH при полном отказе.

Свои UDP/53 резолверы: -dns-servers ip[:port][,ip[:port]...].