
SOCKS5-Proxy, der durch Cloudflare R2-Objektspeicher getunnelt wird, mit Python- und abhängigkeitsfreien C++-Agenten, die TCP-Verkehr über verschlüsselte R2-Objekte für verdeckten Zugriff weiterleiten.
SOCKS5-Proxy, der durch Cloudflare R2-Buckets getunnelt wird.
[Client App] ◄─SOCKS5─► [Proxy] ◄─── R2 Bucket ───► [Agent] ◄─TCP─► [Target]
Der Proxy betreibt einen lokalen SOCKS5-Server auf dem Rechner des Operators. Jede CONNECT-Anfrage wird als binäres Paket serialisiert und als R2-Objekt gespeichert. Der Agent fragt denselben Bucket aus dem Zielnetzwerk ab, nimmt Verbindungsanfragen entgegen, stellt echte TCP-Verbindungen her und leitet Daten über R2 zurück.
| Komponente | Sprache | Datei | Beschreibung |
|---|---|---|---|
| Proxy | Python | r2socks.py | SOCKS5-Server (Operator-Seite) |
| Agent | Python | r2socks.py | Relay auf Zielseite (Agent-Modus) |
| Agent | C++ | r2agent.cpp | Eigenständiger Windows-Agent, keine Abhängigkeiten |
Der C++-Agent ist protokollkompatibel mit dem Python-Proxy. Er verwendet ausschließlich Windows-native APIs (WinHTTP, bcrypt, Winsock2) – keine externen Bibliotheken erforderlich.
dash.cloudflare.com/<ACCOUNT_ID>/r2/...pip install boto3
python r2socks.py proxy -b my-bucket -a <account_id> \
--access-key <R2_ACCESS_KEY> --secret-key <R2_SECRET_KEY>
Der Proxy generiert eine Channel-ID und gibt den Befehl zum Starten des Agents aus.
Python-Agent:
python r2socks.py agent -b my-bucket -a <account_id> -c <channel_id> \
--access-key <R2_ACCESS_KEY> --secret-key <R2_SECRET_KEY>
C++-Agent (Windows):
.\r2agent.exe -b my-bucket -a <account_id> -c <channel_id> -k <access_key> -s <secret_key>
python r2socks.py proxy [options]
Required:
-b, --bucket BUCKET R2 bucket name
-a, --account-id ID Cloudflare account ID
Optional:
-c, --channel ID Channel ID (auto-generated if omitted)
-l, --listen ADDR Listen address (default: 127.0.0.1:1080)
--access-key KEY R2 API token Access Key ID
--secret-key KEY R2 API token Secret Access Key
--socks-user USER Enable SOCKS5 user/pass authentication
--socks-pass PASS SOCKS5 password
-p, --password PWD AES-256-GCM encryption password
-v, --verbose Debug logging
Python:
python r2socks.py agent [options]
Required:
-b, --bucket BUCKET R2 bucket name
-a, --account-id ID Cloudflare account ID
-c, --channel ID Channel ID (from proxy output)
C++ (Windows):
r2agent.exe [options]
Required:
-b, --bucket BUCKET R2 bucket name
-a, --account-id ID Cloudflare account ID
-c, --channel ID Channel ID (from proxy output)
Credentials (flags override env vars):
-k, --access-key KEY R2 API token Access Key ID
-s, --secret-key KEY R2 API token Secret Access Key
Optional:
-v, --verbose Debug logging
Alle R2-Objekte eines Channels entfernen, wenn fertig:
python r2socks.py clean -b my-bucket -a <account_id> -c <channel_id>
Binäres Paketformat, das zwischen Proxy und Agent verwendet wird:
┌──────────┬────────────────────┬────────────┬──────────────────┐
│ CMD (1B) │ ConnectionID (16B) │ Len (4B BE)│ Payload (var) │
└──────────┴────────────────────┴────────────┴──────────────────┘
Mehrere Pakete werden zu einem einzigen R2-Objekt gebündelt (bis zu 4MB), um API-Aufrufe zu reduzieren. Objekte werden mit Mikrosekunden-Zeitstempeln benannt, um die Reihenfolge zu gewährleisten, und nach dem Verbrauch gelöscht.
Optionale AES-256-GCM-Verschlüsselung für alle R2-Payloads:
pip install cryptography
# Both sides must use the same password
python r2socks.py proxy -b bucket -a account_id -p "my-secret-password"
python r2socks.py agent -b bucket -a account_id -c channel -p "my-secret-password"
Der Schlüssel wird mit PBKDF2-SHA256 mit 600.000 Iterationen abgeleitet.
Aus einer Visual Studio Developer Command Prompt:
cl /std:c++17 /EHsc /O2 r2agent.cpp /link ws2_32.lib winhttp.lib bcrypt.lib
Sowohl Proxy als auch Agent verwenden adaptive Schlafintervalle:
Dies balanciert Reaktionsfähigkeit gegen API-Aufrufvolumen. Statistiken werden alle 30 Sekunden protokolliert und zeigen aktive Verbindungen, übertragene Objekte und bewegte Bytes.
SignatureDoesNotMatchw32tm /resync /force (Windows) oder sudo ntpdate pool.ntp.org (Linux)RequestTimeTooSkewedw32tm /resync /force
AccessDeniedProxy (Python):
boto3 (erforderlich)cryptography (optional, für Verschlüsselung)Agent (C++):
| Befehl | Code | Richtung | Payload |
|---|
| NEW | 0x01 | Proxy→Agent | ATYP + Address + Port |
| ACK | 0x02 | Agent→Proxy | 1 byte status (0=success) |
| DATA | 0x03 | Bidirektional | Raw TCP data (up to 1MB) |
| CLOSE | 0x04 | Bidirektional | Empty |
| PING | 0x05 | Bidirektional | Empty |