Skip to content
 
 

Repository files navigation

qWDTT — WireGuard over TURN Tunnel (Fork)


Android SDK Go Version Kotlin Stars

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

Проект получил обновленный современный интерфейс, поддержку виджетов на главном экране, плитки быстрого доступа (Quick Settings Tile) и исправления критических багов оригинального клиента.


Ключевые отличия и улучшения форка qWDTT

⚡ Профили подключения

  • Добавлена возможность создавать и сохранять профили.
  • Быстрое переключение между конфигурациями.

🌐 Тестирование сети

  • Проверка пинга до серверов (ICMP с автоматическим TCP-fallback).
  • График скорости сети в реальном времени.

📱 Быстрый запуск

  • Добавлен виджет для быстрого запуска туннеля.
  • Добавлен пункт быстрых действий в шторке Android для подключения/отключения туннеля.

⚙️ Настройки

  • Создана отдельная вкладка настроек.
  • Улучшена стр��ктура параметров приложения.

🛠 Улучшения

  • Исправлены баги.
  • Общие улучшения стабильности и UX.

📥 Импорт подписок и конфигов

Добавлена поддержка импорта через:

  • ссылку;
  • QR-код;
  • конфигурационный файл.

📋 Форматы импортируемых файлов, ссылок и QR-кодов

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

1. Специальная URI-ссылка (схема)

Вы можете импортировать профиль, открыв ссылку или отсканировав QR-код со следующей схемой:

qwdtt://config?name=ИмяПрофиля&peer=IP_Сервера:Порт&hashes=ХешиЗвонка&workers=18&port=9000&pass=ПарольТуннеля

Параметры ссылки:

  • name — название профиля в приложении.
  • peer — IP-адрес или домен вашего VPS с портом DTLS (например, 192.168.1.1:56000).
  • hashes — один или несколько VK-хешей звонка (через запятую).
  • workers — количество потоков на один хеш (по умолчанию 18).
  • port — локальный порт проксирования (по умолчанию 9000).
  • pass — пароль подключения к вашему туннелю.

2. Конфигурационные файлы

Файлы конфигурации должны иметь расширение .qwdtt и содержать внутри себя:

  • Либо вышеуказанную URI-ссылку (qwdtt://config?...).
  • Либо текстовый объект JSON (в обычном текстовом виде или закодированный в Base64).

3. Формат JSON (сырой или Base64)

Приложение считывает JSON-конфигурации из файлов или QR-кодов. Поддерживается гибкая структура ключей:

{
  "name": "Имя профиля",
  "peer": "192.168.1.1:56000",
  "hashes": "хеш1,хеш2",
  "workers": 18,
  "port": 9000,
  "password": "ваш_пароль_подключения"
}

Допустимые альтернативные ключи:

  • Вместо "hashes" можно использовать "vkHashes".
  • Вместо "workers" можно использовать "workersPerHash".
  • Вместо "port" можно использовать "listenPort".
  • Вместо "password" можно использовать "pass".

Возможности 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.
  • Деплой с телефона: вкладка «Деплой» подключается к серверу по SSH, загружает wdtt-server, создаёт systemd-сервис, включает NAT/firewall и открывает рабочие UDP-порты.
  • Парольная модель доступа: сервер поддерживает главный пароль, до 10 активных пользовательских паролей, 16-символьную генерацию, привязку пароля к устройству, истечение срока и управление через Telegram-бота.
  • Горячее обновление WRAP-ключей: создание, удаление и истечение паролей обновляют набор WRAP-ключей на сервере без перезапуска ядра.
  • Исключения приложений: можно выбрать, какие приложения идут через туннель, а какие работают напрямую. Поддерживаются режимы ЧС (Черный список) и БС (Белый список).
  • Капча VK Smart Captcha: по умолчанию включён режим «Авто капча»: Go v2-решатель, Auto WebView и ручной WebView используются по цепочке без выбора режима пользователем. При отключении авто-режима доступны ручные настройки метода.
  • Живой лог-вьюер: события Go-клиента, DTLS, WireGuard, WRAP, капчи, деплоя и статистики отображаются в приложении с группировкой одинаковых сообщений и счётчиками повторов.
  • Фоновая устойчивость: Foreground Service, WakeLock, WifiLock, мониторинг смены сети и watchdog помогают переживать Doze, смену Wi-Fi/LTE и падение нативного процесса.
  • DNS fallback: сначала используются Yandex DNS 77.88.8.8 / 77.88.8.1, а при отказе или таймаутах выполняется fallback на системный провайдерский DNS устройства.
  • Автообновления: приложение проверяет GitHub releases, показывает диалог обновления и периодически повторяет проверку в фоне.

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

Android-приложение (qWDTT) → VpnService / WireGuard GoBackend → локальный UDP 127.0.0.1:9000
      → Go-клиент qWDTT → 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. Android-часть парсит полученный WireGuard-конфиг, поднимает системный VPN-туннель и применяет исключения приложений.

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

  1. Скачайте актуальный APK со страницы релизов.
  2. Установите приложение на Android-смартфон.
  3. Подготовьте IP, логин, пароль от имеющегося VPS.
  4. В VK создайте или откройте групповой звонок и скопируйте ссылку вида vk.com/call/join/xxxxxxxxxxx (где xxxxxxxxxxx — ваш хеш), либо вставьте ссылку целиком.
  5. Откройте qWDTT и перейдите во вкладку «Деплой».
  6. Введите IP/домен VPS, SSH-логин, пароль и SSH-порт.
  7. В «Секретах» задайте главный пароль туннеля. При необходимости добавьте Telegram admin_id / bot_token для управления доступом.
  8. Нажмите «Установить» и дождитесь завершения деплоя.
  9. Во вкладке «Туннель» укажите IP/домен сервера, VK-хеши, пароль подключения и количество потоков.
  10. Нажмите «Подключить», предварительно выдав необходимые разрешения приложению.

Сборка libclient.so для APK

APK ожидает нативный бинарь в app/src/main/jniLibs/<abi>/libclient.so. Перед сборкой приложения запустите:

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

Если нужно собрать только одну библиотеку вручную и потом подменить её в проекте:

./scripts/build-go-lib.sh arm64-v8a

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

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

Important

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


Деплой VPS

Серверная часть ставится автоматически из приложения:

Android → SSH → /tmp/deploy.sh + /tmp/wdtt-server → /usr/local/bin/wdtt-server
      → systemd wdtt.service → wdtt0 + NAT + firewall

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

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

Если включить ручное управление портами, эти значения можно изменить в «Секретах».

🔄 Обновление ключей без перезапуска (Hot Reload)

В форке qWDTT реализована продвинутая технология бесшовного обновления базы паролей и активных пользователей на сервере без необходимости перезапускать системную службу wdtt.service и разрывать соединение у работающих клиентов.

Чем это лучше и как работает:

  1. Изоляция памяти (Memory Isolation): При подключении клиента сервер делает независимую копию (клон) его ключа шифрования. Благодаря этому, при перезагрузке базы паролей старые ключи активных сессий не обнуляются, и работающие пользователи продолжают скачивать трафик без единого разрыва связи.

  2. Динамический перевыбор ключа (Session Rollover): Поскольку UDP не имеет состояния соединения, переподключение клиента с новым паролем с того же IP и порта могло «залипать» в старой сессии на стороне сервера. В qWDTT сервер при ошибке расшифровки пакета в рамках существующей сессии автоматически пробует расшифровать его другими ключами из обновленной базы. При совпадении ключ сессии обновляется на лету!

  3. Управление внешними скриптами (SIGHUP): Сервер слушает стандартный системный сигнал SIGHUP (сигнал перезапуска конфигурации). Чтобы мгновенно обновить ключи из любого стороннего скрипта (например, вашего бота на Python), достаточно записать изменения в файл /etc/wdtt/passwords.json и послать серверу сигнал:

    kill -HUP $(pidof wdtt-server)

    Все изменения вступят в силу моментально и абсолютно бесшовно для всех участников сети!


Лицензия

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

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages