
نفق وكيل SOCKS5 عبر تخزين كائنات Cloudflare R2، مع وكلاء Python وC++ بدون تبعيات يقومون بتمرير حركة TCP عبر كائنات R2 المشفرة للوصول الخفي.
نفق وكيل SOCKS5 عبر حاويات Cloudflare R2.
[Client App] ◄─SOCKS5─► [Proxy] ◄─── R2 Bucket ───► [Agent] ◄─TCP─► [Target]
يشغّل الوكيل خادم SOCKS5 محليًا على جهاز المشغّل. يتم تسلسل كل طلب CONNECT كحزم ثنائية وتخزينها ككائنات R2. يستطلع الوكيل (agent) نفس الحاوية من الشبكة الهدف، ويلتقط طلبات الاتصال، ويُنشئ اتصالات TCP حقيقية، ويعيد توجيه البيانات عبر R2.
| المكوّن | اللغة | الملف | الوصف |
|---|---|---|---|
| Proxy | Python | r2socks.py | خادم SOCKS5 (جانب المشغّل) |
| Agent | Python | r2socks.py | مرحّل الجانب الهدف (وضع الوكيل) |
| Agent | C++ | r2agent.cpp | وكيل Windows مستقل، بدون أي تبعيات |
الوكيل المكتوب بلغة C++ متوافق بروتوكوليًا مع وكيل Python. يستخدم فقط واجهات Windows الأصلية (WinHTTP، bcrypt، Winsock2) دون الحاجة إلى مكتبات خارجية.
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>
يولّد الوكيل معرّف قناة (channel ID) ويطبع الأمر لتشغيل الوكيل (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>
وكيل 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
أزل جميع كائنات R2 من قناة عند الانتهاء:
python r2socks.py clean -b my-bucket -a <account_id> -c <channel_id>
تنسيق الحزمة الثنائية المشترك بين الوكيل والوكيل (agent):
┌──────────┬────────────────────┬────────────┬──────────────────┐
│ CMD (1B) │ ConnectionID (16B) │ Len (4B BE)│ Payload (var) │
└──────────┴────────────────────┴────────────┴──────────────────┘
يتم تجميع حزم متعددة في كائن R2 واحد (حتى 4MB) لتقليل استدعاءات API. تُسمّى الكائنات بطوابع زمنية بالميكروثانية للترتيب وتُحذف بعد الاستهلاك.
تشفير AES-256-GCM اختياري لجميع حمولات 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"
يُشتق المفتاح باستخدام PBKDF2-SHA256 مع 600,000 تكرار.
من موجه أوامر Visual Studio Developer Command Prompt:
cl /std:c++17 /EHsc /O2 r2agent.cpp /link ws2_32.lib winhttp.lib bcrypt.lib
يستخدم كل من الوكيل والوكيل (agent) فترات نوم تكيفية:
يوازن هذا بين سرعة الاستجابة وحجم استدعاءات API. تُسجَّل الإحصائيات كل 30 ثانية تُظهر الاتصالات النشطة والكائنات المنقولة والبايتات المنقولة.
SignatureDoesNotMatchw32tm /resync /force (Windows) أو sudo ntpdate pool.ntp.org (Linux)RequestTimeTooSkewedw32tm /resync /force
AccessDeniedالوكيل (Python):
boto3 (مطلوب)cryptography (اختياري، للتشفير)الوكيل (C++):
| الأمر | الرمز | الاتجاه | الحمولة |
|---|
| 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 |