Zpět na domů

SOCKS5 přes WebRTC TURN: Implementace v Go

Nástroj maskuje SOCKS5 provoz jako WebRTC videokonferenci WB Stream. Reverzní API, minimální protobuf parser, KCP přes TURN-relay s yamux. Plná automatizace v čistém Go.

Tunel SOCKS5 ve videokonferencích: úplný rozbor
Advertisement 728x90

SOCKS5 tunel přes WebRTC TURN Wildberries: implementace v Go

Vyvinutý nástroj pro skrytí SOCKS5 provozu uvnitř WebRTC TURN sezení platformy WB Stream. Provoz je maskován jako videokonference pomocí LiveKit SFU. Kompletní cyklus: reverzní HTTP API, parsování protobuf, KCP přes TURN-relay, yamux multiplexování. Funguje bez prohlížeče, s jedním spouštěcím příkazem.

Reverzní inženýrství API stream.wb.ru

Zachytávání provozu přes puppeteer ukázalo sekvenci čtyř HTTP požadavků a WebSocket připojení. Hlavní stránka blokuje požadavky bez prohlížeče (kód 498), ale API koncové body jsou dostupné.

Sekvence:

Google AdInline article slot
  • POST /auth/api/v1/auth/user/guest-register — JWT token hosta s displayName.
  • POST /api-room/api/v2/room — vytvoření místnosti s roomType: ROOM_TYPE_ALL_ON_SCREEN, roomPrivacy: ROOM_PRIVACY_FREE.
  • POST /api-room/api/v1/room/{id}/join — vstup (GET vrací 501).
  • GET /api-room-manager/api/v1/room/{id}/token — LiveKit token (zohlednit gzip v Accept-Encoding).

WebSocket: wss://wbstream01-el.wb.ru:7880/rtc?access_token=...&sdk=js&version=2.15.3&protocol=16. ICE servery: turn:wb-stream-turn-1.wb.ru:3478.

Implementováno na net/http bez cookies/CSRF.

rr, _ := wb(cl, "POST", "/auth/api/v1/auth/user/guest-register",
    []byte(`{"displayName":"lh_42"}`), "")

Parser protobuf pro LiveKit SignalResponse

LiveKit přenáší ICE servery v SignalResponse > JoinResponse > ICEServer (fields 1>5/9). Plný google.golang.org/protobuf je nadbytečný — napsán minimální parser na 40 řádků.

Google AdInline article slot

Varint dekódování:

func pbVar(d []byte, o int) (uint64, int) {
    var v uint64
    for s := 0; o < len(d) && s < 64; s += 7 {
        b := d[o]; o++
        v |= uint64(b&0x7f) << s
        if b < 0x80 { return v, o }
    }
    return 0, o
}

Extrakce length-delimited polí:

func pbAll(d []byte, f uint64) (r [][]byte) {
    for o := 0; o < len(d); {
        t, n := pbVar(d, o)
        if n == o { break }
        o = n
        switch t & 7 {
        case 2:
            l, n := pbVar(d, o); o = n
            e := o + int(l)
            if e > len(d) || e < o { return }
            if t>>3 == f { r = append(r, d[o:e]) }
            o = e
        // ...
        }
    }
    return
}

Parser hledá ICE servery ve field 5 (WB fork) a 9 (standard), extrahuje urls, username, credential.

Google AdInline article slot

Architektura tunelu: KCP + TURN + yamux

TCP od SOCKS5 → yamux-stream → KCP (AES-256) → TURN-relay → VPS → internet.

Klíčové komponenty:

  • TURN-allocate přes pion/turn: tc.Allocate() vrací net.PacketConn.
  • KCP přes relay: kcp.NewConn(peerVPS, blk, 10, 3, relay).
  • Yamux pro multiplexování streamů.
  • SOCKS5-server na VPS.
uc, _ := net.ListenUDP("udp", nil)
tc, _ := turn.NewClient(&turn.ClientConfig{...})
relay, _ := tc.Allocate()
kc, _ := kcp.NewConn(peerVPS, blk, 10, 3, relay)

Server: KCP-listener + yamux-server + SOCKS5.

Automatizace a odolnost proti selhání

  • Smart-klíč: base64(IP|SHA256(password)).
  • Připojení: yamux ping/15s, backoff 2-60s, cache TURN creds 5min.
  • Samovyčištění: pgrep + kill předchozích instancí, systemd přepsání.
  • Graceful shutdown: Ctrl+C → 2s cleanup.

Spuštění a omezení

go build -o lionheart .
# Server
./lionheart  # zkopírujte klíč
# Klient
./lionheart  # vložte klíč → 127.0.0.1:1080

Omezení: závislost na WB Stream API, hardcoded wbstream01-el.wb.ru. Plány: gomobile pro Android/iOS (VpnService/NEPacketTunnelProvider).

Co je důležité

  • Maskování jako WebRTC provoz DPI/firewally na gigabitech.
  • Minimální protobuf-parser bez závislostí.
  • TURN-relay jako net.PacketConn pro KCP.
  • Kompletní automatizace bez prohlížeče/API klíčů.
  • Čisté Go, gomobile-ready.

— Editorial Team

Advertisement 728x90

Číst dál