تتعامل بوابات VPN المؤسسية عالية الأداء والواقعة عند تقاطع الشبكات المحلية متعددة المشتركين وبنى SD-WAN ومسارات BGP Anycast مع جداول توجيه شديدة الضخامة. فعلى عكس الأجهزة المحدودة التي تدير مسارات بسيطة، تستقبل خوادم VPN المركزية ما يزيد عن 100,000 مسار مستقل. تشمل هذه المسارات عناوين الأجهزة المتصلة (/32)، والشبكات الفرعية للمكاتب البعيدة (/24 إلى /28)، وجداول التوجيه الخارجية عبر جلسات BGP.

وتتطلب كل حزمة بيانات ترد إلى بطاقة الشبكة (NIC) اتخاذ قرار فوري: تحديد عنوان القفزة التالية (next-hop)، واختيار واجهة الإرسال، وتحديد ترويسة التغليف الملائمة. وفي نواة لينكس، يتولى إدارة هذا المسار الحيوي قاعدة معلومات التوجيه (FIB) وهيكلها الأساسي المتمثل في شجرة المستويات المضغوطة (Level-Compressed Trie أو LC-trie).

ولفهم قدرة النواة على الحفاظ على استقرار المعالجة مع مئات الآلاف من البادئات، ينبغي تقصي التصميم الرياضي في الملف net/ipv4/fib_trie.c.

مراحل اتخاذ قرار توجيه الحزمة:
الحزمة الواردة ──> ip_rcv() ──> ip_route_input_noref() ──> fib_lookup()
                                                                  │
                                   ┌──────────────────────────────┴──────────────────────────────┐
                                   ▼                                                             ▼
                     تقييم قواعد السياسات (fib_rules)                               البحث في جدول FIB (fib_table_lookup)
                 (الحد من الفحص الخطي الطويل)                                                    │
                                                                                    اجتياز عقد شجرة LC-Trie
                                                                                 (قراءة المؤشرات بدون أقفال عبر RCU)
                                                                                                 │
                                                                                                 ▼
                                                                                   مطابقة أطول بادئة (LPM)
                                                                                                 │
                                                                                                 ▼
إرسال الحزمة <══ استخراج بنية fib_info (البوابة، الواجهة، وحدة التحكم MTU، أوزان ECMP) ═════════╝

تحدي مطابقة أطول بادئة (LPM) في بوابات VPN الكثيفة

يعتمد التوجيه الشبكي على قاعدة مطابقة أطول بادئة (Longest Prefix Match - LPM) المنصوص عليها في RFC 1812. فإذا تضمن جدول التوجيه كلا من النطاق الشامل 10.0.0.0/8 والنطاق الفرعي 10.24.16.0/24 (الخاص بنفق أحد الفروع)، فإن حزمة موجهة إلى 10.24.16.55 يجب أن تسلك مسار نفق /24 بدقة.

وعندما تتسع الجداول لتضم مئات الآلاف من المسارات، تواجه الخوارزميات التقليدية عوائق كبيرة:

  • المسح الخطي: مقارنة العنوان تسلسليا تنطوي على تعقيد $O(N)$، مما يؤدي إلى استهلاك طاقة المعالجة مع ارتفاع حجم البيانات.
  • الأشجار الثنائية غير المضغوطة: تتطلب الشجرة الثنائية الكلاسيكية ما يصل إلى 32 عملية وصول للذاكرة لكل عنوان IPv4. ويسبب التنقل بين 32 موقعا متفرقا في الذاكرة إخفاقا متكررا في الذاكرة المخبأة (Cache Miss) للمعالج، مما يحد من استغلال سرعات 100 GbE.

وتتغلب نواة لينكس على هذا القصور من خلال ضغط المستويات.

التركيب الداخلي لشجرة LC-Trie في net/ipv4/fib_trie.c

تعتمد منظومة توجيه IPv4 في لينكس شجرة مضغوطة المستويات تجمع بين آليتين: ضغط المسار (Path Compression) وضغط المستويات (Level Compression).

1. ضغط المسار (تجاوز البتات غير المتفرعة):
   الشجرة الكلاسيكية:        (الجذر) ──> [0] ──> [1] ──> [0] ──> [ورقة]
   المسار المضغوط:           (الجذر) ──[تخطي 3 بتات: "010"]────> [ورقة]

──────────────────────────────────────────────────────────────────────────────

2. ضغط المستويات (استبدال الفروع المتوازنة بمصفوفات موجهة):
   شجرة ثنائية بعمق 3:                             شجرة مضغوطة المستويات (عقدة موجهة):
              (عقدة)                                            [عقدة متجهة]
             /      \                                   ┌───┬───┬───┬───┬───┬───┬───┬───┐
          (ع1)      (ع2)              ===>              │000│001│010│011│100│101│110│111│
         /    \    /    \                               └───┴───┴───┴───┴───┴───┴───┴───┘
        و0    و1  و2    و3                                ▲   ▲   ▲   ▲   ▲   ▲   ▲   ▲
                                                          و0  و1  و2  و3  و4  و5  و6  و7

ضغط المسار (Path Compression)

تتشارك العديد من البادئات الشبكية في تتابع بتات أولية متطابقة دون وجود تفرعات جانبية. تعمل هذه الآلية على دمج العقد المتسلسلة في عقدة واحدة مع تعيين قيمة إزاحة pos، مما يقلل العمق الإجمالي للشجرة.

ضغط المستويات (Level Compression)

عندما يكتمل تشعب شجرة بعمق $k$ بتوازن كبير، تستبدل النواة هذا الفرع بعقدة مصفوفة موجهة (struct key_vector) تحوي $2^k$ مؤشرا مباشرا.

وبدلا من $k$ خطوة متتابعة، يستخلص المحرك الموقع عبر إزاحة وقناع بتات في خطوة واحدة بزمن $O(1)$:

$$ ext{الفهرس} = ( ext{المفتاح} \gg ext{pos}) \ & \ ((1 \ll ext{bits}) - 1)$$

تنظيم الذاكرة وتوزيع البيانات

تنتظم المسارات ضمن ثلاث بنيات أساسية:

  • struct key_vector: يمثل العقد الداخلية (tnode) أو عقد الأوراق.
  • struct fib_alias: يربط الورقة ببيانات المسار الوصفية (طول البادئة، نوع الخدمة، النطاق).
  • struct fib_info: يخزن تفاصيل التوجيه الفعلية (عنوان البوابة، واجهة الإرسال net_device، قيمة MTU). وتشترك المسارات ذات البوابات المتماثلة في بنية واحدة لتوفير استهلاك الذاكرة.

وتنفذ كافة عمليات القراءة في fib_table_lookup() بدون أقفال تحت حماية آلية RCU (Read-Copy-Update)، وتعتمد التحديثات بشكل ذري.

تشخيص أداء الشجرة ومراقبة المؤشرات

تتيح نواة لينكس متابعة حالة الشجرة ومؤشراتها عبر الواجهة /proc/net/fib_triestat.

عرض إحصاءات جدول التوجيه الأساسي:

cat /proc/net/fib_triestat

المؤشرات التي ينبغي متابعتها:

  1. متوسط العمق (Aver depth): يوضح متوسط مرات الوصول للذاكرة لكل حزمة، ويتراوح في الجداول المحكمة بين 2.5 و 3.2 لـ 100 ألف مسار.
  2. أقصى عمق (Max depth): يشير لأطول مسار تفرع، وتنبئ القيم الأعلى من 8 عن وجود تشتت في توزيع البادئات.
  3. المؤشرات الفارغة (Null ptrs / Pointers): تحدد كفاءة ملء المصفوفات المتجهة.

إرشادات ضبط الأداء لشبكات تتجاوز 100K مسار

يتطلب الحفاظ على سرعة التوجيه مع الجداول الكبرى تهيئة مدروسة للنظام.

1. تقليص قواعد سياسات التوجيه (RPDB)

تتيح قواعد التوجيه المخصصة (ip rule) مرونة واسعة، غير أن النواة تفحص قائمة fib_rules تسلسليا قبل الانتقال للشجرة.

مراجعة القواعد الحالية:

ip rule show

يؤدي الإكثار من القواعد الفردية إلى زيادة التأخير. ويستحسن:

  • الإبقاء على أقل عدد من القواعد.
  • توجيه الحزم باستخدام وسوم fwmark أو مجالات VRF المجمعة.

2. تفعيل خوارزمية L4 في المسارات المتعددة (ECMP)

يعتمد التوزيع الافتراضي للأحمال عبر مسارات متعددة في لينكس على عناوين IP فقط.

ولضمان توازن أدق مع احتساب المنافذ، يضبط الملف /etc/sysctl.d/99-routing.conf:

net.ipv4.fib_multipath_hash_policy = 1
net.ipv4.fib_multipath_hash_fields = 0x0037

3. احتواء تراكم طوابير RCU أثناء تحديثات BGP

أثناء تقلبات المسارات، تتدفق آلاف التحديثات في الثانية مما قد يثقل طوابير RCU.

ضبط معلمات تنظيف الذاكرة المؤقتة:

net.ipv4.neigh.default.gc_thresh1 = 8192
net.ipv4.neigh.default.gc_thresh2 = 32768
net.ipv4.neigh.default.gc_thresh3 = 65536
net.ipv4.route.gc_thresh = 131072
net.ipv4.route.gc_min_interval_ms = 500

تفعيل التعديلات:

sudo sysctl --system

التوافق البنيوي مع منظومة RiceGuard

تجمع الحلول الشبكية المتقدمة بين سرعة المعالجة على مستوى النواة والموثوقية التشفيرية للبروتوكول. يعتمد بروتوكول RiceGuard الذي طورته VPNRice على تقنية التوجيه بالمفاتيح المشفرة (Cryptokey Routing / AllowedIPs)، مشكلا مصفوفة مطابقة متناغمة مع بنية FIB trie في لينكس.

وبينما تتولى الشجرة توجيه حزم UDP المشفرة نحو المنافذ المادية بأقصى سرعة، يقوم محرك RiceGuard بالتحقق من مطابقة الحزم بعد فك تشفيرها مع مفاتيح النظراء المصرح لهم. ويمنع هذا التكامل حدوث حلقات التوجيه ويوفر سرعة استجابة فائقة عبر شبكة الخوادم العالمية.

تحميل VPNRice