- server/main.go → cmd/vk-turn-server/main.go. Несёт остаточные правки сервера
(drop параметра useBond, убрано поле startup-лога).
- client/internal/{browserprofile,captcha,dnsdial,namegen,vkauth} →
internal/client/* (единая иерархия internal/; параллельное дерево
client/internal/ убрано). Все Go import-пути обновлены.
- .github/workflows/{ci,release}.yml, Dockerfile, README.md — пути сборки
переключены на ./cmd/vk-turn-client и ./cmd/vk-turn-server.
- README: убран устаревший пример "server -vless-bond" (флаг удалён ранее);
добавлены рецепты сборки .so для Android arm64 + Linux arm64/amd64 под
ручную упаковку для мобилок.
- internal/proxy/udp/udp.go, internal/config/config.go: обновлены устаревшие
ссылки client/internal/* в doc-комментариях.
- notes/GLOSSARY.md (новый, ~20 терминов): фиксирует DTLS-как-обфускацию,
wrap=AEAD-не-XOR, четыре значения "client", три значения "stream", пять
ортогональных переключателей "mode", заметки по сборке libvkturn.so, iSH,
хрупкость init globalBondRegistry и удаления флагов.
cmd/vk-turn-client/ намеренно оставлен вне этого коммита; сворачивается вместе
с извлечением ручной captcha в следующем коммите, т.к. переименование и правки
импортов manualcaptcha.* попадают в один файл.
Wire-форматы не тронуты. Поведение не изменено кроме уже закоммиченных
удалений CLI.
7.8 KiB
Глоссарий vk-turn-proxy
Один абзац на термин. Если читаешь код и не понял слово — сюда.
Слои протокола (снизу вверх)
backend (WireGuard UDP | TCP service)
↑
[app proxy mode] ← UDP-relay | TCP-forward (vless) | TCP-forward+bond
↑
[wrap / SRTP-mimicry] (optional, AEAD obfuscation поверх payload)
↑
[DTLS] ← обфускация (не security): VK content-filter ожидает DTLS handshake
↑
[TURN ChannelData] ← пакеты идут через VK TURN-relay
↑
[TURN transport] ← UDP (-udp) | TCP/TLS (default), туннель до VK TURN
↑
client ←→ VK TURN-relay
Термины
TURN
Standard relay protocol (RFC 5766/8656). VK выдаёт креды на свои TURN-реле. Мы используем эти реле как транзит к собственному серверу. Транспорт до TURN выбирается флагом -udp (UDP/TCP).
DTLS — это обфускация, не security
VK content-filter дропает payload, который не похож на legit DTLS-handshake. Мы используем pion/dtls чтобы пройти фильтр. Шифрование DTLS — побочный эффект, не цель. Флаг -no-dtls был помечен DO NOT USE и удалён в V2-0 (в проде не работал).
wrap / SRTP-mimicry
Внутреннее имя пакета — wrap (планируется переименование в srtpmimicry на V2-4). CLI флаг -wrap. Это ChaCha20-Poly1305 AEAD с RTP-like wire-header (mimicry). Включается опционально поверх DTLS — даёт дополнительный слой обфускации с RTP-видимостью на проводе. CLI help говорит «ChaCha20-XOR» — врёт, реально AEAD. Не путать с Go-термином wrap (errors.Wrap).
app proxy mode (3 значения)
Что копируется поверх DTLS:
- UDP-relay (default): UDP-пакеты 1-в-1. Для WireGuard.
- TCP-forward (
-vless): TCP-байты в smux-стрим, на сервереnet.Dial("tcp", backend). Generic, имя историческое (первый потребитель — Xray VLESS). Внутренний кандидат имени:tcpfwd. - TCP-forward + bond (
-vless-bondна клиенте): один TCP-коннект страйпится по N smux-сессиям. Сервер автоопределяет по magic первых байтов (bond-autodetect=true). Серверный флаг-vless-bondудалён в V2-0 как избыточный.
bond
Опция TCP-forward режима. Не отдельная подсистема — feature vless. Wire-формат: magic + frame с seq/type/data. Кодек в internal/bond, клиент-handler в internal/bond/client, сервер-registry в internal/bond/server (планируется переезд в internal/proxy/bond{client,server} на V2-4).
TURN stream
Одна из N TURN-connection'ов клиента. Флаг -n (default 10). Каждый stream = отдельный TURN-allocate + DTLS-session. Не путать с smux stream.
smux stream
Внутри одной DTLS-сессии запускается KCP+smux, и поверх него — N smux-стримов. Используется только в TCP-forward режиме. Тип *smux.Stream из xtaci/smux.
VK credential cache / stream-per-cred
Один набор VK creds (полученный через VK API) обслуживает группу TURN streams. Флаг -streams-per-cred (default 10). В коде иногда называется streamsPerCache. То есть «cred» (одна credential) = «cache» (одна запись в StreamCredentialsCache).
Client (4 разных)
cmd/vk-turn-client/— наш клиентский бинарь.vkauth.Client— HTTP-клиент к VK API.bondclient.Handler— наша клиент-сторона bond.turn.NewClient— TURN-protocol-клиент (pion/turn).
При чтении кода держи контекст.
VLESS
Имя проксирующего протокола Xray. Внутри этого репо означает только «TCP-forwarder режим». Никакой VLESS-логики в коде нет — мы просто гоним TCP-байты. Имя историческое; внутреннее переименование в tcpfwd запланировано на V2-4 (CLI флаг -vless остаётся).
iSH
Linux user-mode environment для iOS (через usermode x86 emulation). Пакет internal/ish — listener shim вокруг iOS sandbox-ограничений. Только клиент-only; переедет в internal/client/ish на V2-4.
tcputil
Top-level пакет с KCP/smux-профилями. Имя врёт (никакого TCP внутри). Запланировано переименование в internal/transport/kcptun на V2-4.
turnpipe
Пакет с TURN dial + allocate. Имя pipe создаёт коллизию с pipeConn (bidi data-copy loop в server). Переедет в internal/transport/turndial на V2-4.
netadapt
Conn wrappers (DirectNet, ConnectedUDPConn, SplitFirstWriteConn). Имя не отражает суть — переедет в internal/netconn на V2-4.
Mode (5 разных в CLI)
Все ортогональны:
-udp— TURN transport (UDP|TCP к TURN).-vless— app proxy mode (UDP-relay|TCP-forward).-vless-bond— внутри TCP-forward (только client).-wrap— wrap-обфускация (off|SRTP-mimicry).-dns— DNS resolver (udp|doh|auto).
captcha (auto / manual)
Один домен, два пути:
- auto (
internal/client/captcha): VK slider-puzzle решается программно черезclient/internal/captcha. - manual (пока в
cmd/vk-turn-client/manual_captcha.go, package main): HTTP-сервер на 127.0.0.1:8765, запуск браузера, gzip-rewrite VK-страниц. Запланирован вынос вinternal/client/captcha/manualна V2-2.
Переключение: vkauth.Client пробует auto, при провале → manual fallback. Флаг -manual-captcha сразу идёт в manual.
libvkturn.so
Мобильная (Android) сборка клиента в виде shared library. Собирается вручную разработчиком и переносится в Android-приложение. CI не строит. Внешних //export-функций нет — package main ← buildmode определяется на стороне разработчика.
globalBondRegistry
Server-side глобал, держит активные bond-сессии. Инициализируется на package init — известная фрагильность (isDebug ещё false), работает только потому что bondserver Debug-поле не читается. Переедет в локальную переменную cmd/vk-turn-server/main.go на V2-3.
-no-dtls (УДАЛЕНО)
Был помечен DO NOT USE — в проде не работал, VK content-filter дропает payload без DTLS-handshake. Удалён в V2-0.
-vless-bond на сервере (УДАЛЕНО)
Сервер автоопределяет bond по magic первых байтов. Флаг был избыточен, удалён в V2-0. На клиенте — остаётся.