
Туннелирование данных через WebRTC для обхода цензуры
Туннелирует интернет-трафик через платформы видеозвонков (VK Call, Yandex Telemost, WB Stream) для обхода государственной цензуры белых списков.
Пошаговое руководство по установке (на русском): docs/SETUP.md
Доступны два режима туннеля: DC (DataChannel) и Video (кодирование данных VP8). Рекомендуемая конфигурация — headless на обоих концах — чистый Go (Pion) напрямую взаимодействует с SFU платформы, без браузера. Обфускация ChaCha20, настраиваемый VP8 pacing и бэкенд LiveKit/WB Stream — это функции, доступные только в headless-режиме.
Устаревший браузерный путь (Android WebView joiner против Electron desktop creator с JS-хуками) всё ещё работает для VK DC, но он медленнее, не может обфусцировать и постепенно выводится из эксплуатации. Новые развёртывания должны использовать headless.
Pion открывает SCTP DataChannel на publisher PC и туннелирует TCP/UDP через него. Кадры проходят через SFU платформы как любая другая полезная нагрузка DataChannel.
Joiner (censored, Android/iOS/Linux) Creator (free internet)
All apps
|
VpnService (captures all traffic)
|
tun2socks (IP -> TCP)
|
SOCKS5 proxy (Go, :1080)
|
Headless joiner (Pion) Headless creator (Pion)
| |
DataChannel <------- SFU -------> DataChannel
|
Relay bridge
|
Internet
Тот же конвейер, что и в режиме DC, но туннель передаётся через опубликованный видеотрек VP8 вместо SCTP DataChannel. Полезно, когда SFU ограничивает скорость DataChannel, но пропускает RTP (например, Telemost), а в некоторых случаях обязателен на платформе (publisher track в WB Stream всегда видео). Кадрирование туннеля и мультиплексирующий слой над ним такие же, как в режиме DC.
Трафик проходит через SFU платформы, который находится в государственном белом списке. Для DPI это выглядит как обычный видеозвонок.
relay/ — Go-релей, общий для обоих концов: SOCKS5-прокси, обвязка tun2socks, туннель DC/VP8, обфускатор ChaCha20, мультиплексор соединений, привязки gomobile/iOSheadless/vk/ — Headless VK creator: создаёт или присоединяется к звонку через VK HTTP API, туннель Pion DC/VP8, без браузераheadless/telemost/ — Headless Telemost (Yandex) creator с той же модельюheadless/wbstream/ — Headless WB Stream creator (на базе LiveKit, анонимные гостевые токены)headless/dion/ — Headless DION creator с той же модельюheadless/bitrix/ — Headless Bitrix creator (адаптивный DC/VP8, гостевое присоединение)headless/wbstream-joiner/ — Desktop WB Stream joiner (аналог creator, используется для тестов и Linux-клиентов)headless/telemost-joiner/ — Desktop Telemost joiner (аналог creator, используется для тестов и Linux-клиентов)headless/dion-joiner/ — Desktop DION joiner (аналог creator, используется для тестов и Linux-клиентов)headless/bitrix-joiner/ — Desktop Bitrix joiner (аналог creator, используется для тестов и Linux-клиентов)Готовые бинарники доступны на GitHub Releases.
Скачайте и запустите Electron-приложение из GitHub Releases. Оно автоматически включает Go-релей.
Важно: Звонок должен быть создан из Creator-приложения. Присоединение к существующему звонку из приложения не сработает — JS-хуки должны присутствовать с момента начала звонка.
Доступны три формы; выберите ту, что подходит устройству:
whitelist-bypass.apk из Releases. Разрешите запрос VPN при первом запуске. Вставьте ссылку для присоединения и нажмите GO; общесистемный трафик пойдёт через звонок.whitelist-bypass-proxy.ipa из Releases (sideload через AltStore / Sideloadly / ваш dev-аккаунт). Предоставляет только локальный SOCKS5-прокси — без системного VPN. Чтобы проксировать всё устройство, направьте любое VPN-приложение с поддержкой SOCKS5 (Shadowrocket, Streisand, ...) на SOCKS5-эндпоинт, который показывает приложение; или настройте прокси для каждого приложения отдельно (Telegram имеет встроенную поддержку).--socks-user / --socks-pass включают аутентификацию по имени пользователя/паролю SOCKS5.
headless-wbstream-joiner --room <link> --socks-port 1080 [--socks-user u --socks-pass p]headless-telemost-joiner --tm-link <link> --socks-port 1080 [--socks-user u --socks-pass p]headless-dion-joiner --room <link> --socks-port 1080 [--socks-user u --socks-pass p]headless-bitrix-joiner --link <link> --socks-port 1080 [--socks-user u --socks-pass p]Полное пошаговое руководство (на русском) подробно описывает каждую платформу: см. docs/SETUP.md.
go install golang.org/x/mobile/cmd/gomobile@latest)go install golang.org/x/mobile/cmd/gobind@latest)# Full release build (Android APK + Creator app + Headless creators + Linux joiners + VK bot + iOS IPA on macOS)
./make-release.sh
# Individual builds
./build-go.sh # Go .aar, relay binary, headless creators
./copy-hooks.sh # Copy JS hooks to android assets
./build-app.sh # Android APK
./build-headless.sh # Headless binaries only (current platform)
./build-cli.sh # Per-arch zips of headless creators + joiners + vk-bot
./build-creator.sh # Creator Electron app (all platforms)
./build-ios.sh proxy # iOS proxy app, xcframework + unsigned IPA
./build-ios.sh vpn # iOS VPN app, xcframework + unsigned IPA
Требуется Xcode и macOS. build-ios.sh принимает один аргумент — proxy или vpn.
./build-ios.sh proxy # ios-proxy-app -> prebuilts/whitelist-bypass-proxy.ipa
./build-ios.sh vpn # ios-vpn-app -> prebuilts/whitelist-bypass-vpn.ipa
Скрипт собирает Mobile.xcframework в директорию приложения, запускает strip-signing.sh приложения для очистки developer team из проекта, собирает приложение без подписи и записывает неподписанный IPA в prebuilts/.
Чтобы запустить на устройстве, откройте соответствующий .xcodeproj в Xcode, задайте свою команду и уникальные идентификаторы бандла в Signing & Capabilities и соберите. Вариант vpn требует возможности Network Extension для своих идентификаторов бандла.
Вывод в prebuilts/:
Чтобы собрать проект с помощью Docker, выполните:
docker compose -f docker-build/docker-compose.yml up
Это соберёт все компоненты (creator-app, headless, android app) в папку prebuild (кроме macOS creator)
Чистые Go creators, которые создают звонки через API без браузера. Никакого Electron, никаких JS-хуков — Go Pion PeerConnection напрямую управляет туннелем DataChannel.
./build-headless.sh
Создаётся десять бинарников — пять creators, четыре Linux joiner'а и VK-бот:
./headless/vk/headless-vk-creator --cookies cookies-vk.json
./headless/telemost/headless-telemost-creator --cookies cookies-yandex.json
./headless/wbstream/headless-wbstream-creator --cookies cookies-wbstream.json
./headless/dion/headless-dion-creator --cookies cookies-dion.json
./headless/bitrix/headless-bitrix-creator --cookies cookies-bitrix.json
./headless/wbstream-joiner/headless-wbstream-joiner --room <link> --socks-port 1080
./headless/dion-joiner/headless-dion-joiner --room <link> --socks-port 1080
./headless/telemost-joiner/headless-telemost-joiner --tm-link <link> --socks-port 1080
./headless/bitrix-joiner/headless-bitrix-joiner --link <link> --socks-port 1080
./headless/vk-bot/headless-vk-bot --token <t> --group-id <g> --bins-dir <dir>
Всем четырём creators нужны cookies, экспортированные из desktop creator app (кнопка Export Cookies), в формате JSON [{"name":"..","value":".."},...]. DION также принимает {"email":"..","password":"..","cookies":[]} и затем логинится самостоятельно, см. docs/SETUP.md.
По умолчанию каждый бинарник создаёт новый звонок. Чтобы подключиться к существующему (перезапуск сервера без инвалидации ссылки, несколько shaped-сессий, ...):
Взаимоисключающие с флагами создания звонка (--peer-id для VK; у остальных нет флага создания).
custom откатывается к значениям по умолчанию unlimited для любого неустановленного флага, поэтому частичные переопределения работают:
./headless-vk-creator --cookies cookies-vk.json --vk-link https://vk.com/call/join/<token> \
--resources custom --read-buf 65536 --max-dc-buf 8388608 --mem-limit 268435456 \
--write-file /var/run/whitelist-bypass/call.txt
read-buf — размер буфера чтения TCP/DC. Меньше = более частые проверки backpressure, менее пиковая памятьmax-dc-buf — приостанавливает чтение TCP, когда объём буферизованных данных DataChannel превышает это значение; подключено только в VK (Pion BufferedAmountLowThreshold)mem-limit — мягкий лимит памяти среды выполнения Go; делает GC более агрессивным вблизи предела0xd986b7576340d8d7b04f806dfd38a182b19edf50 — USDC (ERC20)TTEo4XXTB6CqhEiKpyoncfk3skEvoq3bCP — USDT (TRC20)UQCZge2JzLmwNtI56p-ZxLuN2f7ZMCPGqO0XTt3wJ-cy8JaE — USDT (TON)headless/vk-bot/ — Автономный VK Long Poll бот, который по запросу запускает headless creators и отвечает ссылкой для присоединения (серверная альтернатива Electron-боту)headless/tests/ — Живые сквозные тесты (creator + joiners через реальный SFU); запускаются на том же хосте или в докеризованном netns-стенде, см. headless/tests/README.mdandroid-app/ — Android joiner: VpnService + tun2socks + headless Pion (основной путь); также сохраняет WebView fallback для устаревшего браузерного потокаios-proxy-app/ — iOS joiner: SOCKS5 + headless Pion через gomobile xcframeworkcreator-app/ — Electron desktop creator app: GUI-фронтенд, который может запускать либо устаревший браузерный путь, либо порождать headless Go-бинарники; подходит как для интерактивного использования, так и для развёртыванийhooks/ — JavaScript-хуки для устаревшего браузерного пути (режимы DC и Video, VK и Telemost). Headless не использует JS-хуки.| Файл | Платформа |
|---|
WhitelistBypass Creator-*-arm64.dmg | macOS |
WhitelistBypass Creator-*-x64.exe | Windows x64 |
WhitelistBypass Creator-*-ia32.exe | Windows x86 |
WhitelistBypass Creator-*.AppImage | Linux x64 |
whitelist-bypass.apk | Android |
whitelist-bypass-proxy.ipa | iOS proxy app, unsigned |
whitelist-bypass-vpn.ipa | iOS VPN app, unsigned |
headless-vk-creator-linux-x64 | Linux x64 |
headless-vk-creator-linux-ia32 | Linux x86 |
headless-telemost-creator-linux-x64 | Linux x64 |
headless-telemost-creator-linux-ia32 | Linux x86 |
headless-wbstream-joiner-linux-x64 | Linux x64 |
headless-wbstream-joiner-linux-ia32 | Linux x86 |
headless-telemost-joiner-linux-x64 | Linux x64 |
headless-telemost-joiner-linux-ia32 | Linux x86 |
headless-vk-bot-linux-x64 | Linux x64 |
headless-vk-bot-linux-ia32 | Linux x86 |
| Флаг | VK | TM | WB | Описание |
|---|
--cookies <path> | yes | yes | yes | путь к cookies JSON |
--cookie-string <str> | yes | yes | - | сырая строка cookie name=val; name=val |
--write-file <path> | yes | yes | yes | добавляет активную ссылку для присоединения в этот файл (одна ссылка на строку) |
--resources <mode> | yes | yes | yes | default / moderate / unlimited / custom (см. ниже) |
--read-buf <bytes> | yes | yes | yes | буфер чтения DC/RTP; учитывается только с --resources custom |
--max-dc-buf <bytes> | yes | - | - | DataChannel BufferedAmountLowThreshold; только с --resources custom |
--mem-limit <bytes> | yes | yes | yes | мягкий лимит памяти Go (debug.SetMemoryLimit); только с --resources custom |
| Creator | Флаг | Значение |
|---|
| VK | --vk-link <link> | https://vk.com/call/join/<token> |
| Telemost | --tm-link <uri> | https://telemost.yandex.ru/j/<id> |
| WB Stream | --room <id> | wbstream://<uuid> или просто UUID |
| DION | --room <id> | dion://<id> или https://dion.vc/event/<id> |
| Режим | read-buf | max-dc-buf (VK) | mem-limit |
|---|
moderate | 16 KB | 1 MB | 64 MB |
default | 32 KB | 4 MB | 128 MB |
unlimited | 64 KB | 8 MB | 256 MB |
custom | из --read-buf | из --max-dc-buf | из --mem-limit |