
Tunnellisation de données via WebRTC pour contourner la censure
Fait passer le trafic internet par des plateformes d'appels vidéo (VK Call, Yandex Telemost, WB Stream) pour contourner la censure par liste blanche gouvernementale.
Guide d'installation pas à pas (en russe) : docs/SETUP.md
Deux modes de tunnel sont disponibles : DC (DataChannel) et Video (encodage de données VP8). La configuration recommandée est headless aux deux extrémités - du Go pur (Pion) dialogue directement avec le SFU de la plateforme, sans navigateur. L'obfuscation ChaCha20, le pacing VP8 configurable et le backend LiveKit/WB Stream sont des fonctionnalités réservées au mode headless.
Un chemin navigateur hérité (un joiner Android WebView face à un créateur desktop Electron avec des hooks JS) fonctionne encore pour VK DC, mais il est plus lent, ne peut pas obfusquer, et est en cours d'abandon. Les nouveaux déploiements devraient utiliser le mode headless.
Pion ouvre un DataChannel SCTP sur le PC publisher et y tunnelise TCP/UDP. Les trames traversent le SFU de la plateforme comme n'importe quelle autre charge utile 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
Même pipeline que le mode DC, mais le tunnel passe par une piste vidéo VP8 publiée au lieu d'un DataChannel SCTP. Utile lorsque le SFU limite le débit des DataChannels mais laisse passer le RTP (par ex. Telemost), et obligatoire sur certaines plateformes (la piste publisher de WB Stream est toujours de la vidéo). Le framing du tunnel et la couche de multiplexage au-dessus sont identiques au mode DC.
Le trafic passe par le SFU de la plateforme, qui figure sur la liste blanche gouvernementale. Pour la DPI, cela ressemble à un appel vidéo normal.
relay/ - relais Go partagé par les deux extrémités : proxy SOCKS5, plomberie tun2socks, tunnel DC/VP8, obfuscateur ChaCha20, multiplexeur de connexions, bindings gomobile/iOSheadless/vk/ - créateur VK headless : crée ou rejoint un appel via l'API HTTP VK, tunnel Pion DC/VP8, sans navigateurheadless/telemost/ - créateur Telemost (Yandex) headless avec le même modèleheadless/wbstream/ - créateur WB Stream headless (basé sur LiveKit, jetons invités anonymes)headless/dion/ - créateur DION headless avec le même modèleheadless/bitrix/ - créateur Bitrix headless (DC/VP8 adaptatif, jonction invité)headless/wbstream-joiner/ - joiner WB Stream desktop (homologue du créateur, utilisé pour les tests et les clients Linux)headless/telemost-joiner/ - joiner Telemost desktop (homologue du créateur, utilisé pour les tests et les clients Linux)headless/dion-joiner/ - joiner DION desktop (homologue du créateur, utilisé pour les tests et les clients Linux)headless/bitrix-joiner/ - joiner Bitrix desktop (homologue du créateur, utilisé pour les tests et les clients Linux)Des binaires précompilés sont disponibles sur GitHub Releases.
Téléchargez et lancez l'application Electron depuis GitHub Releases. Elle embarque automatiquement le relais Go.
Important : l'appel doit être créé depuis l'application Creator. Rejoindre un appel existant depuis l'application ne fonctionnera pas - les hooks JS doivent être présents dès le début de l'appel.
Trois formes sont disponibles ; choisissez celle qui convient à l'appareil :
whitelist-bypass.apk depuis Releases. Autorisez l'invite VPN au premier lancement. Collez le lien de jonction et appuyez sur GO ; le trafic à l'échelle du système passe par l'appel.whitelist-bypass-proxy.ipa depuis Releases (sideload via AltStore / Sideloadly / votre compte développeur). Expose uniquement un proxy SOCKS5 local - pas de VPN système. Pour proxyfier tout l'appareil, pointez n'importe quelle application VPN compatible SOCKS5 (Shadowrocket, Streisand, ...) vers le point de terminaison SOCKS5 affiché par l'application ; ou configurez le proxy par application (Telegram le prend en charge nativement).--socks-user / --socks-pass activent l'authentification SOCKS5 par nom d'utilisateur/mot de passe.
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]Le guide complet pas à pas (en russe) couvre chaque plateforme en détail : voir 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
Nécessite Xcode et macOS. build-ios.sh prend un argument, proxy ou 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
Le script compile Mobile.xcframework dans le répertoire de l'application, exécute le strip-signing.sh de l'application pour retirer l'équipe de développement du projet, compile l'application non signée, et écrit une IPA non signée dans prebuilts/.
Pour l'exécuter sur un appareil, ouvrez le .xcodeproj correspondant dans Xcode, définissez votre équipe et des identifiants de bundle uniques dans Signing & Capabilities, puis compilez. La variante vpn nécessite la capacité Network Extension sur ses identifiants de bundle.
Sortie dans prebuilts/ :
Pour compiler le projet avec Docker, exécutez :
docker compose -f docker-build/docker-compose.yml up
Cela compilera tous les composants (creator-app, headless, application Android) dans le dossier prebuild (sauf le créateur macOS)
Créateurs en Go pur qui créent des appels via l'API sans navigateur. Pas d'Electron, pas de hooks JS - Go Pion PeerConnection gère directement le tunnel DataChannel.
./build-headless.sh
Dix binaires sont produits - cinq créateurs, quatre joiners Linux, et le 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>
Les quatre créateurs nécessitent des cookies exportés depuis l'application créateur desktop (bouton Export Cookies) au format JSON [{"name":"..","value":".."},...]. DION accepte aussi {"email":"..","password":"..","cookies":[]} et se connecte alors de lui-même, voir docs/SETUP.md.
Par défaut, chaque binaire crée un nouvel appel. Pour s'attacher à un appel existant (redémarrages de serveur sans invalider le lien, sessions multiples façonnées, ...) :
Mutuelllement exclusif avec les options de création d'appel (--peer-id pour VK ; les autres n'ont pas d'option de création).
custom retombe sur les valeurs par défaut de unlimited pour toute option non définie, donc les surcharges partielles fonctionnent :
./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 - taille du tampon de lecture TCP/DC. Plus petit = vérifications de contre-pression plus fréquentes, mémoire moins en rafalesmax-dc-buf - met en pause les lectures TCP lorsque la quantité bufferisée du DataChannel dépasse cette valeur ; câblé uniquement dans VK (Pion BufferedAmountLowThreshold)mem-limit - limite mémoire souple du runtime Go ; rend le GC plus agressif près du plafond0xd986b7576340d8d7b04f806dfd38a182b19edf50 - USDC (ERC20)TTEo4XXTB6CqhEiKpyoncfk3skEvoq3bCP - USDT (TRC20)UQCZge2JzLmwNtI56p-ZxLuN2f7ZMCPGqO0XTt3wJ-cy8JaE - USDT (TON)headless/vk-bot/ - bot VK Long Poll autonome qui lance des créateurs headless à la demande et répond avec le lien de jonction (alternative côté serveur au bot Electron)headless/tests/ - tests end-to-end en direct (créateur + joiners via un vrai SFU) ; à exécuter sur la même machine ou dans un banc netns Dockerisé, voir headless/tests/README.mdandroid-app/ - joiner Android : VpnService + tun2socks + Pion headless (chemin principal) ; conserve aussi un fallback WebView pour le flux navigateur héritéios-proxy-app/ - joiner iOS : SOCKS5 + Pion headless via le xcframework gomobilecreator-app/ - application créateur desktop Electron : front-end GUI pouvant exécuter soit le chemin navigateur hérité, soit lancer les binaires Go headless ; adaptée à la fois à l'usage interactif et aux déploiementshooks/ - hooks JavaScript pour le chemin navigateur hérité (modes DC et Video, VK et Telemost). Le mode headless n'utilise pas de hooks JS.headless-bitrix-joiner --link <link> --socks-port 1080 [--socks-user u --socks-pass p]| Fichier | Plateforme |
|---|
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 |
| Option | VK | TM | WB | Description |
|---|
--cookies <path> | yes | yes | yes | chemin vers le JSON de cookies |
--cookie-string <str> | yes | yes | - | chaîne de cookies brute name=val; name=val |
--write-file <path> | yes | yes | yes | ajoute le lien de jonction actif à ce fichier (un lien par ligne) |
--resources <mode> | yes | yes | yes | default / moderate / unlimited / custom (voir ci-dessous) |
--read-buf <bytes> | yes | yes | yes | tampon de lecture DC/RTP ; consulté uniquement avec --resources custom |
--max-dc-buf <bytes> | yes | - | - | BufferedAmountLowThreshold du DataChannel ; uniquement avec --resources custom |
--mem-limit <bytes> | yes | yes | yes | limite mémoire souple de Go (debug.SetMemoryLimit) ; uniquement avec --resources custom |
| Créateur | Option | Valeur |
|---|
| 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> ou juste l'UUID |
| DION | --room <id> | dion://<id> ou https://dion.vc/event/<id> |
| Mode | 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 | depuis --read-buf | depuis --max-dc-buf | depuis --mem-limit |