Skip to content
 
 

Repository files navigation

WDTT — WireGuard over TURN Tunnel


Android API Go Version Kotlin Stars

WDTT — это Android-приложение для создания защищённого WireGuard-туннеля поверх TURN/DTLS. Клиент поднимает локальный VPN-интерфейс на устройстве, получает WireGuard-конфигурацию от вашего VPS и передаёт транспорт через TURN-серверы VK, маскируя соединение под обычный зашифрованный медиатрафик звонка.

MyCollages (1)

Содержание

1. Начало работы и знакомство

Сюда идёт всё, что нужно пользователю, чтобы понять суть проекта и быстро его запустить.

2. Настройка сервера (Техническая часть)

Шаги по установке, настройке окружения и безопасности.

3. Платформы и поддерживаемые клиенты

Разделение по операционным системам и альтернативам.

Note

Обратите внимание

Проекты, указанные в этом разделе, развиваются силами сторонних разработчиков. Как автор этого репозитория, я (amurcanov) делюсь ими исключительно в ознакомительных целях.

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

4. О проекте

Возможности Android-версии

  • Полноценный VPN-режим: приложение использует VpnService и WireGuard GoBackend, поэтому трафик выбранных приложений проходит через системный VPN-интерфейс без ручного импорта конфигов.
  • TURN/DTLS-транспорт: нативный Go-клиент получает временные TURN-учётные данные VK-звонка и поднимает DTLS-соединения к relay-серверу, через который передаётся трафик до вашего VPS.
  • WRAP без захардкоженного ключа: внешний RTP AEAD/ChaCha20-Poly1305 слой выводится из пароля подключения через HKDF. Один пароль — один WRAP-ключ, ключ не хранится в APK.
  • RTP AEAD обфускация: транспорт маскируется под RTP/WebRTC аудиотрафик с OPUS payload type, а полезная нагрузка шифруется AEAD-слоем поверх DTLS/WireGuard.
  • Отдельный безопасный установщик: обычная и Docker-установка сервера вынесены в репозиторий XXcipherX/vkturn-vps-setup, чтобы Android-приложение не хранило SSH-доступ к VPS.
  • Парольная модель доступа: сервер поддерживает главный пароль, до 10 активных пользовательских паролей, 16-символьную генерацию, привязку пароля к устройству, истечение срока и управление через Telegram-бота.
  • Горячее обновление WRAP-ключей: создание, удаление и истечение паролей обновляют набор WRAP-ключей на сервере без перезапуска ядра.
  • Исключения приложений: можно выбрать, какие приложения идут через туннель, а какие работают напрямую. Поддерживаются режимы ЧС и БС, а изменения применяются перезагрузкой WireGuard без полного перенастраивания.
  • Капча VK Smart Captcha: по умолчанию включён режим «Авто капча»: Go v2-решатель, Auto WebView и ручной WebView используются по цепочке без выбора режима пользователем. При отключении авто-режима доступны ручные настройки метода.
  • Живой лог-вьюер: события Go-клиента, DTLS, WireGuard, WRAP, капчи и статистики отображаются в приложении с группировкой одинаковых сообщений и счётчиками повторов.
  • Фоновая устойчивость: Foreground Service, WakeLock, WifiLock, мониторинг смены сети и watchdog помогают переживать Doze, смену Wi-Fi/LTE и падение нативного процесса.
  • VK Auth fallback: клиент использует 2 проверенных VK client_id и переключается между ними при ошибках авторизации.
  • DNS fallback: сначала используются Yandex DNS 77.88.8.8 / 77.88.8.1, а при отказе или таймаутах выполняется fallback на системный провайдерский DNS устройства.
  • Темы и оформление: Material 3, Jetpack Compose, Inter, светлая/тёмная тема, Dynamic Colors на Android 12+ и встроенные палитры.
  • Автообновления: приложение проверяет GitHub releases, показывает диалог обновления и периодически повторяет проверку в фоне.

WIN Linux IOS совместимые клиенты WDTT

Моё любимое

  • luminescq/PWDTT - Хороший порт WDTT на Windows & Linux
  • anton48/vk-turn-proxy-ios — Самодостаточный проект для IOS совместимый с WDTT (server core)(высокий фактор доверия у репозитория)

Улучшенные форки WDTT на андроид:

Альтеративный форк под Windows

(Я не несу ответвености за ваше использование сторонних клиентов совместимых с WDTT)

Текущая версия 2.0.0

Исходная версия Android-приложения — 2.0.0. Релизный workflow добавляет номер запуска и публикует согласованные versionName и tag вида 2.0.0.<номер> / v2.0.0.<номер>. Список изменений конкретной сборки находится на странице релизов.

Другие рабочие решения

Рабочие решения с обходом шейпинга скорости и частыми обновлениями:

Моё любимое

Android

(Я не несу ответвености за ваше использование указанных в ознакомительных целях мной - репозиториев)

Как это работает

Android-приложение → VpnService / WireGuard GoBackend → локальный UDP 127.0.0.1:9000
      → Go-клиент WDTT → WRAP RTP AEAD → VK TURN / DTLS → wdtt-server на VPS → интернет
  1. Приложение запускает нативный Go-клиент libclient.so и передаёт ему адрес VPS, VK-хеши звонка, пароль туннеля и количество потоков.
  2. Go-клиент выводит WRAP-ключ из пароля подключения, получает TURN-учётные данные через VK-звонок, при необходимости решает VK Smart Captcha и устанавливает DTLS-соединения через TURN relay.
  3. Внешний WRAP-слой упаковывает DTLS-пакеты в RTP AEAD/ChaCha20-Poly1305, чтобы ключ не был захардкожен в APK и мог отличаться у каждого пароля.
  4. Первый рабочий канал запрашивает у VPS WireGuard-конфигурацию через GETCONF, передавая локальный порт, device-id и пароль подключения.
  5. Сервер проверяет пароль: главный пароль работает как владелец, сгенерированные пароли имеют срок действия и привязываются к первому устройству.
  6. Android-часть парсит полученный WireGuard-конфиг, поднимает системный VPN-туннель и применяет исключения приложений.
  7. Watchdog следит за Go-процессом, активными воркерами и сетевыми изменениями, перезапуская транспорт при сбоях.

Быстрый старт

  1. Подготовьте VPS с публичным IPv4 и установите сервер через XXcipherX/vkturn-vps-setup. Установщик поддерживает обычный systemd-режим и Docker Compose.
  2. Сохраните IP/домен VPS, настроенные порты и главный пароль, выведенные установщиком.
  3. Скачайте актуальный APK со страницы релизов и установите его на Android-смартфон.
  4. В VK создайте или откройте групповой звонок и скопируйте ссылку вида vk.ru/call/join/xxxxxxxxxxx, где xxxxxxxxxxx — хеш звонка. Старые ссылки vk.com и короткие vk.me/join также поддерживаются.
  5. Во вкладке «Туннель» укажите IP/домен сервера, VK-хеши, пароль подключения и количество потоков.
  6. Нажмите «Подключить», предварительно выдав приложению необходимые разрешения.

Получение VK-хеша

VK → группа → звонок → ссылка приглашения → код после /join/
  1. Откройте VK и создайте пустую группу или используйте существующую.
  2. Начните групповой звонок.
  3. Скопируйте ссылку приглашения.
  4. Вставьте в WDTT всю ссылку или только хеш после /join/.
  5. Можно использовать до 4 хешей одновременно для распределения нагрузки и увеличения доступного числа потоков.

Important

При выходе из звонка нажимайте «Просто завершить», а не «Завершить для всех». Если закрыть комнату для всех участников, хеш перестанет работать.

Установка VPS

Установка и удаление серверной части выполняются отдельным проектом:

XXcipherX/vkturn-vps-setup
      → systemd или Docker Compose
      → wdtt-server + wdtt0 + NAT + firewall

Инструкции для обоих режимов, обновление и диагностика находятся в vkturn-vps-setup. Android-приложение не принимает SSH-пароль и не изменяет firewall VPS.

Server core поддерживает один проверяемый firewall backend — iptables. Он является единственным владельцем правил туннельного INPUT/FORWARD/NAT с меткой WDTT_MANAGED; установщик отвечает только за публичный ingress, блокировку прямого доступа к внутреннему WireGuard-порту и TCPMSS.

По умолчанию используются:

  • 56000/udp — DTLS-сервер WDTT.
  • 56001/udp — внутренний WireGuard-порт сервера.
  • 9000/udp — локальный порт Android-клиента.
  • 10.66.66.0/24 — подсеть WireGuard-устройств.

Если при установке выбраны нестандартные порты, укажите их в ручных настройках подключения Android-клиента. Telegram-бот принимает только три разных порта в диапазоне 1–65535.

Для быстрых ссылок Telegram сервер использует WDTT_PUBLIC_HOST, который уже сохраняют обычный и Docker-установщик. Допустим публичный IPv4 или DNS-имя без схемы и порта. При ручном запуске то же значение можно передать флагом -public-host; если оно не задано, сервер попробует определить публичный IPv4 автоматически и при ошибке не станет выдавать ссылку с фиктивным адресом.

В WRAP-A сервер одновременно поддерживает legacy GETCONF текущего iOS-клиента и lifecycle v2 Android-клиента. По умолчанию на одно legacy-устройство допускается до 64 соединений: этого достаточно для актуального лимита iOS в 60 потоков и небольшого запаса на переподключение. Legacy relay без пакетов или keepalive закрывается через 3 минуты, а Android lifecycle v2 — через 30 минут: это сохраняет прежнюю устойчивость Android к задержкам keepalive во время Doze, а старые v2-соединения по-прежнему сразу удаляются при смене поколения. Для конфигураций свыше 64 потоков увеличьте -legacy-connections-per-device; таймауты настраиваются через -relay-idle-timeout и -v2-relay-idle-timeout соответственно. Механизм поколений Android не применяется к legacy-клиентам и не меняет режим WRAP-S.

Управление доступом

WDTT-сервер поддерживает две модели подключения:

  • Главный пароль: задаётся при установке сервера и используется владельцем.
  • Сгенерированные пароли: создаются через Telegram-бота, имеют срок действия, привязываются к первому устройству и обновляют WRAP-ключи на сервере без перезапуска.

Один сервер может держать до 10 активных паролей. Новые пароли генерируются длиной 16 символов. Главный пароль должен содержать 16–128 символов из A-Z, a-z, 0-9, ., _, -, как минимум два класса и не менее восьми разных символов. Сервер отклоняет распространённые слабые шаблоны и при ошибке системного CSPRNG не создаёт предсказуемый пароль. Это усиливает парольную модель без изменения HKDF/WRAP/GETCONF wire-протокола, поэтому текущие Android- и iOS-клиенты остаются совместимыми.

Команда /list показывает активные пароли, а также все устройства главного пароля с постраничной навигацией. Через inline-кнопки можно удалить главное устройство, отвязать устройство сгенерированного пароля или удалить сам пароль. При удалении или истечении пароля соответствующий WRAP-ключ удаляется из памяти сервера.

Дополнительные возможности

Исключения приложений

Вкладка «Исключ.» показывает установленные приложения с поиском. В режиме ЧС выбранные приложения исключаются из VPN, а в режиме БС логика инвертируется: неотмеченные приложения добавляются в туннель. Само приложение WDTT и VK-клиенты исключаются автоматически, чтобы не ломать TURN-соединение.

Капча

По умолчанию включён режим «Авто капча». Оркестратор делает до двух попыток Go v2-решателя, затем две попытки Auto WebView с коротким таймаутом, затем финальную Go-попытку. Если всё это не помогло, приложение открывает ручной WebView. Авто-режим можно отключить, тогда в UI появляются ручные настройки метода и режима прохождения.

Логирование

Вкладка «Логи» показывает статус получения VK-учётных данных, решение капчи, DTLS-handshake, WRAP-состояние, готовность WireGuard, статистику активных воркеров и ошибки. Повторяющиеся строки схлопываются в одну запись со счётчиком.

Note

Если видны DTLS handshake, но Активных: 0, чаще всего указан неправильный пароль подключения или используется сервер без актуального WRAP-протокола. Если часть потоков уже активна, одиночные DTLS timeout больше не считаются неверным паролем и не останавливают туннель.

Обновления

Приложение проверяет GitHub releases репозитория XXcipherX/proxy-turn-vk-android, умеет показывать диалог новой версии и открывать страницу релиза в браузере. Проверка выполняется при запуске и периодически в фоне. APK, versionName и release tag используют одну версию вида 2.0.0.57 / v2.0.0.57, поэтому новые подписанные сборки корректно обнаруживаются и устанавливаются поверх предыдущих.

Отчёт для issue

В разделе «Информация» есть кнопка «Собрать отчёт». Она копирует версию приложения, Android SDK, ABI, модель устройства, SoC, ROM и fingerprint — эти данные полезны при разборе крашей и проблем с запуском.

Note

Отчёты об ошибках

WDTT зависит от мобильной сети, Android-ограничений фоновой работы, состояния VK-звонка, TURN-квот, DNS и настроек VPS.

Если возникла проблема, приложите к issue отчёт из раздела «Информация», скриншот вкладки «Логи», версию APK, ABI сборки и описание сети. Мелкие повторяющиеся ошибки в логах не всегда означают поломку, если туннель остаётся активным.

Автоматические проверки

  • Server CI выполняет unit/contract- и fault-injection-тесты, контролирует минимальное покрытие, запускает go vet, race detector, короткий fuzzing RTP AEAD и GETCONF, сборку Linux amd64/arm64, govulncheck и реальный Docker smoke. Контейнерный тест поднимает два настоящих userspace WireGuard-клиента через WRAP/DTLS, выполняет HTTP-запрос через NAT и доказывает, что клиенты не могут соединиться друг с другом. Дополнительно он проверяет hostile UDP, отказ при несовпадении паролей, loopback-привязку WireGuard, firewall, права файлов, сохранение ключей и устройств после рестарта, а также graceful shutdown во всех четырёх фазах соединения. Отдельная job сверяет golden wire fixture с фактическим Go-клиентом Android и WRAP-A реализацией iOS. Тесты не обращаются к VK или настоящему Telegram API.
  • Android CI проверяет Go-модуль клиента, собирает нативный клиент для arm64-v8a, armeabi-v7a и x86_64, запускает Gradle unit/lint-задачи и собирает release APK без публикации.
  • Docker CI собирает образ для linux/amd64 и linux/arm64, но не публикует его.
  • Workflow lint проверяет синтаксис и выражения GitHub Actions, а Dependency Review блокирует pull request с новой зависимостью высокой или критической опасности.
  • Gradle Dependency Submission после изменений default-ветки отправляет полный Gradle-граф в GitHub Dependency Graph, чтобы Dependabot alerts видел Android-зависимости.

Обычные Dependabot version updates включены для серверного Go-модуля, Docker и GitHub Actions. Android/Gradle и Go-клиент обновляются вручную после проверки совместимости, при этом Dependabot alerts, security updates, Dependency Review и Android CI продолжают защищать их от известных уязвимостей.

Сборка

export ANDROID_NDK_HOME=/path/to/android-ndk
./scripts/build_client.sh
./gradlew :app:assembleDebug

Одна ABI: ./scripts/build-go-lib.sh arm64-v8a

Подписанная сборка через GitHub Actions

Ручной workflow Build WDTT Release подписывает все APK одним постоянным release-ключом. Перед первым запуском создайте ключ один раз на доверенном компьютере с установленным JDK:

keytool -genkeypair -v -keystore wdtt-release.p12 -storetype PKCS12 `
  -alias wdtt-release -keyalg RSA -keysize 4096 -validity 10000 `
  -dname "CN=WDTT,O=WDTT"

keytool интерактивно запросит пароль, поэтому он не попадёт в историю PowerShell. Для PKCS12 используйте этот же пароль в обоих парольных secrets.

Создайте минимум две резервные копии wdtt-release.p12 вне репозитория и сохраните пароль. Потеря ключа сделает невозможным обновление уже установленных APK. Сам ключ нельзя коммитить в Git.

Преобразуйте ключ в Base64 и скопируйте результат в буфер обмена:

[Convert]::ToBase64String(
  [IO.File]::ReadAllBytes((Resolve-Path .\wdtt-release.p12))
) | Set-Clipboard

В Settings → Secrets and variables → Actions добавьте четыре repository secret:

  • ANDROID_KEYSTORE_BASE64 — Base64 из буфера обмена;
  • ANDROID_KEYSTORE_PASSWORD — пароль хранилища;
  • ANDROID_KEY_ALIASwdtt-release;
  • ANDROID_KEY_PASSWORD — пароль ключа.

После этого запускайте Actions → Build WDTT Release → Run workflow. Workflow не публикует APK при отсутствии секретов, проверяет подпись каждого файла и автоматически формирует согласованные версии:

  • versionName — исходная версия с номером workflow, например 2.0.0.57;
  • release tag — тот же номер с префиксом v, например v2.0.0.57;
  • versionCodeисходный versionCode × 100000 + GITHUB_RUN_NUMBER.

Произвольный release tag не принимается: это не позволяет APK, тегу и updater оказаться на разных версиях.

APK, созданный прежним workflow с одноразовым временным ключом, обновить поверх установленной версии невозможно. Один раз удалите такую версию и установите APK, подписанный постоянным ключом. Все последующие сборки можно будет устанавливать поверх неё без удаления приложения и потери его данных.

Warning

Назначение проекта и дисклеймер

Приложение является техническим инструментом для защищённого туннелирования трафика через ваш собственный TURN-сервер. Проект WDTT носит исключительно витринно-ознакомительный характер на примере уже имеющейся структуры в целях исследования сетевых протоколов.

Я (amurcanov) не призываю использовать WDTT для обхода блокировок или нарушения правил каких-либо платформ, а также не несу ответственности за финальные сценарии использования утилиты пользователями в реальной жизни или сети ИНТЕРНЕТ. Любые специфические технические особенности приложения - не более чем архитектурное совпадение, созданное без какого-либо умысла.

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

Лицензия

Этот проект распространяется под лицензией GNU General Public License v3.0.

About

WireGuard‑туннель через DTLS‑медиарелей ВК TURN‑серверов: трафик проходит от клиента к вашему личному VPS‑серверу через промежуточные медиарелей‑серверы ВК.

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages