diff --git a/docs/README.md b/docs/README.md index 9ce45ed..6135861 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,10 @@ # Документация - [Быстрый старт (WireGuard)](quickstart.md) -- [Режимы: UDP / VLESS / WRAP / KCP](modes.md) +- [Режимы: UDP / TCP / OBF / KCP](modes.md) - [Флаги клиента и сервера](flags.md) - [Развёртывание: systemd, Docker](deploy.md) - [Мобильные: Android (Termux), iOS (iSH)](mobile.md) - [Сборка из исходников](build.md) - [Решение проблем](troubleshooting.md) -- [Глоссарий](GLOSSARY.md) +- [Глоссарий](glossary.md) diff --git a/docs/deploy.md b/docs/deploy.md index dfd032b..99b3b73 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -10,7 +10,7 @@ docker compose logs -f По умолчанию: WireGuard backend `127.0.0.1:51820`, host network, порт `56000/udp`. -Для VLESS/Xray раскомментируйте `VLESS_MODE: "true"` и смените `CONNECT_ADDR` на `127.0.0.1:443`. +Для Xray/sing-box: `MODE=tcp` и смените `CONNECT_ADDR` на `127.0.0.1:443`. Для SRTP-мимикрии: `OBF_MODE=true` и `OBF_KEY=<64-hex>`. ## Docker Run @@ -38,12 +38,10 @@ docker run -d --name btp -p 56000:56000/udp --restart unless-stopped \ | --- | --- | --- | | `CONNECT_ADDR` | **обязательна** | backend сервера | | `LISTEN_ADDR` | `0.0.0.0:56000` | адрес прослушивания | -| `VLESS_MODE` | `false` | включает `-vless` | -| `WRAP_MODE` | `false` | включает `-wrap` | -| `WRAP_KEY` | пусто | значение `-wrap-key` | +| `MODE` | `udp` | режим туннеля: `udp` \| `tcp` | +| `OBF_MODE` | `false` | включает `-obf` | +| `OBF_KEY` | пусто | значение `-obf-key` | | `DEBUG` | `false` | включает `-debug` | -| `VK_TURN_KCP_PROFILE` | `balanced` | профиль KCP: `fast` \| `balanced` \| `slow` | -| `VK_TURN_KCP_FEC` | `0:0` | Reed-Solomon FEC: `data:parity` (напр. `10:3`) | Сборка образа: diff --git a/docs/flags.md b/docs/flags.md index 2cdbb3c..7cc167a 100644 --- a/docs/flags.md +++ b/docs/flags.md @@ -6,19 +6,19 @@ | --- | --- | --- | | `-listen` | `127.0.0.1:9000` | локальный адрес `ip:port`, куда подключается WireGuard или Xray клиент | | `-peer` | **обязательный** | адрес сервера на VPS, `host:port` | -| `-vk-link` | **обязательный** | ссылка VK Calls `https://vk.com/call/join/...` | +| `-link` | **обязательный** | ссылка VK Calls `https://vk.com/call/join/...` | | `-n` | `10` | параллельных TURN-потоков | -| `-udp` | `false` | TURN по UDP вместо TCP/TLS | +| `-transport` | `tcp` | транспорт до TURN-реле: `tcp` (TCP/TLS) \| `udp` | +| `-mode` | `udp` | режим туннеля: `udp` (UDP-релей для WireGuard) \| `tcp` (TCP-форвардер для Xray/sing-box) | +| `-bond` | `false` | распределять TCP-соединение по smux-сессиям (только с `-mode tcp`) | | `-turn` | из ссылки | переопределить IP TURN-сервера | | `-port` | из ссылки | переопределить порт TURN-сервера | -| `-vless` | `false` | TCP-форвардер (VLESS/Xray) вместо UDP-релея | -| `-vless-bond` | `false` | распределять TCP-соединение по smux-сессиям (только с `-vless`) | -| `-wrap` | `false` | SRTP-мимикрия payload | -| `-wrap-key` | пусто | общий ключ, 32 байта hex (64 символа) | -| `-gen-wrap-key` | `false` | напечатать новый ключ и выйти | +| `-obf` | `false` | SRTP-мимикрия payload | +| `-obf-key` | пусто | общий ключ, 32 байта hex (64 символа) | +| `-gen-obf-key` | `false` | напечатать новый ключ и выйти | | `-manual-captcha` | `false` | сразу ручной режим captcha | | `-streams-per-cred` | `10` | потоков на один кеш VK-учёток | -| `-dns` | `auto` | `udp` \| `doh` \| `auto` | +| `-dns-mode` | `auto` | `plain` (UDP/53) \| `doh` \| `auto` | | `-dns-servers` | пусто | свои UDP/53 резолверы, `ip[:port][,ip[:port]...]` | | `-debug` | `false` | debug-логи | @@ -28,12 +28,9 @@ | --- | --- | --- | | `-listen` | `0.0.0.0:56000` | адрес прослушивания `ip:port` | | `-connect` | **обязательный** | локальный backend `host:port` (WG `127.0.0.1:51820` / Xray `127.0.0.1:443`) | -| `-vless` | `false` | TCP-форвардер; bond автоопределяется | -| `-wrap` | `false` | SRTP-мимикрия payload | -| `-wrap-key` | пусто | общий ключ, 32 байта hex | -| `-gen-wrap-key` | `false` | напечатать новый ключ и выйти | +| `-mode` | `udp` | режим туннеля: `udp` \| `tcp` (bond автоопределяется) | +| `-obf` | `false` | SRTP-мимикрия payload | +| `-obf-key` | пусто | общий ключ, 32 байта hex | +| `-gen-obf-key` | `false` | напечатать новый ключ и выйти | | `-debug` | `false` | debug-логи | -## Переменные Окружения (KCP) - -См. [modes.md → KCP](modes.md#kcp-только-в--vless). diff --git a/docs/glossary.md b/docs/glossary.md index e393ec8..65bfadf 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -9,9 +9,9 @@ ``` backend (WireGuard UDP | TCP service) ↑ -[app proxy mode] ← UDP-relay | TCP-forward (vless) | TCP-forward+bond +[app proxy mode] ← UDP-relay (-mode udp) | TCP-forward (-mode tcp) | TCP-forward+bond (-mode tcp -bond) ↑ -[wrap / SRTP-mimicry] (optional, AEAD obfuscation поверх payload) +[srtpmimicry] (optional, AEAD обфускация поверх payload) ↑ [DTLS] ← обфускация (не security): VK content-filter ожидает DTLS handshake ↑ @@ -30,19 +30,19 @@ client ←→ VK TURN-relay 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 (в проде не работал). +VK content-filter дропает payload, который не похож на legit DTLS-handshake. Мы используем `pion/dtls` чтобы пройти фильтр. Шифрование DTLS — побочный эффект, не цель. -### 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`). +### srtpmimicry +Пакет `internal/wire/srtpmimicry`. CLI флаг `-obf`. Это **ChaCha20-Poly1305 AEAD** с RTP-like wire-header (mimicry). Включается опционально поверх DTLS — даёт дополнительный слой обфускации с RTP-видимостью на проводе. Не путать с 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 как избыточный. +- **UDP-relay** (`-mode udp`, default): UDP-пакеты 1-в-1. Для WireGuard. +- **TCP-forward** (`-mode tcp`): TCP-байты в smux-стрим, на сервере `net.Dial("tcp", backend)`. Для Xray/sing-box. Пакет `internal/proxy/tcpfwd`. +- **TCP-forward + bond** (`-mode tcp -bond` на клиенте): один TCP-коннект страйпится по N smux-сессиям. Сервер автоопределяет по magic первых байтов (`bond-autodetect=true`). ### 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). +Опция TCP-forward режима (`-mode tcp -bond`). Wire-формат: magic + frame с seq/type/data. Кодек в `internal/wire/bondframe`, клиент-handler в `internal/proxy/bondclient`, сервер-registry в `internal/proxy/bondserver`. ### TURN stream Одна из N TURN-connection'ов клиента. Флаг `-n` (default 10). Каждый stream = отдельный TURN-allocate + DTLS-session. Не путать с smux stream. @@ -62,43 +62,37 @@ VK content-filter дропает payload, который не похож на le При чтении кода держи контекст. ### VLESS -Имя проксирующего протокола Xray. **Внутри этого репо** означает только «TCP-forwarder режим». Никакой VLESS-логики в коде нет — мы просто гоним TCP-байты. Имя историческое; внутреннее переименование в `tcpfwd` запланировано на V2-4 (CLI флаг `-vless` остаётся). +Имя проксирующего протокола Xray. В коде нет VLESS-логики — просто TCP-форвардер. CLI флаг: `-mode tcp`. Внутренний пакет: `tcpfwd`. ### iSH -Linux user-mode environment для iOS (через usermode x86 emulation). Пакет `internal/ish` — listener shim вокруг iOS sandbox-ограничений. Только клиент-only; переедет в `internal/client/ish` на V2-4. +Linux user-mode environment для iOS (через usermode x86 emulation). Пакет `internal/client/ish` — listener shim вокруг iOS sandbox-ограничений. Только клиент-only. -### tcputil -Top-level пакет с **KCP/smux**-профилями. Имя врёт (никакого TCP внутри). Запланировано переименование в `internal/transport/kcptun` на V2-4. +### kcptun +Пакет `internal/transport/kcptun` с KCP/smux-профилями. Используется только в TCP-forward режиме. -### turnpipe -Пакет с TURN dial + allocate. Имя `pipe` создаёт коллизию с `pipeConn` (bidi data-copy loop в server). Переедет в `internal/transport/turndial` на V2-4. +### turndial +Пакет `internal/transport/turndial` — TURN dial + allocate. -### netadapt -Conn wrappers (DirectNet, ConnectedUDPConn, SplitFirstWriteConn). Имя не отражает суть — переедет в `internal/netconn` на V2-4. +### netconn +Пакет `internal/netconn` — Conn wrappers (DirectNet, ConnectedUDPConn, SplitFirstWriteConn). ### 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). +- `-transport tcp|udp` — транспорт до TURN (TCP/TLS или UDP). +- `-mode udp|tcp` — app proxy mode (UDP-relay|TCP-forward). +- `-bond` — bonding внутри TCP-forward (только client). +- `-obf` — srtpmimicry-обфускация. +- `-dns-mode` — транспорт резолвера клиента (plain|doh|auto). ### captcha (auto / manual) Один домен, два пути: -- **auto** (`internal/client/captcha`): VK slider-puzzle решается программно через `client/internal/captcha`. -- **manual** (пока в `cmd/client/manual_captcha.go`, package main): HTTP-сервер на 127.0.0.1:8765, запуск браузера, gzip-rewrite VK-страниц. Запланирован вынос в `internal/client/captcha/manual` на V2-2. +- **auto** (`internal/client/captcha`): VK slider-puzzle решается программно. +- **manual** (`internal/client/captcha/manual`): HTTP-сервер на 127.0.0.1:8765, запуск браузера, gzip-rewrite VK-страниц. Переключение: `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/server/main.go` на V2-3. - -### `-no-dtls` (УДАЛЕНО) -Был помечен DO NOT USE — в проде не работал, VK content-filter дропает payload без DTLS-handshake. Удалён в V2-0. - -### `-vless-bond` на сервере (УДАЛЕНО) -Сервер автоопределяет bond по magic первых байтов. Флаг был избыточен, удалён в V2-0. На клиенте — остаётся. +### `-bond` на сервере +Серверного `-bond` нет — сервер автоопределяет bond по magic первых байтов в стриме. Только клиентский флаг. diff --git a/docs/mobile.md b/docs/mobile.md index 5c2d0f3..6e9ef7e 100644 --- a/docs/mobile.md +++ b/docs/mobile.md @@ -11,7 +11,7 @@ termux-wake-lock curl -L -o client https://github.com/samosvalishe/btp/releases/latest/download/client-android-arm64 chmod +x client -./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" +./client -listen 127.0.0.1:9000 -peer :56000 -link "" ``` Снять wake lock: `termux-wake-unlock`. @@ -25,7 +25,7 @@ apk update apk add curl curl -L -o client https://github.com/samosvalishe/btp/releases/latest/download/client-linux-386 chmod +x client -GOMAXPROCS=1 GODEBUG=asyncpreemptoff=1 ./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" +GOMAXPROCS=1 GODEBUG=asyncpreemptoff=1 ./client -listen 127.0.0.1:9000 -peer :56000 -link "" ``` Дольше в фоне: diff --git a/docs/modes.md b/docs/modes.md index 8ec0330..76dbbea 100644 --- a/docs/modes.md +++ b/docs/modes.md @@ -2,63 +2,51 @@ ## UDP-Релей (WireGuard / Hysteria) -Дефолт. Клиент слушает локальный UDP, сервер форвардит UDP в backend (WG `127.0.0.1:51820`). +Дефолт (`-mode udp`). Клиент слушает локальный UDP, сервер форвардит UDP в backend (WG `127.0.0.1:51820`). -## VLESS / Xray (TCP) +## TCP-Форвардер (Xray / sing-box) -Флаг `-vless` на обеих сторонах. Сервер коннектит локальный TCP backend (Xray inbound `127.0.0.1:443`). Клиент слушает локальный TCP, на него смотрит Xray/v2rayN/sing-box. +Флаг `-mode tcp` на обеих сторонах. Сервер коннектит локальный TCP backend (Xray inbound `127.0.0.1:443`). Клиент слушает локальный TCP, на него смотрит Xray/v2rayN/sing-box. Поверх DTLS — KCP + smux. ```bash -./server -listen 0.0.0.0:56000 -connect 127.0.0.1:443 -vless -./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" -vless +./server -listen 0.0.0.0:56000 -connect 127.0.0.1:443 -mode tcp +./client -listen 127.0.0.1:9000 -peer :56000 -link "" -mode tcp ``` **Bonding** — распределение одного TCP-соединения по всем активным smux-сессиям, флаг только клиентский: ```bash -./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" -vless -vless-bond -n 4 +./client -listen 127.0.0.1:9000 -peer :56000 -link "" -mode tcp -bond -n 4 ``` -> **Breaking (V2-0):** серверный `-vless-bond` удалён, сервер автоопределяет bond по magic-префиксу в стриме. Клиентский `-no-dtls` тоже удалён (VK дропает не-DTLS). +Серверного `-bond` нет — сервер автоопределяет bond по magic-префиксу в стриме. -## WRAP (SRTP-Мимикрия) +## OBF (SRTP-Мимикрия) -`-wrap` маскирует TURN-payload под SRTP: RTP/opus-заголовок + ChaCha20-Poly1305 AEAD на теле. Не защита (DTLS уже шифрует), а обфускация под голос — иначе VK content-filter дропает. Ключ должен совпадать. +`-obf` маскирует TURN-payload под SRTP: RTP/opus-заголовок + ChaCha20-Poly1305 AEAD на теле. Не защита (DTLS уже шифрует), а обфускация под голос — иначе VK content-filter дропает. Ключ должен совпадать. Сгенерировать ключ: ```bash -./server -gen-wrap-key +./server -gen-obf-key ``` Запуск: ```bash -./server ... -wrap -wrap-key <64-hex> -./client ... -wrap -wrap-key <64-hex> +./server ... -obf -obf-key <64-hex> +./client ... -obf -obf-key <64-hex> ``` -## KCP (Только В `-vless`) +## TURN Транспорт -Переменные окружения (клиент и сервер): +По умолчанию клиент подключается к TURN-реле по TCP/TLS. Флаг `-transport udp` переключает на UDP: -| Переменная | Значения | Описание | -| --- | --- | --- | -| `VK_TURN_KCP_PROFILE` | `fast` \| `balanced` \| `slow` | Предустановка. | -| `VK_TURN_KCP_MTU` | напр. `1200` | Размер пакета. | -| `VK_TURN_KCP_FEC` | `data:parity`, напр. `10:3` | Reed-Solomon FEC. | - -**Профили:** - -- `fast` (`legacy`) — минимальные задержки, активная переотправка, MTU 1280. -- `balanced` (`cc`) — баланс для большинства сетей, MTU 1200. -- `slow` (`conservative`) — нестабильные каналы, MTU 1150. - -Тонкая настройка: `VK_TURN_KCP_NODELAY`, `_INTERVAL`, `_RESEND`, `_NC`, `_SNDWND`, `_RCVWND`, `_ACK_NODELAY`. - -**FEC:** на каждые `data` пакетов — `parity` избыточных. Потери до `parity` из `data+parity` восстанавливаются без ретрансмита. Overhead полосы: `parity/data` (для `10:3` — 30%). Включайте при случайных потерях; при шейпе по полосе FEC ухудшит goodput. По умолчанию `0:0`. +```bash +./client ... -transport udp +``` ## Captcha @@ -72,10 +60,10 @@ ## DNS -Флаг `-dns`: +Флаг `-dns-mode` управляет транспортом резолвера самого клиента (VK API, токены, captcha) — не DNS-маршрутизацией пользовательского трафика. -- `udp` — только UDP/53; -- `doh` — только DNS-over-HTTPS; +- `plain` — только UDP/53; +- `doh` — только DNS-over-HTTPS (Yandex DoH); - `auto` (дефолт) — сначала UDP/53, sticky-fallback на DoH при полном отказе. -Свои резолверы: `-dns-servers ip[:port][,ip[:port]...]`. +Свои UDP/53 резолверы: `-dns-servers ip[:port][,ip[:port]...]`. diff --git a/docs/quickstart.md b/docs/quickstart.md index 58a5998..2548487 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -31,14 +31,14 @@ WireGuard забирает весь трафик, включая трафик к ```bash curl -L -o client https://github.com/samosvalishe/btp/releases/latest/download/client-linux-amd64 chmod +x client -./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" -debug 2>&1 | ./scripts/routes.sh +./client -listen 127.0.0.1:9000 -peer :56000 -link "" -debug 2>&1 | ./scripts/routes.sh ``` **Windows (PowerShell от администратора):** ```powershell Invoke-WebRequest -Uri https://github.com/samosvalishe/btp/releases/latest/download/client-windows-amd64.exe -OutFile client.exe -.\client.exe -listen 127.0.0.1:9000 -peer :56000 -vk-link "" -debug 2>&1 | .\scripts\routes.ps1 +.\client.exe -listen 127.0.0.1:9000 -peer :56000 -link "" -debug 2>&1 | .\scripts\routes.ps1 ``` **macOS:** @@ -46,7 +46,7 @@ Invoke-WebRequest -Uri https://github.com/samosvalishe/btp/releases/latest/downl ```bash curl -L -o client https://github.com/samosvalishe/btp/releases/latest/download/client-darwin-arm64 chmod +x client -./client -listen 127.0.0.1:9000 -peer :56000 -vk-link "" -debug 2>&1 | ./scripts/routes-macos.sh +./client -listen 127.0.0.1:9000 -peer :56000 -link "" -debug 2>&1 | ./scripts/routes-macos.sh ``` Когда скрипт напечатает `Ensuring route to ...` — включайте WireGuard. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index d4784b7..7b4cd76 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -8,5 +8,5 @@ - VK часто требует captcha → `-manual-captcha`, затем обычный запуск. - Клиент висит на получении TURN-данных → ссылка VK Calls умерла / звонок завершён для всех. - Docker bridge mode → `CONNECT_ADDR=127.0.0.1:...` указывает внутрь контейнера. Используйте `--network host` или IP хоста. -- `-wrap` включён → ключ должен совпадать на клиенте и сервере. -- `VLESS_BOND=true` в docker → не ставьте, серверный флаг удалён в V2-0. +- `-obf` включён → ключ должен совпадать на клиенте и сервере. +- Bond на сервере не нужен — сервер определяет bond автоматически. Используйте только `-bond` на клиенте с `-mode tcp`.