From ad3a69f40061835097442c99a65990d1b6fa95ad Mon Sep 17 00:00:00 2001 From: gazon673games <221412414143dd@gmail.com> Date: Thu, 2 Apr 2026 13:19:50 +0300 Subject: [PATCH 1/3] don't break route scripts on duplicate TURN IPs VK opens a few parallel connections, so the same TURN IP can show up more than once. Make the Linux and Windows scripts handle reruns instead of failing on duplicate routes. --- routes.ps1 | 27 ++++++++++++++++++++++++--- routes.sh | 25 +++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/routes.ps1 b/routes.ps1 index 2c2464e..c492e6d 100644 --- a/routes.ps1 +++ b/routes.ps1 @@ -16,12 +16,33 @@ $input | ForEach-Object { $addr = $_.Trim() if ($addr -eq "") { return } - Write-Host "Добавляем маршрут к $addr через $gateway" + if ($addr -notmatch '^\d{1,3}(\.\d{1,3}){3}$') { + Write-Warning "Пропускаем неожиданный ввод: $addr" + return + } + + $prefix = "$addr/32" + $existingRoutes = @(Get-NetRoute ` + -DestinationPrefix $prefix ` + -PolicyStore ActiveStore ` + -ErrorAction SilentlyContinue) + + if ($existingRoutes | Where-Object { $_.NextHop -eq $gateway }) { + Write-Host "Маршрут к $addr через $gateway уже существует" + return + } + + if ($existingRoutes.Count -gt 0) { + Write-Host "Обновляем маршрут к $addr через $gateway" + $existingRoutes | Remove-NetRoute -Confirm:$false -ErrorAction Stop + } else { + Write-Host "Добавляем маршрут к $addr через $gateway" + } New-NetRoute ` - -DestinationPrefix "$addr/32" ` + -DestinationPrefix $prefix ` -NextHop $gateway ` -PolicyStore ActiveStore ` - -ErrorAction Stop + -ErrorAction Stop | Out-Null } diff --git a/routes.sh b/routes.sh index fa84ad9..d660e9c 100644 --- a/routes.sh +++ b/routes.sh @@ -1,5 +1,26 @@ #!/bin/bash +set -euo pipefail + gateway="$(ip -o -4 route show to default | awk '/via/ {print $3}' | head -1)" -while read -r remote; do - sudo ip r add $remote via $gateway +if [[ -z "${gateway}" ]]; then + echo "Could not determine default gateway" >&2 + exit 1 +fi + +ip_cmd=(ip) +if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then + ip_cmd=(sudo ip) +fi + +while IFS= read -r remote; do + remote="${remote%$'\r'}" + [[ -z "$remote" ]] && continue + + if [[ ! "$remote" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then + echo "Skipping unexpected input: $remote" >&2 + continue + fi + + echo "Ensuring route to $remote via $gateway" + "${ip_cmd[@]}" route replace "$remote" via "$gateway" done From 0c33fdb9379d96a9036d6623a6f4ed07fafd3d23 Mon Sep 17 00:00:00 2001 From: cacggghp Date: Sat, 4 Apr 2026 03:03:10 +0000 Subject: [PATCH 2/3] Update README.md --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f0268d..b2b5c7b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,17 @@ # Good TURN -Проброс трафика WireGuard/Hysteria через TURN сервера VK звонков или Яндекс телемоста. Пакеты шифруются DTLS 1.2, затем параллельными потоками через TCP или UDP отправляются на TURN сервер по протоколу STUN ChannelData. Оттуда по UDP отправляются на ваш сервер, где расшифровываются и передаются в WireGuard. Логин/пароль от TURN генерируются из ссылки на звонок. +Проброс трафика WireGuard/Hysteria через TURN сервера VK звонков или ~~Яндекс телемоста~~. Пакеты шифруются DTLS 1.2, затем параллельными потоками через TCP или UDP отправляются на TURN сервер по протоколу STUN ChannelData. Оттуда по UDP отправляются на ваш сервер, где расшифровываются и передаются в WireGuard. Логин/пароль от TURN генерируются из ссылки на звонок. Только для учебных целей! +## Похожие проекты +- https://github.com/MYSOREZ/vk-turn-proxy-android - клиент для андроида +- https://github.com/kiper292/wireguard-turn-android - клиент для андроида интегрированный в WireGuard +- https://github.com/nullcstring/turnbridge - клиент для IOS +- https://github.com/Urtyom-Alyanov/turn-proxy - реализация на Rust +- https://github.com/jaykaiperson/lionheart - аналог для https://stream.wb.ru (статья: https://habr.com/ru/articles/1017410/) +- https://github.com/kulikov0/whitelist-bypass - проброс через медиасервер SFU ВК и Яндекс Телемоста + ## Настройка Нам понадобится: @@ -45,7 +53,34 @@ curl -L -o server https://github.com/cacggghp/vk-turn-proxy/releases/latest/down # Запуск сервера ./server -listen 0.0.0.0:56000 -connect 127.0.0.1:<порт wg> ``` +#### Установка демона +На сервере в файле `/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 -connect 127.0.0.1: +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 +``` +Где `/opt/vk-turn-proxy/server-linux-amd64` - путь к файлу, `` - порт сервера wg +``` +systemctl daemon-reload +systemctl enable vk-turn-proxy.service +systemctl start vk-turn-proxy.service +``` #### Docker Образ Docker публикуется в GitHub Container Registry: @@ -129,6 +164,8 @@ curl -L -o client https://github.com/cacggghp/vk-turn-proxy/releases/latest/down **Если после включения VPN в терминале вылезают ошибки DNS, попробуйте в Wireguard включить VPN только для нужных приложений.** +#### IOS +- https://github.com/cacggghp/vk-turn-proxy/issues/76 #### Linux В клиентском конфиге WireGuard меняем адрес сервера на `127.0.0.1:9000`, ставим MTU 1280 From 37ee4e0d0ffd02e780ef506769d6b11db6e5a79e Mon Sep 17 00:00:00 2001 From: cacggghp Date: Sat, 4 Apr 2026 04:14:02 +0000 Subject: [PATCH 3/3] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b2b5c7b..983e4e6 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ ## Похожие проекты - https://github.com/MYSOREZ/vk-turn-proxy-android - клиент для андроида - https://github.com/kiper292/wireguard-turn-android - клиент для андроида интегрированный в WireGuard +- https://github.com/WINGS-N/WINGSV - клиент для андроида с One UI, WireGuard, раздачей VPN с root - https://github.com/nullcstring/turnbridge - клиент для IOS - https://github.com/Urtyom-Alyanov/turn-proxy - реализация на Rust - https://github.com/jaykaiperson/lionheart - аналог для https://stream.wb.ru (статья: https://habr.com/ru/articles/1017410/)