README.md

August 9, 2026 · View on GitHub

WDTT — WireGuard over TURN Tunnel


Android API Go Version Kotlin Stars

WDTT Community TG

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.