
Proxy SOCKS5 tunnellisé via le stockage objet Cloudflare R2, avec des agents Python et C++ sans dépendances relayant le trafic TCP via des objets R2 chiffrés pour un accès dissimulé.
Tunnel proxy SOCKS5 acheminé via des buckets Cloudflare R2.
[Client App] ◄─SOCKS5─► [Proxy] ◄─── R2 Bucket ───► [Agent] ◄─TCP─► [Target]
Le proxy exécute un serveur SOCKS5 local sur la machine de l'opérateur. Chaque requête CONNECT est sérialisée sous forme de paquets binaires et stockée en tant qu'objets R2. L'agent interroge le même bucket depuis le réseau cible, récupère les demandes de connexion, établit de véritables connexions TCP et relaie les données via R2.
| Composant | Langage | Fichier | Description |
|---|---|---|---|
| Proxy | Python | r2socks.py | Serveur SOCKS5 (côté opérateur) |
| Agent | Python | r2socks.py | Relais côté cible (mode agent) |
| Agent | C++ | r2agent.cpp | Agent Windows autonome, zéro dépendance |
L'agent C++ est compatible au niveau du protocole avec le proxy Python. Il utilise uniquement des API natives Windows (WinHTTP, bcrypt, Winsock2), aucune bibliothèque externe requise.
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>
Le proxy génère un channel ID et affiche la commande pour démarrer l'agent.
Agent Python :
python r2socks.py agent -b my-bucket -a <account_id> -c <channel_id> \
--access-key <R2_ACCESS_KEY> --secret-key <R2_SECRET_KEY>
Agent C++ (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
Supprimez tous les objets R2 d'un channel une fois terminé :
python r2socks.py clean -b my-bucket -a <account_id> -c <channel_id>
Format de paquet binaire partagé entre le proxy et l'agent :
┌──────────┬────────────────────┬────────────┬──────────────────┐
│ CMD (1B) │ ConnectionID (16B) │ Len (4B BE)│ Payload (var) │
└──────────┴────────────────────┴────────────┴──────────────────┘
Plusieurs paquets sont regroupés en un seul objet R2 (jusqu'à 4 Mo) afin de réduire les appels API. Les objets sont nommés avec des horodatages à la microseconde pour l'ordonnancement et supprimés après consommation.
Chiffrement AES-256-GCM optionnel pour toutes les charges utiles R2 :
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"
La clé est dérivée à l'aide de PBKDF2-SHA256 avec 600 000 itérations.
Depuis un Visual Studio Developer Command Prompt :
cl /std:c++17 /EHsc /O2 r2agent.cpp /link ws2_32.lib winhttp.lib bcrypt.lib
Le proxy et l'agent utilisent des intervalles de veille adaptatifs :
Cela équilibre la réactivité par rapport au volume d'appels API. Les statistiques sont journalisées toutes les 30 secondes, affichant les connexions actives, les objets transférés et les octets déplacés.
SignatureDoesNotMatchw32tm /resync /force (Windows) ou sudo ntpdate pool.ntp.org (Linux)RequestTimeTooSkewedw32tm /resync /force
AccessDeniedProxy (Python) :
boto3 (requis)cryptography (optionnel, pour le chiffrement)Agent (C++) :
| Commande | Code | Direction | Payload |
|---|
| NEW | 0x01 | Proxy→Agent | ATYP + Address + Port |
| ACK | 0x02 | Agent→Proxy | 1 byte status (0=success) |
| DATA | 0x03 | Bidirectional | Raw TCP data (up to 1MB) |
| CLOSE | 0x04 | Bidirectional | Empty |
| PING | 0x05 | Bidirectional | Empty |