
Proxy SOCKS5 tunelado através do armazenamento de objetos Cloudflare R2, com agentes em Python e C++ sem dependências retransmitindo tráfego TCP via objetos R2 criptografados para acesso encoberto.
Túnel de proxy SOCKS5 através de buckets do Cloudflare R2.
[Aplicativo Cliente] ◄─SOCKS5─► [Proxy] ◄─── Bucket R2 ───► [Agente] ◄─TCP─► [Alvo]
O proxy executa um servidor SOCKS5 local na máquina do operador. Cada requisição CONNECT é serializada como pacotes binários e armazenada como objetos R2. O agente consulta o mesmo bucket a partir da rede de destino, captura as requisições de conexão, estabelece conexões TCP reais e retransmite os dados de volta através do R2.
| Componente | Linguagem | Arquivo | Descrição |
|---|---|---|---|
| Proxy | Python | r2socks.py | Servidor SOCKS5 (lado do operador) |
| Agente | Python | r2socks.py | Retransmissor do lado do alvo (modo agente) |
| Agente | C++ | r2agent.cpp | Agente Windows autônomo, sem dependências |
O agente em C++ é compatível em protocolo com o proxy em Python. Ele usa apenas APIs nativas do Windows (WinHTTP, bcrypt, Winsock2) sem necessidade de bibliotecas externas.
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>
O proxy gera um ID de canal e imprime o comando para iniciar o agente.
Agente Python:
python r2socks.py agent -b my-bucket -a <account_id> -c <channel_id> \
--access-key <R2_ACCESS_KEY> --secret-key <R2_SECRET_KEY>
Agente 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
Remova todos os objetos R2 de um canal quando terminar:
python r2socks.py clean -b my-bucket -a <account_id> -c <channel_id>
Formato de pacote binário compartilhado entre proxy e agente:
┌──────────┬────────────────────┬────────────┬──────────────────┐
│ CMD (1B) │ ConnectionID (16B) │ Len (4B BE)│ Payload (var) │
└──────────┴────────────────────┴────────────┴──────────────────┘
Vários pacotes são agrupados em um único objeto R2 (até 4MB) para reduzir chamadas de API. Os objetos são nomeados com timestamps em microssegundos para ordenação e excluídos após o consumo.
Criptografia AES-256-GCM opcional para todos os payloads do 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"
A chave é derivada usando PBKDF2-SHA256 com 600.000 iterações.
A partir de um Prompt de Comando do Desenvolvedor do Visual Studio:
cl /std:c++17 /EHsc /O2 r2agent.cpp /link ws2_32.lib winhttp.lib bcrypt.lib
Tanto o proxy quanto o agente usam intervalos de espera adaptativos:
Isso equilibra a capacidade de resposta com o volume de chamadas de API. As estatísticas são registradas a cada 30 segundos, mostrando conexões ativas, objetos transferidos e bytes movimentados.
SignatureDoesNotMatchw32tm /resync /force (Windows) ou sudo ntpdate pool.ntp.org (Linux)RequestTimeTooSkewedw32tm /resync /force
AccessDeniedProxy (Python):
boto3 (obrigatório)cryptography (opcional, para criptografia)Agente (C++):
| Comando | Código | Direção | 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 |