diff --git a/README.md b/README.md index 62b8103..53d4eef 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ # 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/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/) +- https://github.com/kulikov0/whitelist-bypass - проброс через медиасервер SFU ВК и Яндекс Телемоста + ## Настройка Нам понадобится: @@ -45,7 +54,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 +165,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 diff --git a/routes.ps1 b/routes.ps1 index 18ffc0d..0e34b6c 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