VK TURN Proxy

May 22, 2026 · View on GitHub

VK TURN Proxy - клиент и сервер для прокидывания локального UDP/TCP-трафика через TURN-реле, получаемые из ссылки на VK Calls. Типичный сценарий - поднять небольшой server на VPS рядом с WireGuard или Xray, а на клиентском устройстве запустить client, который слушает локальный адрес вроде 127.0.0.1:9000.

Caution

Проект предназначен для обучения, исследований и администрирования собственных стендов. Используйте его только там, где у вас есть право запускать такой трафик и менять сетевую конфигурацию.

Содержание

Как Это Работает

Схема для WireGuard:

WireGuard client -> 127.0.0.1:9000 -> VK TURN Proxy client
  -> VK TURN relay -> VK TURN Proxy server на VPS
  -> 127.0.0.1:<порт WireGuard> -> WireGuard server

Клиент берет временные TURN-учетные данные из ссылки VK Calls, открывает одно или несколько соединений к TURN-реле и отправляет через них трафик к вашему server. Между client и server используется DTLS. Для WireGuard сервер пересылает данные в UDP backend, для VLESS/Xray - в TCP backend через KCP и smux.

Возможности

  • VK Calls как основной источник TURN-учетных данных.
  • TCP или UDP подключение клиента к TURN-реле.
  • Несколько параллельных TURN-потоков через -n.
  • WireGuard/Hysteria-подобный UDP backend.
  • VLESS/Xray TCP backend через -vless.
  • Bonding для VLESS через -vless-bond.
  • Дополнительная WRAP-обфускация DTLS-пакетов через -wrap.
  • Автоматическое и ручное прохождение VK captcha.
  • Docker-образ для серверной части.

Что Нужно

  • VPS с публичным IP.
  • На VPS уже должен слушать backend:
    • WireGuard: обычно 127.0.0.1:51820/udp;
    • Xray/VLESS: обычно 127.0.0.1:443/tcp.
  • Ссылка на активный VK Calls вида https://vk.com/call/join/....
  • На клиенте: WireGuard, Xray или другой локальный клиент, который будет ходить в 127.0.0.1:9000.

Ссылку VK Calls лучше создать самостоятельно. Не завершайте звонок для всех, если хотите использовать эту ссылку дальше.

Быстрый Старт: WireGuard

1. Запустите Сервер На VPS

Скачайте бинарник для Linux amd64:

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

Запустите server, указав локальный адрес WireGuard:

./server -listen 0.0.0.0:56000 -connect 127.0.0.1:51820

Порт 56000/udp должен быть доступен снаружи. Если WireGuard слушает другой порт, замените 51820.

2. Настройте WireGuard На Клиенте

В клиентском конфиге WireGuard замените endpoint сервера на локальный адрес VK TURN Proxy:

Endpoint = 127.0.0.1:9000
MTU = 1280

На Android добавьте Termux или приложение-клиент в исключения WireGuard. На Windows, Linux и macOS перед включением WireGuard нужно добавить маршрут до TURN-реле, иначе клиент может попытаться подключаться к TURN уже через сам VPN.

3. Запустите Клиент

Linux:

curl -L -o client https://github.com/cacggghp/vk-turn-proxy/releases/latest/download/client-linux-amd64
chmod +x client
./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" | ./routes.sh

Windows PowerShell от администратора:

Invoke-WebRequest -Uri https://github.com/cacggghp/vk-turn-proxy/releases/latest/download/client-windows-amd64.exe -OutFile client.exe
.\client.exe -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" | .\routes.ps1

macOS:

curl -L -o client https://github.com/cacggghp/vk-turn-proxy/releases/latest/download/client-darwin-arm64
chmod +x client
./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" | ./routes-macos.sh

После появления соединения включите WireGuard.

Если вы скачали только бинарник, но не клонировали репозиторий, возьмите нужный route-скрипт из этого репозитория: routes.sh, routes.ps1 или routes-macos.sh.

Android Через Termux

  1. Установите Termux из F-Droid.
  2. В WireGuard укажите Endpoint = 127.0.0.1:9000 и MTU = 1280.
  3. Добавьте Termux в исключения WireGuard.
  4. Запустите в Termux:
termux-wake-lock
curl -L -o client https://github.com/cacggghp/vk-turn-proxy/releases/latest/download/client-android-arm64
chmod +x client
./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>"

Чтобы снять wake lock:

termux-wake-unlock

iOS Через iSH

Это запасной вариант, если нет нативного клиента.

apk update
apk add curl
curl -L -o client https://github.com/cacggghp/vk-turn-proxy/releases/latest/download/client-linux-386
chmod +x client
GOMAXPROCS=1 GODEBUG=asyncpreemptoff=1 ./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>"

Чтобы iSH дольше жил в фоне, можно в начале сессии выполнить:

cat /dev/location > /dev/null &

Сервер Как systemd-Сервис

Пример /etc/systemd/system/vk-turn-proxy.service:

[Unit]
Description=VK TURN Proxy server
After=network.target

[Service]
Type=simple
ExecStart=/opt/vk-turn-proxy/server -listen 0.0.0.0:56000 -connect 127.0.0.1:51820
Restart=always
RestartSec=5
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

Применить:

sudo systemctl daemon-reload
sudo systemctl enable --now vk-turn-proxy.service
sudo systemctl status vk-turn-proxy.service

Docker

Образ публикуется в GitHub Container Registry:

docker pull ghcr.io/cacggghp/vk-turn-proxy:latest

Если backend слушает на хосте, удобнее использовать host network:

docker run --rm --network host \
  -e CONNECT_ADDR=127.0.0.1:51820 \
  ghcr.io/cacggghp/vk-turn-proxy:latest

Bridge mode:

docker run --rm -p 56000:56000/udp \
  -e CONNECT_ADDR=<host-ip>:51820 \
  ghcr.io/cacggghp/vk-turn-proxy:latest

Переменные окружения:

ПеременнаяПо умолчаниюОписание
CONNECT_ADDRобязательнаbackend, куда сервер пересылает трафик
LISTEN_ADDR0.0.0.0:56000адрес прослушивания сервера
VLESS_MODEfalseвключает -vless
VLESS_BONDfalseвключает -vless-bond
WRAP_MODEfalseвключает -wrap
WRAP_KEYпустоключ для -wrap-key
VK_TURN_KCP_PROFILEbalancedпрофиль KCP (fast, balanced, slow)
VK_TURN_KCP_MTU1200переопределить MTU для KCP

Сборка образа вручную:

docker build -t vk-turn-proxy .

VLESS / Xray

В режиме -vless VK TURN Proxy прокидывает TCP-соединения. На VPS server подключается к локальному TCP backend, например к Xray inbound на 127.0.0.1:443. На клиенте client слушает локальный TCP адрес, на который должен смотреть ваш Xray/v2rayN/sing-box клиент.

Сервер:

./server -listen 0.0.0.0:56000 -connect 127.0.0.1:443 -vless

Клиент:

./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" -vless

С bonding:

./server -listen 0.0.0.0:56000 -connect 127.0.0.1:443 -vless -vless-bond
./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" -vless -vless-bond -n 4

WRAP-Режим

-wrap дополнительно оборачивает DTLS-пакеты ChaCha20-XOR перед отправкой в TURN ChannelData. Ключ должен совпадать на клиенте и сервере.

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

./server -gen-wrap-key

Запуск:

./server -listen 0.0.0.0:56000 -connect 127.0.0.1:51820 -wrap -wrap-key <64-hex-key>
./client -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>" -wrap -wrap-key <64-hex-key>

-wrap нельзя использовать вместе с -no-dtls.

Настройка KCP (VLESS)

В режиме -vless для передачи данных поверх DTLS используется KCP. Его можно настроить через переменные окружения (работает и для клиента, и для сервера):

ПеременнаяПрофили / ЗначенияОписание
VK_TURN_KCP_PROFILEfast, balanced, slowПредустановленные режимы работы KCP.
VK_TURN_KCP_MTUнапример, 1200Максимальный размер пакета.

Профили:

  • fast (или legacy): Минимальные задержки, активная переотправка, MTU 1280.
  • balanced (или cc): Оптимальный баланс для большинства сетей, MTU 1200.
  • slow (или conservative): Для очень нестабильных каналов, MTU 1150.

Для более тонкой настройки доступны переменные: VK_TURN_KCP_NODELAY, VK_TURN_KCP_INTERVAL, VK_TURN_KCP_RESEND, VK_TURN_KCP_NC, VK_TURN_KCP_SNDWND, VK_TURN_KCP_RCVWND, VK_TURN_KCP_ACK_NODELAY.

Яндекс Телемост

Поддержка -yandex-link оставлена в коде, но этот режим считается нестабильным и может не работать. Если используете его, обычно нужен -udp и ручной TURN IP:

./client -udp -turn 5.255.211.241 -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -yandex-link "<telemost-link>"

Флаги Клиента

ФлагПо умолчаниюОписание
-listen127.0.0.1:9000локальный адрес для WireGuard или Xray клиента
-peerобязательныйадрес VK TURN Proxy server на VPS, например <ip-vps>:56000
-vk-linkпустоссылка VK Calls
-yandex-linkпустоссылка Яндекс Телемоста, legacy-режим
-nVK: 10, Yandex: 1количество TURN-соединений
-udpfalseподключаться к TURN-реле по UDP вместо TCP
-turnиз ссылкипереопределить IP TURN-сервера
-portиз ссылкипереопределить порт TURN-сервера
-vlessfalseTCP/VLESS режим
-vless-bondfalseраспределять одно TCP-соединение по активным smux-сессиям
-wrapfalseвключить WRAP-обфускацию
-wrap-keyпусто32-байтный ключ в hex, 64 символа
-gen-wrap-keyfalseнапечатать новый WRAP-ключ и выйти
-manual-captchafalseсразу использовать ручное прохождение captcha
-captcha-hostпустоhost:port для manual captcha, например 192.168.99.1:8765
-captcha-solverv2авто-решатель captcha: v1 или v2
-streams-per-cred10сколько потоков используют один кеш TURN-учетных данных
-debugfalseподробные логи
-no-dtlsfalseпрямой режим без DTLS, не рекомендуется

Нужно указать ровно одну ссылку: -vk-link или -yandex-link.

Флаги Сервера

ФлагПо умолчаниюОписание
-listen0.0.0.0:56000адрес прослушивания
-connectобязательныйbackend-адрес, например 127.0.0.1:51820 или 127.0.0.1:443
-vlessfalseTCP/VLESS режим
-vless-bondfalsebonding для VLESS
-wrapfalseвключить WRAP-обфускацию
-wrap-keyпусто32-байтный ключ в hex, 64 символа
-gen-wrap-keyfalseнапечатать новый WRAP-ключ и выйти
-debugfalseподробные логи

Captcha

Для VK Calls клиент умеет автоматически проходить captcha. Если автоматика не сработала, включается ручной сценарий через локальный браузер. Можно сразу запросить ручной режим:

./client -manual-captcha -listen 127.0.0.1:9000 -peer <ip-vps>:56000 -vk-link "<vk-call-link>"

Профиль браузера сохраняется в vk_profile.json рядом с бинарником и может помочь последующим запросам выглядеть последовательнее.

Сборка Из Исходников

Нужен Go 1.25.x.

go build -o client ./client
go build -o server ./server
go test ./...

Кросс-сборка примера для Linux amd64:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o server-linux-amd64 ./server
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o client-linux-amd64 ./client

Решение Проблем

  • Сначала запускайте VK TURN Proxy client, потом включайте WireGuard.
  • Если WireGuard забирает весь трафик, добавьте маршрут до IP TURN-реле через routes.sh, routes.ps1 или routes-macos.sh.
  • Если TCP до TURN не работает, попробуйте -udp.
  • Если соединение нестабильное, попробуйте уменьшить -n, например -n 1.
  • Если VK просит captcha слишком часто, попробуйте -manual-captcha, затем повторите обычный запуск.
  • Если клиент зависает на получении TURN-данных, проверьте, что ссылка VK Calls живая и не была завершена для всех.
  • Если сервер запущен в Docker bridge mode, CONNECT_ADDR=127.0.0.1:51820 укажет внутрь контейнера, а не на хост. Используйте host network или IP хоста.
  • Если включен -wrap, убедитесь, что и клиент, и сервер используют одинаковый -wrap-key.

Похожие Проекты

Авторы этого репозитория не отвечают за работу сторонних проектов.

Server:

Android:

iOS:

macOS:

Лицензия

GPL-3.0. См. LICENSE.

Star History Chart