
Tunelización de datos sobre webrtc para eludir la censura
Tuneliza el tráfico de internet a través de plataformas de videollamadas (VK Call, Yandex Telemost, WB Stream) para eludir la censura de listas blancas gubernamentales.
Guía de configuración paso a paso (en ruso): docs/SETUP.md
Hay dos modos de túnel disponibles: DC (DataChannel) y Video (codificación de datos VP8). La configuración recomendada es sin interfaz gráfica en ambos extremos - Go puro (Pion) se comunica directamente con el SFU de la plataforma, sin navegador. La ofuscación ChaCha20, el ritmo VP8 configurable y el backend LiveKit/WB Stream son características exclusivas del modo sin interfaz gráfica.
Una ruta heredada basada en navegador (un unidor Android WebView contra un creador de escritorio Electron con hooks JS) todavía funciona para VK DC, pero es más lenta, no puede ofuscar y está siendo eliminada gradualmente. Las nuevas implementaciones deberían usar el modo sin interfaz gráfica.
Pion abre un SCTP DataChannel en el PC publicador y tuneliza TCP/UDP a través de él. Los frames pasan por el SFU de la plataforma como cualquier otra carga útil de DataChannel.
Unidor (censurado, Android/iOS/Linux) Creador (internet libre)
Todas las apps
|
VpnService (captura todo el tráfico)
|
tun2socks (IP -> TCP)
|
Proxy SOCKS5 (Go, :1080)
|
Unidor sin interfaz (Pion) Creador sin interfaz (Pion)
| |
DataChannel <------- SFU -------> DataChannel
|
Puente de retransmisión
|
Internet
La misma canalización que el modo DC, pero el túnel viaja sobre una pista de video VP8 publicada en lugar de un SCTP DataChannel. Útil cuando el SFU limita la tasa de DataChannels pero deja pasar RTP (p. ej. Telemost), y obligatorio en la plataforma en algunos casos (la pista del publicador de WB Stream siempre es video). El framing del túnel y la capa de multiplexación por encima son los mismos que en el modo DC.
El tráfico pasa por el SFU de la plataforma, que está en la lista blanca gubernamental. Para el DPI parece una videollamada normal.
relay/ - Retransmisión Go compartida por ambos extremos: proxy SOCKS5, infraestructura tun2socks, túnel DC/VP8, ofuscador ChaCha20, multiplexor de conexiones, bindings gomobile/iOSheadless/vk/ - Creador VK sin interfaz: crea o se une a una llamada mediante la API HTTP de VK, túnel Pion DC/VP8, sin navegadorheadless/telemost/ - Creador Telemost (Yandex) sin interfaz con el mismo modeloheadless/wbstream/ - Creador WB Stream sin interfaz (respaldado por LiveKit, tokens de invitado anónimos)headless/dion/ - Creador DION sin interfaz con el mismo modeloheadless/bitrix/ - Creador Bitrix sin interfaz (DC/VP8 adaptativo, unión como invitado)headless/wbstream-joiner/ - Unidor WB Stream de escritorio (contraparte del creador, usado para pruebas y clientes Linux)headless/telemost-joiner/ - Unidor Telemost de escritorio (contraparte del creador, usado para pruebas y clientes Linux)headless/dion-joiner/ - Unidor DION de escritorio (contraparte del creador, usado para pruebas y clientes Linux)headless/bitrix-joiner/ - Unidor Bitrix de escritorio (contraparte del creador, usado para pruebas y clientes Linux)Hay binarios precompilados disponibles en GitHub Releases.
Descarga y ejecuta la aplicación Electron desde GitHub Releases. Incluye la retransmisión Go automáticamente.
Importante: La llamada debe crearse desde dentro de la aplicación Creadora. Unirse a una llamada existente desde la aplicación no funcionará - los hooks JS deben estar presentes desde el momento en que comienza la llamada.
Hay tres formas disponibles; elige la que se adapte al dispositivo:
whitelist-bypass.apk desde Releases. Permite el aviso de VPN en el primer inicio. Pega el enlace de unión y toca GO; el tráfico de todo el sistema fluye a través de la llamada.whitelist-bypass-proxy.ipa desde Releases (instalación lateral mediante AltStore / Sideloadly / tu cuenta de desarrollador). Solo expone un proxy SOCKS5 local - sin VPN del sistema. Para proxyar todo el dispositivo, apunta cualquier aplicación VPN compatible con SOCKS5 (Shadowrocket, Streisand, ...) al endpoint SOCKS5 que muestra la aplicación; o configura el proxy por aplicación (Telegram tiene soporte integrado).--socks-user / --socks-pass habilitan la autenticación de usuario/contraseña 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]El paso a paso completo (en ruso) cubre cada plataforma en detalle: ver 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
Requiere Xcode y macOS. build-ios.sh toma un argumento, proxy o 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
El script compila Mobile.xcframework en el directorio de la aplicación, ejecuta el strip-signing.sh de la aplicación para eliminar el equipo de desarrollador del proyecto, compila la aplicación sin firmar y escribe un IPA sin firmar en prebuilts/.
Para ejecutarlo en un dispositivo, abre el .xcodeproj correspondiente en Xcode, configura tu equipo e identificadores de paquete únicos en Signing & Capabilities, y compila. La variante vpn requiere la capacidad Network Extension en sus identificadores de paquete.
Salida en prebuilts/:
Para compilar el proyecto usando Docker, ejecuta:
docker compose -f docker-build/docker-compose.yml up
Esto compilará todos los componentes (creator-app, headless, android app) en la carpeta prebuild (excepto el creador de macOS)
Creadores de Go puro que crean llamadas mediante API sin navegador. Sin Electron, sin hooks JS - Go Pion PeerConnection maneja el túnel DataChannel directamente.
./build-headless.sh
Se producen diez binarios - cinco creadores, cuatro unidores Linux y el bot 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>
Los cuatro creadores necesitan cookies exportadas desde la aplicación creadora de escritorio (botón Export Cookies) como JSON [{"name":"..","value":".."},...]. DION también acepta {"email":"..","password":"..","cookies":[]} y luego inicia sesión por su cuenta, ver docs/SETUP.md.
Por defecto, cada binario crea una llamada nueva. Para adjuntarse a una existente (reinicios del servidor sin invalidar el enlace, múltiples sesiones moldeadas, ...):
Mutuamente excluyente con los flags de creación de llamadas (--peer-id para VK; los demás no tienen flag de creación).
custom recurre a los valores predeterminados de unlimited para cualquier flag no establecido, por lo que las anulaciones parciales funcionan:
./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 - tamaño del búfer de lectura TCP/DC. Más pequeño = comprobaciones de contrapresión más frecuentes, memoria menos irregularmax-dc-buf - pausa las lecturas TCP cuando la cantidad almacenada en búfer del DataChannel supera este valor; solo conectado en VK (Pion BufferedAmountLowThreshold)mem-limit - límite de memoria suave del runtime de Go; hace que el GC sea más agresivo cerca del límite0xd986b7576340d8d7b04f806dfd38a182b19edf50 - USDC (ERC20)TTEo4XXTB6CqhEiKpyoncfk3skEvoq3bCP - USDT (TRC20)UQCZge2JzLmwNtI56p-ZxLuN2f7ZMCPGqO0XTt3wJ-cy8JaE - USDT (TON)headless/vk-bot/ - Bot VK Long Poll independiente que genera creadores sin interfaz bajo demanda y responde con el enlace de unión (alternativa del lado del servidor al bot de Electron)headless/tests/ - Pruebas en vivo de extremo a extremo (creador + unidores sobre un SFU real); ejecutar en el mismo host o en un entorno netns dockerizado, ver headless/tests/README.mdandroid-app/ - Unidor Android: VpnService + tun2socks + Pion sin interfaz (ruta principal); también conserva un respaldo WebView para el flujo heredado del navegadorios-proxy-app/ - Unidor iOS: SOCKS5 + Pion sin interfaz mediante el xcframework de gomobilecreator-app/ - Aplicación creadora de escritorio Electron: interfaz gráfica que puede ejecutar la ruta heredada del navegador o lanzar los binarios Go sin interfaz; adecuada tanto para uso interactivo como para implementacioneshooks/ - Hooks de JavaScript para la ruta heredada del navegador (modos DC y Video, VK y Telemost). El modo sin interfaz no usa hooks JS.| Archivo | Plataforma |
|---|
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 | Aplicación proxy iOS, sin firmar |
whitelist-bypass-vpn.ipa | Aplicación VPN iOS, sin firmar |
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 |
| Flag | VK | TM | WB | Descripción |
|---|
--cookies <path> | sí | sí | sí | ruta al JSON de cookies |
--cookie-string <str> | sí | sí | - | cadena de cookies sin procesar name=val; name=val |
--write-file <path> | sí | sí | sí | añade el enlace de unión activo a este archivo (un enlace por línea) |
--resources <mode> | sí | sí | sí | default / moderate / unlimited / custom (ver abajo) |
--read-buf <bytes> | sí | sí | sí | búfer de lectura DC/RTP; solo se consulta con --resources custom |
--max-dc-buf <bytes> | sí | - | - | BufferedAmountLowThreshold del DataChannel; solo con --resources custom |
--mem-limit <bytes> | sí | sí | sí | límite de memoria suave de Go (debug.SetMemoryLimit); solo con --resources custom |
| Creador | Flag | Valor |
|---|
| 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> o solo el UUID |
| DION | --room <id> | dion://<id> o https://dion.vc/event/<id> |
| Modo | 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 | desde --read-buf | desde --max-dc-buf | desde --mem-limit |