No description
  • Go 97.5%
  • Go Template 1.6%
  • Shell 0.6%
  • PowerShell 0.2%
Find a file
2026-07-14 20:41:09 +03:00
.github/workflows [ci] stamp client/relay version into release binaries via -ldflags -X 2026-07-14 19:12:04 +03:00
appcontrolpb [client] announce client id in mu session hello and surface heartbeat traffic-limit usage 2026-07-10 15:53:49 +03:00
client [client] default browser-fp to safari 2026-07-14 14:39:16 +03:00
controlpb [server] stream the active-flow list to the panel on a one-second tick 2026-07-05 13:12:39 +03:00
internal [server] provision-locally: mint the wg peer on the node and report it to the panel, avoiding the re-entrant management call that broke own-wg provision 2026-07-14 20:41:09 +03:00
proto [server] provision-locally: mint the wg peer on the node and report it to the panel, avoiding the re-entrant management call that broke own-wg provision 2026-07-14 20:41:09 +03:00
provisioningpb [server] provision-locally: mint the wg peer on the node and report it to the panel, avoiding the re-entrant management call that broke own-wg provision 2026-07-14 20:41:09 +03:00
scripts [client] add secured local AppControl gRPC (VK cookies in/out, provision) and redact cookies from stdout 2026-07-03 06:44:50 +03:00
server [server] provision-locally: mint the wg peer on the node and report it to the panel, avoiding the re-entrant management call that broke own-wg provision 2026-07-14 20:41:09 +03:00
sessionproto [client] announce client id in mu session hello and surface heartbeat traffic-limit usage 2026-07-10 15:53:49 +03:00
tcputil [tcputil]: tune KCP window/MTU for higher throughput 2026-05-17 23:54:09 +03:00
wbstream [client,server,wbstream]: remove dead code paths and fix remaining errcheck 2026-05-20 23:45:31 +03:00
.gitignore 1.8.3 2026-04-16 12:11:24 +03:00
docker-entrypoint.sh 1.8.3 2026-04-16 12:11:24 +03:00
Dockerfile Add Dockerfile 2026-03-29 15:15:58 +03:00
go.mod [server] apply relay peers onto a live kernel WireGuard interface 2026-07-03 05:52:10 +03:00
go.sum [server] apply relay peers onto a live kernel WireGuard interface 2026-07-03 05:52:10 +03:00
LICENSE Add LICENSE 2026-01-11 05:52:34 +00:00
README.md [docs] document toml config, multi-platform builds, captcha bypass and panel flags 2026-07-14 14:39:16 +03:00
routes-macos.sh Create routes-macos.sh 2026-03-18 01:39:55 +00:00
routes.ps1 Merge remote-tracking branch 'upstream/main' 2026-04-04 17:36:30 +07:00
routes.sh don't break route scripts on duplicate TURN IPs 2026-04-02 13:25:14 +03:00

WINGS V VKTP

WINGS V VKTP - форк vk-turn-proxy для работы с клиентами WINGS V.

Проброс трафика WireGuard/Xray через TURN сервера ВК звонков. Пакеты идут параллельными потоками через TURN-сервер по протоколу STUN ChannelData, на peer-сервере распаковываются и форвардятся в WireGuard (или TCP-бэкенд для VLESS-режима). Логин/пароль от TURN генерируются из ссылки на звонок.

Чем отличается от upstream

  • WRAP SRTP-mimicry obfuscation - между DTLS-туннелем и UDP-сокетом добавлен слой AEAD-шифрования (SRTP-AES-GCM или SRTP-ChaCha20-Poly1305), который маскирует DTLS-трейлер под SRTP-пакет. Это обходит content-фильтрацию VK на канале ChannelData.
  • In-band negotiation ключей WRAP через mu/v1 SessionHello - клиент может предложить ключ в handshake, серверу не нужен предустановленный.
  • DoH-фоллбэк - клиент умеет в DNS-over-HTTPS, включая встроенный список endpoint'ов с bootstrap-IP, чтобы не зависеть от системного резолвера.
  • TURN address rotation - на ошибку dial'а клиент пробует следующий TURN-адрес из VK-credential до того как пометить ссылку битой.
  • mu/v1 session protocol - длинноживущие multi-worker сессии без передоговорки на каждый поток.

Установка сервера

Скачать бинарник:

curl -L -o server https://github.com/WINGS-N/vk-turn-proxy/releases/latest/download/server-linux-amd64 && chmod +x server

Релизы собираются под несколько платформ и архитектур - имя ассета server-<os>-<arch>:

  • linux: amd64, arm64, 386, arm (v7), mipsle, mips, mips64le, riscv64
  • windows: amd64, 386, arm64 (с суффиксом .exe)
  • android: arm64, arm

Сервер под darwin (macOS) не собирается - тянет linux-only netlink/wg-apply; там доступен только клиент.

Запуск:

./server -listen 0.0.0.0:56000 -udp-connect 127.0.0.1:<порт wg>

systemd

/etc/systemd/system/vk-turn-proxy.service:

[Unit]
Description=VK Turn Proxy Service
After=network.target

[Service]
Type=simple
ExecStart=/opt/vk-turn-proxy/server-linux-amd64 -listen 0.0.0.0:56000 -udp-connect 127.0.0.1:<wg_port>
KillMode=process
Restart=always
RestartSec=5
User=nobody
Group=nogroup
StandardOutput=append:/var/log/vk-turn-proxy/vk-turn-proxy.log
StandardError=append:/var/log/vk-turn-proxy/vk-turn-proxy_error.log
SyslogIdentifier=vk-turn-proxy

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now vk-turn-proxy

Клиент

Основной клиент - Android-приложение WINGS V. Все ниже перечисленные флаги доступны в его настройках VK TURN.

Для отладки клиент можно запустить вручную:

curl -L -o client https://github.com/WINGS-N/vk-turn-proxy/releases/latest/download/client-android-arm64 && chmod +x client
./client -listen 127.0.0.1:9000 -peer <ip сервера>:56000 -vk-link <VK ссылка>

Клиент собирается под linux, windows (.exe), darwin (macOS, amd64/arm64) и android - ассет client-<os>-<arch>.

В клиентском конфиге WireGuard поменять адрес сервера на 127.0.0.1:9000, MTU 1280.

AllowedIPs

В конфиге WireGuard клиента строка:

AllowedIPs = 0.0.0.0/0, ::0

означает "разрешить весь интернет". Для VK TURN нужно исключить IP адреса ВК (диапазон 155.212.192.0/20, к которому клиент подключается для звонков), иначе подключение к TURN зациклится через туннель.

Замените AllowedIPs на вариант с исключённым VK-диапазоном:

AllowedIPs = 0.0.0.0/1, 128.0.0.0/4, 144.0.0.0/5, 152.0.0.0/7, 154.0.0.0/8, 155.0.0.0/9, 155.128.0.0/10, 155.192.0.0/12, 155.208.0.0/14, 155.212.0.0/17, 155.212.128.0/18, 155.212.208.0/20, 155.212.224.0/19, 155.213.0.0/16, 155.214.0.0/15, 155.216.0.0/13, 155.224.0.0/11, 156.0.0.0/6, 160.0.0.0/3, 192.0.0.0/2

Для подсчёта собственного списка исключений: procustodibus AllowedIPs calculator.

Конфигурация (TOML)

Современный способ настроить сервер - файл /etc/wings/vktp/config.toml (путь переопределяется env-переменной WINGS_VKTP_CONFIG). Флаги при этом можно вообще не передавать в unit.

  • Формат - плоский TOML-сабсет ключ = значение, где имя ключа совпадает с именем флага (без ведущего -): listen, udp-connect, grpc-token, panel-grpc, node-id и т.д. Вложенные таблицы и массивы не поддерживаются.
  • Приоритет: флаг командной строки > файл > встроенный дефолт. То есть флаг всегда перекрывает значение из файла.
  • На первом запуске (если файла ещё нет) сервер сам пишет туда самодокументированный шаблон: сконфигурированные опции - активными строками, остальные - закомментированными с их дефолтами. После этого флаги можно убрать из unit и править только файл.
  • Неизвестный ключ (опечатка) игнорируется, а не роняет старт.

Пример config.toml:

listen = "0.0.0.0:56000"
udp-connect = "127.0.0.1:51820"
# управляющий API для панели
grpc-listen = "0.0.0.0:25612"
grpc-token = "<token>"
# обратный канал к панели
panel-grpc = "panel.example.org:9091"
node-id = "<node-id>"
# managed WireGuard
wg-apply = true
wg-key-file = "/etc/wings/vktp/wg.key"

Флаги ниже остаются полностью рабочими и удобны для отладки/ручного запуска; в проде предпочтителен config.toml.

Флаги

WRAP SRTP-mimicry

Слой обфускации поверх DTLS, маскирует payload под SRTP-кадр чтобы пройти content-фильтр на ChannelData.

Сервер:

Флаг Default Описание
-wrap-mode on off - игнорировать WRAP-предложения клиента; on - принимать.
-wrap-cipher any Допустимые AEAD: any, srtp-aes-gcm, srtp-chacha20-poly1305.
-wrap-key empty Фиксированный 32-byte ключ (64 hex chars). Если задан, перекрывает client proposal.
-wrap-accept-client-keys true Принимать wrap_key_proposal из SessionHello клиента когда -wrap-key пуст. Отключить чтобы заставить сервер использовать только свой preset.

Клиент:

Флаг Default Описание
-wrap-mode off off / preferred (fallback на raw при отказе сервера) / required (fail connect при отказе).
-wrap-cipher srtp-aes-gcm srtp-aes-gcm или srtp-chacha20-poly1305.
-wrap-key empty 32-byte ключ в hex. Если пусто и mode != off, генерируется при старте.
-wrap-send-key true Передавать wrap_key_proposal в mu/v1 SessionHello. Отключить чтобы сервер использовал свой preset.

DNS

Флаг Default Описание
-dns auto auto (UDP/53 с фоллбэком на DoH), udp, doh.
-user-dns empty Пользовательские резолверы перед встроенным списком. Форматы: https://host/dns-query (DoH), udp://ip[:port] или ip[:port] (UDP/53). Разделители: запятая или newline.

Прочие новые/изменённые флаги

Флаг Описание
-vk-link Принимает comma-separated список ссылок (priority order).
-vk-link-secondary Фоллбэк-ссылка для случая когда все primary в cooldown.
-captcha-solver bypass / v2 (дефолт) / v1. bypass - captcha-free путь через VK Calls (api.vk.me / VK Connect) с legacy-солвером как фолбэк; v2 - улучшенный солвер; v1 - старый.
-manual-captcha Пропустить авто-решение капчи и сразу уйти в ручной браузерный флоу.
-vk-auth anonymous (дефолт) / account. В account реле запрашивает у хост-приложения вход в VK-аккаунт (WebView) и получает turn_server creds обратно.
-browser-fp Семейство браузерного фингерпринта для HTTP+TLS impersonation: safari (дефолт) / chrome / edge / firefox / auto (случайный на сессию).
-tcp-flavor auto (negotiate) / direct (smux над DTLS) / legacy (KCP+smux).
-creds-group-size Воркеров на TURN identity (default 12).
-session-mode mainline / mu / auto. mu - long-lived multi-worker sessions с in-band SessionHello.
-session-id Override session ID (hex, 32 chars) для mu mode.
-udp-connect / -tcp-connect (сервер) Раздельные UDP- и TCP-бэкенды (новый стиль; -connect остался как deprecated alias).
-transport (клиент) datagram или tcp (новый стиль вместо deprecated -vless).
-protect-sock (клиент) Unix-сокет для VpnService.protect(fd) IPC, нужен для роутинга от Android.
-tui (сервер) auto / on / off - interactive TUI с метриками сессий.

Интеграция с панелью WINGS V

Сервер умеет работать как управляемая нода панели WINGS V: панель по gRPC программирует WireGuard-пиры (managed-клиенты), а сервер по обратному каналу тянет с панели конфиг и лимиты трафика. Проще всего подключить ноду скриптом connect.sh с панели, который сам пишет config.toml; ниже - соответствующие флаги.

Management API (панель -> реле):

Флаг Default Описание
-grpc-listen empty ip:port управляющего API для панели (пусто - выключено).
-grpc-token empty Bearer-токен, который панель предъявляет на управляющем API. Он же используется как bearer в обратную сторону (единый токен).
-grpc-cert / -grpc-key empty TLS-серт/ключ для управляющего API (пусто - плейнтекст).

Обратный канал (реле -> панель, DTLS PROVISION):

Флаг Default Описание
-panel-grpc empty Provisioning gRPC endpoint панели, включает DTLS PROVISION-путь.
-panel-ca-pin empty SPKI-пин CA панели (sha256/<base64>) для self-signed панели; пусто - проверка через системный trust.
-panel-insecure false Дозваниваться до панели по plaintext h2c вместо TLS (только доверенная локальная сеть).
-node-id empty ID этой ноды, как она зарегистрирована в панели.

Managed WireGuard (программирование пиров ядром):

Флаг Default Описание
-wg-apply false Программировать пиры на живой kernel-WG интерфейс (нужен root).
-wg-interface wg-wingsv Имя туннельного интерфейса.
-wg-listen-port 51820 Порт WireGuard-интерфейса.
-wg-address 10.66.66.1/24 Адрес WireGuard-интерфейса (CIDR).
-wg-tunnel-cidr 10.66.66.0/24 Пул адресов для managed-пиров.
-wg-key-file empty Путь для персиста приватного WG-ключа сервера, чтобы публичный ключ был стабилен между рестартами (пусто - генерируется заново каждый старт).

VLESS-режим

-transport=tcp (или -vless) пробрасывает TCP-стримы через TURN-туннель с помощью KCP/smux вместо UDP-датаграмм.

Сервер:

./server -listen 0.0.0.0:56000 -tcp-connect 127.0.0.1:443 -transport=tcp

Клиент:

./client -peer <ip сервера>:56000 -vk-link <VK ссылка> -listen 127.0.0.1:9000 -transport=tcp

Затем подключить любой VLESS-клиент к 127.0.0.1:9000.

Direct mode

-no-dtls отправляет пакеты без DTLS-обфускации (можно подключиться к обычному WireGuard). Может привести к бану VK - использовать на свой страх.