مدير الشبكة
يتعامل مدير الشبكة مع الشبكات الخاصة بالمنصة: اكتشاف الواجهات، مراقبة المسارات، حماية المقابس، وتتبع حالة WIFI.
المصدر: route/network.go، adapter/network.go
الواجهة
type NetworkManager interface {
Lifecycle
Initialize(ruleSets []RuleSet)
InterfaceFinder() control.InterfaceFinder
UpdateInterfaces() error
DefaultNetworkInterface() *NetworkInterface
NetworkInterfaces() []NetworkInterface
AutoDetectInterface() bool
AutoDetectInterfaceFunc() control.Func
ProtectFunc() control.Func
DefaultOptions() NetworkOptions
RegisterAutoRedirectOutputMark(mark uint32) error
AutoRedirectOutputMark() uint32
NetworkMonitor() tun.NetworkUpdateMonitor
InterfaceMonitor() tun.DefaultInterfaceMonitor
PackageManager() tun.PackageManager
NeedWIFIState() bool
WIFIState() WIFIState
ResetNetwork()
}الميزات الرئيسية
الاكتشاف التلقائي للواجهة
عند التفعيل، يربط sing-box تلقائياً الاتصالات الصادرة بواجهة الشبكة الافتراضية. هذا يمنع حلقات التوجيه عند تفعيل TUN — بدون ذلك، ستعود حركة المرور الصادرة إلى جهاز TUN.
func (m *NetworkManager) AutoDetectInterfaceFunc() control.Funcيُرجع دالة تحكم مقبس تربط المقابس بالواجهة الافتراضية الحالية باستخدام SO_BINDTODEVICE (Linux) أو ما يعادلها.
دالة الحماية (Android)
على Android، يجب "حماية" المقابس لتجاوز VPN:
func (m *NetworkManager) ProtectFunc() control.Funcتستدعي هذه واجهة منصة Android لتعليم المقابس بـ VpnService.protect().
مراقبة الواجهة
يراقب InterfaceMonitor تغييرات الشبكة:
type DefaultInterfaceMonitor interface {
Start() error
Close() error
DefaultInterface() *Interface
RegisterCallback(callback func()) *list.Element[func()]
UnregisterCallback(element *list.Element[func()])
}عند تغيّر الواجهة الافتراضية (مثل WiFi ← خلوي)، تُمسح جميع ذاكرات DNS المؤقتة وقد تُعاد تعيين الاتصالات.
استراتيجية الشبكة
للأجهزة متعددة الواجهات، تتحكم استراتيجية الشبكة في الواجهات المستخدمة:
type NetworkOptions struct {
BindInterface string
RoutingMark uint32
DomainResolver string
DomainResolveOptions DNSQueryOptions
NetworkStrategy *C.NetworkStrategy
NetworkType []C.InterfaceType
FallbackNetworkType []C.InterfaceType
FallbackDelay time.Duration
}الاستراتيجيات:
- افتراضي: استخدام واجهة النظام الافتراضية
- تفضيل الخلوي: محاولة الخلوي أولاً، ثم الرجوع إلى WiFi
- تفضيل WiFi: محاولة WiFi أولاً، ثم الرجوع إلى الخلوي
- هجين: استخدام الاثنين معاً (مسارات متعددة)
حالة WIFI
للقواعد التي تطابق على SSID/BSSID الخاص بـ WIFI:
type WIFIState struct {
SSID string
BSSID string
}يُحصل عليها عبر واجهات برمجة خاصة بالمنصة (NetworkManager على Linux، CoreWLAN على macOS، WifiManager على Android).
أنواع واجهات الشبكة
type InterfaceType uint8
const (
InterfaceTypeWIFI InterfaceType = iota
InterfaceTypeCellular
InterfaceTypeEthernet
InterfaceTypeOther
)علامة التوجيه
على Linux، تُستخدم علامة التوجيه (SO_MARK) لاختيار جداول التوجيه. هذا ضروري لعمل TUN — تُعلَّم الحزم الصادرة لتتجاوز قاعدة توجيه TUN.