نظرة عامة على البنية
sing-box هو منصة بروكسي شاملة مبنية على مكتبة الشبكات sing. على عكس التصميم المتجانس لـ Xray-core، يفوّض sing-box تنفيذ البروتوكولات إلى مكتبات sing-* الخارجية ويستخدم نظام السياق (context) في Go لحقن التبعيات.
المصدر: box.go، adapter/، route/، common/، protocol/
هيكل المشروع
sing-box/
├── box.go # هيكل Box، دورة الحياة (New/PreStart/Start/Close)
├── adapter/ # الواجهات الأساسية (Inbound, Outbound, Router, إلخ.)
│ ├── inbound/ # مدير الوارد والسجل
│ ├── outbound/ # مدير الصادر والسجل
│ ├── endpoint/ # مدير نقاط النهاية والسجل (WireGuard, Tailscale)
│ └── service/ # مدير الخدمات والسجل
├── route/ # الموجّه، مدير الاتصالات، مدير الشبكة
│ └── rule/ # مطابقة القواعد والإجراءات
├── dns/ # عميل DNS، الموجّه، مدير النقل
│ └── transport/ # تنفيذات نقل DNS
├── protocol/ # جميع تنفيذات بروتوكولات البروكسي
│ ├── vless/ # VLESS وارد/صادر
│ ├── vmess/ # VMess وارد/صادر
│ ├── trojan/ # Trojan وارد/صادر
│ ├── shadowsocks/ # Shadowsocks (مفرد/متعدد/ترحيل)
│ ├── hysteria2/ # Hysteria2
│ ├── tuic/ # TUIC
│ ├── tun/ # TUN وارد
│ ├── group/ # Selector, URLTest
│ └── ... # direct, block, dns, socks, http, إلخ.
├── transport/ # وسائل نقل متوافقة مع V2Ray
│ ├── v2raywebsocket/ # WebSocket
│ ├── v2raygrpc/ # gRPC (كامل)
│ ├── v2raygrpclite/ # gRPC (خفيف، بدون تبعيات)
│ ├── v2rayhttp/ # HTTP/2
│ ├── v2rayhttpupgrade/ # HTTP Upgrade
│ ├── v2rayquic/ # QUIC
│ └── wireguard/ # جهاز/مكدس WireGuard
├── common/ # أدوات مشتركة
│ ├── dialer/ # نظام المتصل (افتراضي، تحويل، حل، TFO)
│ ├── listener/ # مستمعات TCP/UDP
│ ├── sniff/ # كاشفات البروتوكولات
│ ├── tls/ # TLS, uTLS, REALITY, ECH, kTLS, ACME
│ ├── mux/ # عميل/موجّه تعدد الإرسال
│ └── ... # redir, process, geoip, geosite, إلخ.
├── option/ # أنواع الإعدادات
├── include/ # تضمين وسوم البناء
├── experimental/ # Clash API, V2Ray API, ملف التخزين المؤقت, libbox
├── log/ # نظام التسجيل
├── constant/ # الثوابت والتعدادات
└── service/ # تنفيذات الخدمات الخارجية (CCM, OCM, DERP, إلخ.)التبعيات الرئيسية
| الحزمة | الغرض |
|---|---|
sagernet/sing | مكتبة الشبكات الأساسية: N.Dialer, buf.Buffer, M.Socksaddr, bufio |
sagernet/sing-vmess | تنفيذ بروتوكول VLESS + VMess |
sagernet/sing-shadowsocks | Shadowsocks AEAD |
sagernet/sing-shadowsocks2 | Shadowsocks 2022 |
sagernet/sing-shadowtls | بروتوكول ShadowTLS |
sagernet/sing-mux | تعدد الإرسال (مبني على smux) |
sagernet/sing-quic | بروتوكولات مبنية على QUIC (Hysteria2, TUIC) |
sagernet/sing-tun | جهاز TUN + مكدس IP |
sagernet/gvisor | مكدس TCP/IP في مساحة المستخدم |
sagernet/quic-go | تنفيذ QUIC |
metacubex/utls | بصمة uTLS |
sagernet/wireguard-go | تنفيذ WireGuard |
sagernet/tailscale | تكامل Tailscale |
miekg/dns | تحليل رسائل DNS |
anytls/sing-anytls | بروتوكول AnyTLS |
تدفق البيانات عالي المستوى
┌─────────────────────────────────────────────────────────┐
│ Box │
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ مدير │───→│ الموجّه │───→│ مدير │ │
│ │ الوارد │ │ │ │ الصادر │ │
│ └──────────┘ │ matchRule│ └───────────────┘ │
│ │ │ sniff │ │ │
│ │ │ resolve │ │ │
│ ▼ └──────────┘ ▼ │
│ ┌──────────┐ │ ┌───────────────┐ │
│ │ بروتوكول│ ┌────┴────┐ │ بروتوكول │ │
│ │ وارد │ │ موجّه │ │ صادر │ │
│ │ (فك) │ │ DNS │ │ (تشفير) │ │
│ └──────────┘ └─────────┘ └───────────────┘ │
│ │ │ │
│ ┌────┴────┐ ┌─────┴──────┐ │
│ │ نقل │ │ مدير │ │
│ │ DNS │ │ الاتصالات │ │
│ │ │ │(حلقة النسخ)│ │
│ └─────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────┘تدفق الاتصال
- الوارد يقبل الاتصال (TCP) أو الحزمة (UDP)
- يفك الوارد ترويسة البروتوكول ويستخرج الوجهة
- يستدعي الوارد
router.RouteConnectionEx(ctx, conn, metadata, onClose)أوRoutePacketConnectionEx - الموجّه يثري البيانات الوصفية: معلومات العملية، معلومات الجوار، بحث FakeIP، DNS العكسي
- الموجّه يتكرر على القواعد بالترتيب، منفذاً الإجراءات:
sniff— فحص البيانات لاكتشاف البروتوكول/النطاقresolve— حل DNS للنطاق إلى عناوين IProute— اختيار الصادر (إجراء نهائي)reject— إسقاط الاتصال (إجراء نهائي)hijack-dns— معالجة كاستعلام DNS (إجراء نهائي)bypass— تجاوز التوجيه (إجراء نهائي)
- الموجّه يختار الصادر بناءً على القاعدة المطابقة (أو الافتراضي)
- متتبعات الاتصال تغلّف الاتصال (إحصائيات، Clash API)
- إذا كان الصادر ينفّذ
ConnectionHandlerEx، يتعامل معه مباشرة - وإلا، مدير الاتصالات يتصل بالخادم البعيد ويشغّل النسخ ثنائي الاتجاه
مبادئ التصميم
تفويض المكتبات: تنفيذات البروتوكولات موجودة في مكتبات
sing-*. يعمل sing-box كطبقة تنسيق.حقن التبعيات عبر السياق: جميع الخدمات تُسجّل في السياق عبر
service.ContextWith[T]()وتُسترجع عبرservice.FromContext[T](). لا توجد كائنات مفردة عامة.اتصالات مباشرة: على عكس نموذج القارئ/الكاتب المبني على Pipe في Xray-core، يمرر sing-box
net.ConnوN.PacketConnمباشرة عبر خط الأنابيب. هذا يتيح عمليات بدون نسخ و splice/sendfile.توجيه مبني على الإجراءات: القواعد تنتج إجراءات، وليس مجرد وسوم صادرة. هذا يسمح بأن يكون الاستكشاف وحل DNS جزءاً من سلسلة القواعد.
دورة حياة من 4 مراحل: تبدأ المكونات في مراحل (تهيئة ← بدء ← ما بعد البدء ← مُبتدأ) لمعالجة ترتيب التبعيات المعقد بدون رسوم بيانية صريحة للتبعيات.
سجلات قابلة للتوسيع: أنواع الوارد والصادر ونقاط النهاية ونقل DNS والخدمات كلها مسجلة عبر سجلات الأنواع، مما يسهّل إضافة أنواع بروتوكولات جديدة.