<div align="center">
  
  # WDTT — WireGuard over TURN Tunnel
<br>
  <img src="https://img.shields.io/badge/Android-SDK_29--35-3DDC84?style=for-the-badge&logo=android&logoColor=white" alt="Android SDK">
  <img src="https://img.shields.io/badge/Go-1.25-00ADD8?style=for-the-badge&logo=go&logoColor=white" alt="Go Version">
  <img src="https://img.shields.io/badge/Kotlin-Compose-7F52FF?style=for-the-badge&logo=kotlin&logoColor=white" alt="Kotlin">
  <a href="https://github.com/amurcanov/proxy-turn-vk-android/stargazers">
    <img src="https://img.shields.io/github/stars/amurcanov/proxy-turn-vk-android?style=for-the-badge&logo=github&color=ffca28&labelColor=24292e" alt="Stars">
  </a>
</div>
<br>

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

<img width="1000" height="738" alt="MyCollages (1)" src="https://github.com/user-attachments/assets/549c6624-978c-4b00-aae2-d195e470a1d1" />

## Содержание

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

- [Как это работает](#как-это-работает)
- [Быстрый старт](#быстрый-старт)
- [Что нового в версии 1.2.3](#что-нового-в-версии-123)
- [Возможности Android-версии](#возможности-android-версии)

### 2. Настройка и деплой (Техническая часть)
*Шаги по установке, настройке окружения и безопасности.*

- [Деплой VPS](#деплой-vps)
- [Получение VK-хеша](#получение-vk-хеша)
- [Управление доступом](#управление-доступом)
- [Дополнительные возможности](#дополнительные-возможности)

### 3. Платформы и поддерживаемые клиенты
*Разделение по операционным системам и альтернативам.*

- [WIN Linux IOS совместимые клиенты для WDTT](#win-linux-ios-совместимые-клиенты-wdtt)

- [Другие рабочие решения: Ядра/APK](#другие-рабочие-решения)

> [!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.
- **Деплой с телефона:** вкладка **«Деплой»** подключается к серверу по SSH, загружает `wdtt-server`, создаёт `systemd`-сервис, включает NAT/firewall и открывает рабочие UDP-порты.
- **Парольная модель доступа:** сервер поддерживает главный пароль, до 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](https://github.com/luminescq/PWDTT) - Хороший порт WDTT на Windows & Linux
- [anton48/vk-turn-proxy-ios](https://github.com/anton48/vk-turn-proxy-ios) — Самодостаточный проект для IOS совместимый с WDTT (server core)(высокий фактор доверия у репозитория)
  
Улучшенные форки WDTT на андроид:
- [Ivan4537/WDTT-Plus](https://github.com/Ivan4537/WDTT-Plus)
- [XXcipherX/proxy-turn-vk-android](https://github.com/XXcipherX/proxy-turn-vk-android)
-

**Альтеративный форк под Windows**
- [IGOR7276/proxy-turn-vk-windows](https://github.com/IGOR7276/proxy-turn-vk-windows)

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

## Что нового в версии 1.2.3

**Новое:**

- Добавлен новый тип маскировки "Видео" для разнообразия скрытности трафика.
- Реализован режим анонимного потока VK Calls без капчи. #218 @XXcipherX

**Исправления и оптимизация:**

- Исправлена нестабильность на 32-битных Android-устройствах (падения из-за атомарных операций). #217 @XXcipherX
- Cнижена нагрузка на сервер за счёт оптимизации выделения памяти при обфускации RTP #214 @annel0
- Исправлена логика раздельного туннелирования — теперь работает корректно #223 @XXcipherX
- Улучшена обработка ошибок VK Calls: неустранимые ошибки теперь не приводят к бесконечным повторным попыткам #227 @XXcipherX
- Мелкие улучшения капчи и скриптов сборки #221 @Afteroid
- Мелкие улучшения сборочных скриптов и DNS #190 @andbul

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

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

**Моё любимое**
- [samosvalishe/free-turn-proxy](https://github.com/samosvalishe/free-turn-proxy) — Качественные ядра клиента и сервера с частыми обновлениями
- [Moroka8/vk-turn-proxy](https://github.com/Moroka8/vk-turn-proxy) — Качественные ядра клиента и сервера

**Android**
- [samosvalishe/turn-proxy-android](https://github.com/samosvalishe/turn-proxy-android) — альтернативная андроид версия

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

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

```text
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. Скачайте актуальный `APK` со **[страницы релизов](https://github.com/amurcanov/proxy-turn-vk-android/releases)**.
2. Установите приложение на Android-смартфон.
3. Подготовьте айпи, логин, пароль от имеющегося VPS.
4. В VK создайте или откройте групповой звонок и скопируйте ссылку вида `vk.com/call/join/xxxxxxxxxxx`. где xxxxxxxxxxx ваш хеш, или просто вставьте ссылку.
5. Откройте **WDTT** и перейдите во вкладку **«Деплой»**.
6. Введите IP/домен VPS, SSH-логин, пароль и SSH-порт.
7. В **«Секретах»** задайте главный пароль туннеля. При необходимости добавьте Telegram `admin_id` / `bot_token` для управления доступом.
8. Нажмите **«Установить»** и дождитесь завершения деплоя.
9. Во вкладке **«Туннель»** укажите IP/домен сервера, VK-хеши, пароль подключения и количество потоков.
10. Нажмите **«Подключить»** предварительно выдав все необходимые разрешения приложению.

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

```text
VK → группа → звонок → ссылка приглашения → код после /join/
```

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

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

## Деплой VPS

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

```text
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-устройств.

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

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

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

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

Один сервер может держать до **10 активных паролей**. Новые пароли генерируются длиной **16 символов**.

Команда `/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** репозитория [amurcanov/proxy-turn-vk-android](https://github.com/amurcanov/proxy-turn-vk-android), умеет показывать диалог новой версии и открывать страницу релиза в браузере. Проверка выполняется при запуске и периодически в фоне.

#### Отчёт для issue

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

> [!NOTE]
> ### Отчёты об ошибках
> WDTT зависит от мобильной сети, Android-ограничений фоновой работы, состояния VK-звонка, TURN-квот, DNS и настроек VPS.
>
> Если возникла проблема, приложите к `issue` отчёт из раздела **«Информация»**, скриншот вкладки **«Логи»**, версию APK, ABI сборки и описание сети. Мелкие повторяющиеся ошибки в логах не всегда означают поломку, если туннель остаётся активным.
## Сборка

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

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

> [!WARNING]
> ### Назначение проекта и дисклеймер
> Приложение является техническим инструментом для защищённого туннелирования трафика через ваш собственный TURN-сервер. Проект WDTT носит исключительно витринно-ознакомительный характер на примере уже имеющейся структуры в целях исследования сетевых протоколов.
> 
> Я (**amurcanov**) не призываю использовать WDTT для обхода блокировок или нарушения правил каких-либо платформ, а также не несу ответственности за финальные сценарии использования утилиты пользователями в реальной жизни или сети ИНТЕРНЕТ. Любые специфические технические особенности приложения - не более чем архитектурное совпадение, созданное без какого-либо умысла.
>
>Проект является полностью некоммерческим, не содержит платных функций, скрытых подписок или коммерческой выгоды.

## Лицензия

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