
Tunneling von Daten über WebRTC zur Umgehung der Zensur
Tunnelt Internetverkehr über Videoanrufplattformen (VK Call, Yandex Telemost, WB Stream), um die Whitelist-Zensur der Regierung zu umgehen.
Schritt-für-Schritt-Einrichtungsanleitung (auf Russisch): docs/SETUP.md
Es stehen zwei Tunnelmodi zur Verfügung: DC (DataChannel) und Video (VP8-Datenkodierung). Die empfohlene Einrichtung ist headless auf beiden Seiten – reines Go (Pion) spricht direkt mit dem SFU der Plattform, kein Browser. ChaCha20-Verschleierung, konfigurierbares VP8-Pacing und das LiveKit/WB-Stream-Backend sind reine Headless-Funktionen.
Ein Legacy-Browser-Pfad (Android-WebView-Joiner gegen einen Electron-Desktop-Creator mit JS-Hooks) funktioniert noch für VK DC, ist aber langsamer, kann nicht verschleiern und wird auslaufen gelassen. Neue Bereitstellungen sollten headless verwenden.
Pion öffnet einen SCTP-DataChannel auf dem Publisher-PC und tunnelt TCP/UDP darüber. Frames passieren den SFU der Plattform wie jede andere DataChannel-Nutzlast.
Joiner (zensiert, Android/iOS/Linux) Creator (freies Internet)
Alle Apps
|
VpnService (fängt den gesamten Verkehr ab)
|
tun2socks (IP -> TCP)
|
SOCKS5-Proxy (Go, :1080)
|
Headless-Joiner (Pion) Headless-Creator (Pion)
| |
DataChannel <------- SFU -------> DataChannel
|
Relay-Bridge
|
Internet
Dieselbe Pipeline wie im DC-Modus, aber der Tunnel reitet auf einem veröffentlichten VP8-Videotrack statt auf einem SCTP-DataChannel. Nützlich, wenn der SFU DataChannels rate-limitiert, aber RTP durchlässt (z. B. Telemost), und in manchen Fällen plattformbedingt erforderlich (der Publisher-Track von WB Stream ist immer Video). Tunnel-Framing und die Multiplex-Schicht darüber sind dieselben wie im DC-Modus.
Der Verkehr läuft über den SFU der Plattform, der auf der Whitelist der Regierung steht. Für DPI sieht es wie ein normaler Videoanruf aus.
relay/ – Go-Relay, das von beiden Seiten gemeinsam genutzt wird: SOCKS5-Proxy, tun2socks-Anbindung, DC/VP8-Tunnel, ChaCha20-Obfuscator, Verbindungsmultiplexer, gomobile/iOS-Bindingsheadless/vk/ – Headless-VK-Creator: erstellt oder tritt einem Anruf über die VK-HTTP-API bei, Pion-DC/VP8-Tunnel, kein Browserheadless/telemost/ – Headless-Telemost-Creator (Yandex) mit demselben Modellheadless/wbstream/ – Headless-WB-Stream-Creator (LiveKit-gestützt, anonyme Gast-Token)headless/dion/ – Headless-DION-Creator mit demselben Modellheadless/bitrix/ – Headless-Bitrix-Creator (adaptives DC/VP8, Gast-Beitritt)headless/wbstream-joiner/ – Desktop-WB-Stream-Joiner (Gegenstück zum Creator, verwendet für Tests und Linux-Clients)headless/telemost-joiner/ – Desktop-Telemost-Joiner (Gegenstück zum Creator, verwendet für Tests und Linux-Clients)headless/dion-joiner/ – Desktop-DION-Joiner (Gegenstück zum Creator, verwendet für Tests und Linux-Clients)headless/bitrix-joiner/ – Desktop-Bitrix-Joiner (Gegenstück zum Creator, verwendet für Tests und Linux-Clients)Vorgefertigte Binaries sind auf GitHub Releases verfügbar.
Laden Sie die Electron-App von GitHub Releases herunter und führen Sie sie aus. Sie bündelt das Go-Relay automatisch.
Wichtig: Der Anruf muss aus der Creator-App heraus erstellt werden. Einem bestehenden Anruf aus der App beizutreten wird nicht funktionieren – die JS-Hooks müssen ab dem Moment vorhanden sein, in dem der Anruf startet.
Es stehen drei Formen zur Verfügung; wählen Sie diejenige, die zum Gerät passt:
whitelist-bypass.apk von Releases. Erlauben Sie die VPN-Abfrage beim ersten Start. Fügen Sie den Beitrittslink ein und tippen Sie auf GO; der systemweite Verkehr fließt durch den Anruf.whitelist-bypass-proxy.ipa von Releases (Sideload über AltStore / Sideloadly / Ihr Entwicklerkonto). Stellt nur einen lokalen SOCKS5-Proxy bereit – kein System-VPN. Um das gesamte Gerät zu proxyen, richten Sie eine beliebige SOCKS5-fähige VPN-App (Shadowrocket, Streisand, ...) auf den SOCKS5-Endpunkt, den die App anzeigt; oder legen Sie den Proxy pro App fest (Telegram hat integrierte Unterstützung).--socks-user / --socks-pass die SOCKS5-Benutzername/Passwort-Authentifizierung.
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]Die vollständige Schritt-für-Schritt-Anleitung (Russisch) behandelt jede Plattform im Detail: siehe 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
Erfordert Xcode und macOS. build-ios.sh nimmt ein Argument, proxy oder 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
Das Skript baut Mobile.xcframework in das App-Verzeichnis, führt das strip-signing.sh der App aus, um das Entwicklerteam aus dem Projekt zu entfernen, baut die App unsigniert und schreibt eine unsignierte IPA nach prebuilts/.
Um auf einem Gerät auszuführen, öffnen Sie das passende .xcodeproj in Xcode, legen Sie Ihr Team und eindeutige Bundle-Identifier in Signing & Capabilities fest und bauen Sie. Die vpn-Variante erfordert die Network-Extension-Fähigkeit für ihre Bundle-Identifier.
Ausgabe in prebuilts/:
Um das Projekt mit Docker zu bauen, führen Sie aus:
docker compose -f docker-build/docker-compose.yml up
Dies baut alle Komponenten (creator-app, headless, Android-App) in den Ordner prebuild (außer dem macOS-Creator)
Reine Go-Creator, die Anrufe über die API ohne Browser erstellen. Kein Electron, keine JS-Hooks – Go Pion PeerConnection übernimmt den DataChannel-Tunnel direkt.
./build-headless.sh
Es werden zehn Binaries erzeugt – fünf Creator, vier Linux-Joiner und der VK-Bot:
./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>
Alle vier Creator benötigen Cookies, die aus der Desktop-Creator-App exportiert wurden (Schaltfläche Export Cookies), als JSON [{"name":"..","value":".."},...]. DION akzeptiert auch {"email":"..","password":"..","cookies":[]} und meldet sich dann selbst an, siehe docs/SETUP.md.
Standardmäßig erstellt jedes Binary einen frischen Anruf. Um sich an einen bestehenden anzuhängen (Server-Neustarts ohne Ungültigmachen des Links, mehrere geformte Sitzungen, ...):
Gegenseitig ausschließend mit den Anruferstellungs-Flags (--peer-id für VK; die anderen haben kein Erstellungs-Flag).
custom fällt für jedes nicht gesetzte Flag auf die unlimited-Standardwerte zurück, sodass teilweise Überschreibungen funktionieren:
./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-Lesepuffergröße. Kleiner = häufigere Backpressure-Prüfungen, weniger bursty Speichermax-dc-buf – pausiert TCP-Lesevorgänge, wenn die gepufferte DataChannel-Menge dies überschreitet; nur in VK verdrahtet (Pion BufferedAmountLowThreshold)mem-limit – Go-Runtime-Soft-Speicherlimit; macht GC nahe der Obergrenze aggressiver0xd986b7576340d8d7b04f806dfd38a182b19edf50 – USDC (ERC20)TTEo4XXTB6CqhEiKpyoncfk3skEvoq3bCP – USDT (TRC20)UQCZge2JzLmwNtI56p-ZxLuN2f7ZMCPGqO0XTt3wJ-cy8JaE – USDT (TON)headless/vk-bot/ – Eigenständiger VK-Long-Poll-Bot, der bei Bedarf Headless-Creator startet und mit dem Beitrittslink antwortet (serverseitige Alternative zum Electron-Bot)headless/tests/ – Live-End-to-End-Tests (Creator + Joiner über einen echten SFU); auf demselben Host oder in einem dockerisierten netns-Stand ausführen, siehe headless/tests/README.mdandroid-app/ – Android-Joiner: VpnService + tun2socks + Headless-Pion (primärer Pfad); behält außerdem einen WebView-Fallback für den Legacy-Browser-Ablaufios-proxy-app/ – iOS-Joiner: SOCKS5 + Headless-Pion über das gomobile-xcframeworkcreator-app/ – Electron-Desktop-Creator-App: GUI-Frontend, das entweder den Legacy-Browser-Pfad ausführen oder die Headless-Go-Binaries starten kann; geeignet sowohl für interaktive Nutzung als auch für Bereitstellungenhooks/ – JavaScript-Hooks für den Legacy-Browser-Pfad (DC- und Video-Modus, VK und Telemost). Headless verwendet keine JS-Hooks.headless-bitrix-joiner --link <link> --socks-port 1080 [--socks-user u --socks-pass p]| Datei | Plattform |
|---|
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, unsigniert |
whitelist-bypass-vpn.ipa | iOS-VPN-App, unsigniert |
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 | Beschreibung |
|---|
--cookies <path> | ja | ja | ja | Pfad zur Cookies-JSON |
--cookie-string <str> | ja | ja | - | roher Cookie-String name=val; name=val |
--write-file <path> | ja | ja | ja | den aktiven Beitrittslink an diese Datei anhängen (ein Link pro Zeile) |
--resources <mode> | ja | ja | ja | default / moderate / unlimited / custom (siehe unten) |
--read-buf <bytes> | ja | ja | ja | DC/RTP-Lesepuffer; wird nur mit --resources custom berücksichtigt |
--max-dc-buf <bytes> | ja | - | - | DataChannel BufferedAmountLowThreshold; nur mit --resources custom |
--mem-limit <bytes> | ja | ja | ja | Go-Soft-Speicherlimit (debug.SetMemoryLimit); nur mit --resources custom |
| Creator | Flag | Wert |
|---|
| 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> oder nur die UUID |
| DION | --room <id> | dion://<id> oder https://dion.vc/event/<id> |
| Modus | 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 | aus --read-buf | aus --max-dc-buf | aus --mem-limit |