proxy-turn-vk-android
Android-клиент для VPN-туннеля WireGuard, который ходит до вашего VPS через TURN relay VK — снаружи это выглядит как зашифрованный медиапоток звонка WebRTC, а не как классический VPN.
Пакет: net.qwdtt.client · Версия: 1.2.5
Совместим с сервером и протоколом WDTT (оригинал: amurcanov/proxy-turn-vk-android). Сервер wdtt-server, ссылки wdtt://, WRAP/RTP и анонимный VK-auth работают так же — можно поднять VPS оригинальным деплоем и подключиться qWDTT.
qWDTT и базовый WDTT — в чём разница
Клиент qWDTT и базовый WDTT используют один и тот же протокол. Серверные части полностью совместимы: wdtt-server с деплоя оригинала или qWDTT, пароли, wdtt://, WRAP/RTP, Telegram-бот — всё работает взаимозаменяемо. Меняется в основном Android-клиент (UI и удобство).
Есть в qWDTT, чего нет в базовом WDTT:
| Функция | qWDTT | Базовый WDTT |
|---|---|---|
| Профили — несколько конфигов, папки, перетаскивание, быстрый выбор на «Туннеле» | да | нет (одна настройка на вкладке) |
Импорт qwdtt://, файл .qwdtt, пакетный JSON, QR на экспорт |
да | только wdtt:// и ручной ввод |
| Глобальные VK-хеши — один пул хешей для нескольких профилей | да | нет |
| Пинг до сервера по профилю, сортировка по задержке | да | нет |
| Подписки — профили по HTTPS JSON, автообновление, трафик на карточке | да | нет |
| Статус пароля в карточке профиля | да | нет |
| VK account auth — вход в аккаунт VK, перехват TURN из WebView | да | только анонимный API |
| Виджет на рабочем столе (вкл/выкл туннеля) | да | нет |
| Плитка в шторке Quick Settings | да | нет |
| Плавающая панель темы/палитры | да | нет |
Зачем это нужно
Для обхода белых списков на сетях мобильных операторов: трафик идёт через VK TURN и выглядит как звонок WebRTC, а не как обычный VPN или прокси.
qWDTT использует инфраструктуру VK-звонков как транспорт:
- клиент получает временные TURN-учётные данные из VK-звонка;
- поднимает DTLS через TURN relay;
- снаружи пакеты обёрнуты в RTP и шифруются WRAP (ChaCha20-Poly1305), чтобы DPI видел поток, похожий на OPUS-аудио WebRTC;
- на телефоне — системный WireGuard (
VpnService+ GoBackend), на VPS —wdtt-server.
Телефон VK TURN relay VPS
┌──────────────┐ RTP+WRAP ┌──────────┐ RTP+WRAP+DTLS ┌─────────────┐
│ WireGuard │ ──/DTLS───► │ relay │ ───────────────►│ wdtt-server │
│ Go-клиент │ │ (VK) │ │ WireGuard │
│ 127.0.0.1 │ └──────────┘ └─────────────┘
└──────────────┘
Что умеет приложение
| Раздел | Кратко |
|---|---|
| Профили | Несколько конфигов, группы, подписки по JSON, импорт/экспорт, QR, файл .qwdtt |
| Импорт ссылок | Официальные wdtt:// и расширенные qwdtt://config?… |
| Туннель | Подключение, логи, статистика, пинг до peer |
| Настройки | Потоки, DNS, капча, режим VK, исключения приложений (ЧС/БС) |
| Деплой | Установка wdtt-server на VPS по SSH с телефона |
| Фон | Foreground service, виджет, плитка в шторке, watchdog при смене сети |
VK: два режима получения TURN
- Анонимный (по умолчанию) — Go-клиент ходит в VK API (
client_id6287487 / 8202606), при капче — цепочка авто-решателей + WebView. - Через аккаунт VK — вход в WebView один раз; при подключении открывается страница звонка, перехватывается
turn_server. Лимит ~4 потока на хеш. TURN-креды кэшируются ~9 мин, затем обновляются автоматически.
Кука VK (remixsid) живёт долго (решает VK). TURN login/password — короткоживущие, это нормально.
Форматы конфигурации
Официальная ссылка WDTT (wdtt://)
Поддерживается полностью — импорт из QR, буфера обмена, Telegram-бота сервера, как в оригинальном WDTT.
wdtt://<IP_сервера>:<dtls_port>:<wg_port>:<local_port>:<пароль>:<vk_hash>
Пример:
wdtt://203.0.113.10:56000:56001:9000:MySecretPass16:8UkewARpV0aJoWheFZlR942el6unTZvhneulo-eU8gA
| Поле | По умолчанию | Описание |
|---|---|---|
dtls_port |
56000 |
UDP-порт DTLS на VPS |
wg_port |
56001 |
внутренний WireGuard-порт сервера |
local_port |
9000 |
локальный UDP на Android |
пароль |
— | пароль подключения (WRAP + авторизация на сервере) |
vk_hash |
— | хеш звонка; если в хеше есть :, всё после 5-го поля склеивается |
При импорте wdtt:// потоки выставляются в 16 (как в оригинале), peer = IP:dtls_port.
Бот на сервере при /list и /new отдаёт такие ссылки; qWDTT их понимает без конвертации.
Расширенная ссылка qWDTT (qwdtt://)
Удобнее для профилей: имя, несколько хешей, настраиваемые потоки.
qwdtt://config?name=Дом&peer=1.2.3.4:56000&hashes=хеш1,хеш2&workers=18&port=9000&pass=секрет
Дополнительно: dtls_port / server_port если peer без порта.
JSON и файл .qwdtt
{
"name": "Дом",
"peer": "1.2.3.4:56000",
"hashes": "хеш1,хеш2",
"workers": 18,
"port": 9000,
"password": "секрет"
}
Альтернативные ключи: vkHashes, workersPerHash, listenPort, pass.
В QR можно передать сырой JSON или Base64. Файл .qwdtt — URI или JSON внутри.
Подписки (HTTPS JSON)
Профили можно раздавать с вашего сервера одним JSON-файлом. Приложение периодически или по кнопке Обновить подтягивает список и заменяет все профили в папке подписки.
В приложении: вкладка Профили → + → Подписка (нужен только адрес JSON; название берётся из subscriptionName).
Карточка подписки на вкладке «Профили»: описание, трафик, кнопки обновить/удалить. Нажатие на карточку открывает папку с профилями. В папку подписки нельзя вручную добавлять или импортировать профили — только через обновление подписки.
Структура JSON
{
"subscriptionName": "DarkBit VPN",
"description": "Подписка · до 24.08.2026",
"trafficUsedMb": 76.8,
"trafficLimitMb": 102912,
"updatedAt": "2026-06-28",
"version": 1,
"profiles": [
{
"name": "Сервер 1",
"peer": "203.0.113.10:56000",
"hashes": "vk_hash_1,vk_hash_2",
"workers": 18,
"port": 9000,
"password": "секрет"
}
]
}
| Поле | Обязательно | Описание |
|---|---|---|
subscriptionName |
да | Название подписки и папки профилей |
profiles |
да | Массив профилей (см. формат JSON выше) |
description |
нет | Текст на карточке подписки |
trafficUsedMb |
нет | Использованный трафик (МБ), для прогресс-бара |
trafficLimitMb |
нет | Лимит трафика (МБ) |
updatedAt |
нет | Метка времени на стороне сервера (строка) |
version |
нет | Версия набора профилей (число, пока не используется в UI) |
Альтернативные ключи: groupName вместо subscriptionName; массив servers вместо profiles; в профиле — vkHashes, workersPerHash, listenPort, pass.
Требования к адресу: только http:// или https://. Ответ — JSON (или Base64 с JSON внутри).
Экспорт группы (⋮ → Управление папками → экспорт) формирует совместимый JSON с subscriptionName и profiles[] — его можно положить на HTTPS и выдать пользователям как подписку.
Быстрый старт
- APK из релизов или сборка ниже.
- Сервер: вкладка Деплой или уже настроенный VPS с
wdtt-server. - VK: групповой звонок → ссылка
vk.com/call/join/…или только хеш после/join/. - Импорт: вставьте
wdtt://…/qwdtt://…, QR или заполните профиль вручную. - Подключить → разрешить VPN.
Завершая звонок: «Просто завершить», не «Завершить для всех» — иначе хеш умрёт.
До 4 хешей в профиле — распределение нагрузки между звонками.
Сервер
server.go → бинарь wdtt-server: DTLS, WRAP/RTP, выдача WG-конфига, /etc/wdtt/passwords.json, Telegram-бот.
| Параметр | Значение |
|---|---|
56000/udp |
DTLS (клиенты) |
56001/udp |
WireGuard внутри сервера |
9000/udp |
локальный порт на Android |
10.66.0.0/16 |
подсеть клиентов (типичный адрес 10.66.66.x) |
Пароли: главный + до 10 пользовательских (срок, привязка к устройству). Обновление без рестарта: правка JSON → kill -HUP $(pidof wdtt-server).
Сборка
export ANDROID_NDK_HOME=/path/to/android-ndk
./scripts/build-native-libs.sh
./gradlew :app:assembleDebug
Одна ABI: ./scripts/build-go-lib.sh arm64-v8a
Структура репозитория
app/ Kotlin + Compose, VPN, WebView (VK auth, капча)
go_client/ Нативный клиент → libclient.so
server.go Серверная часть (совместим с WDTT)
scripts/ Сборка Go под Android ABI
Лицензия
Происхождение
Форк proxy-turn-vk-android (автор amurcanov). Протокол и сервер общие; клиентская часть переработана под профили, импорт и удобство повседневного использования. Разработка форка — SpaceNeuroX/proxy-turn-vk-android.
