يتطلب تصميم بوابات VPN الحديثة القادرة على معالجة تدفقات ببيانات تصل إلى عشرات الجيجابت في الثانية تحكماً برمجياً دقيقاً في حركة الحزم الواردة والصادرة على حد سواء. ورغم أن تقنية مسار البيانات فائق السرعة eXpress Data Path (XDP) حققت انتشاراً واسعاً بفضل قدرتها على تصفية الحزم على مستوى برنامج تشغيل بطاقة الشبكة، إلا أنها تواجه قيداً جوهرياً: تعمل XDP فقط في مسار الدخول (Ingress) وقبل أن تخصص النواة بنية البيانات الوصفية للمقبس (struct sk_buff). ونتيجة لذلك، تعجز XDP عن فحص الحزم الصادرة، أو إدارة طوابير الإرسال، أو تعديل الحزم بعمق بعد معالجة طبقة المقابس.

لتحقيق معالجة ثنائية الاتجاه شاملة، يعتمد مهندسو شبكات لينكس على النظام الفرعي للتحكم في حركة المرور (Traffic Control - TC) عبر مصنفات eBPF البرمجية (BPF_PROG_TYPE_SCHED_CLS). من خلال الارتباط بآلية صف الانتظار الحديثة clsact (qdisc)، تعمل برامج eBPF TC داخل مكدس شبكة النواة مع وصول كامل إلى خصائص sk_buff. يتيح ذلك توجيهاً ديناميكياً على مستوى الطبقتين الرابعة والسابعة، وإعادة توجيه الحزم بين واجهات الشبكة دون نسخ في الذاكرة، وضبط معدل الإرسال بالاعتماد على توقيت المغادرة الدقيق (EDT) دون الحاجة إلى تبديل السياق مع مساحة المستخدم.

المقارنة الهيكلية: eBPF TC مقابل XDP داخل مكدس النواة

لفهم دور تقنية eBPF TC في الأنفاق الشبكية المشفرة، يجب دراسة نقاط تنفيذها مقارنة بنقاط ربط XDP:

حزمة البيانات الواردة (Ingress)
      │
      ▼
┌──────────────┐
│ نقطة ربط XDP  │  <--- معالجة البيانات الخام xdp_md قبل تخصيص skb
└──────┬───────┘       (إسقاط أو تحويل فائق السرعة، مسار الدخول فقط، بدون مخرج)
      │
      ▼
 alloc_skb()
      │
      ▼
┌──────────────────┐
│ eBPF TC Ingress  │  <--- تعمل على struct __sk_buff (عبر qdisc clsact)
└──────┬───────────┘       (تحليل كامل للطبقات 3 و 4، خرائط BPF، تحويل فوري للنفق)
      │
      ▼
 مكدس البروتوكولات (IP/TCP/UDP) ── طبقة المقابس (Sockets)
      │
      ▼ (حركة البيانات المشفرة الصادرة Egress)
┌──────────────────┐
│ eBPF TC Egress   │  <--- تعمل على struct __sk_buff قبل حلقة بطاقة الشبكة
└──────┬───────────┘       (جدولة توقيت الخروج EDT، تمييز DSCP، تشكيل سرعة بدون أقفال)
      │
      ▼
طابور إرسال برنامج تشغيل بطاقة الشبكة (NIC)

يوفر العمل على مستوى طبقة TC ميزات تقنية استثنائية:

  • تغطية ثنائية الاتجاه: ترتبط نقاط TC بكل من مساري الدخول والخروج للواجهات الفيزيائية (مثل eth0) وواجهات الأنفاق الافتراضية (مثل wg0).
  • وصول كامل إلى sk_buff: تستطيع برامج BPF قراءة وإعادة كتابة ترويسات الحزم، وإعادة احتساب المجاميع التحققية، وتعديل طوابع الإرسال الزمنية (skb->tstamp)، ووضع علامات الجدار الناري (skb->mark).
  • التنفيذ المباشر للإجراء (Direct Action): من خلال تفعيل خيار da، يُرجع مصنف BPF القرار البرمجي مباشرة (TC_ACT_OK أو TC_ACT_SHOT أو TC_ACT_REDIRECT)، متفادياً تعقيدات تسلسل المرشحات التقليدية.

إعادة توجيه الحزم دون نسخ في الذاكرة عبر bpf_redirect

في البيئات السحابية متعددة المشتركين ذات التدفقات الكثيفة، يتطلب نقل الحزم بين واجهات الشبكة الفيزيائية والأنفاق الافتراضية تقليدياً عبور مكدس توجيه IP مرتين متتاليتين. يستهلك هذا المسار وقتاً في البحث داخل جداول التوجيه وجداول تتبع الاتصالات (conntrack) وسلاسل Netfilter، مما يشكل عبئاً كبيراً على ذاكرة التخزين المؤقت للمعالج.

باستخدام eBPF TC، يبرمج مسؤولو الشبكات توجيهاً مباشراً بين الأجهزة داخل مساحة النواة بواسطة الدالة المساعدة bpf_redirect():

#include <linux/bpf.h>
#include <linux/pkt_cls.h>
#include <bpf/bpf_helpers.h>

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 65536);
    __type(key, __u32);   /* عنوان IPv4 الافتراضي للعميل */
    __type(value, __u32); /* فهرس واجهة الشبكة الهدف ifindex */
} route_map SEC(".maps");

SEC("tc")
int tc_ingress_router(struct __sk_buff *skb)
{
    void *data = (void *)(long)skb->data;
    void *data_end = (void *)(long)skb->data_end;
    
    /* فحص حدود الذاكرة: الحد الادنى لترويسات Ethernet و IPv4 */
    if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) > data_end)
        return TC_ACT_OK;
        
    struct iphdr *iph = data + sizeof(struct ethhdr);
    __u32 dst_ip = iph->daddr;
    
    /* استعلام سريع في جدول تجزئة BPF لواجهات WireGuard */
    __u32 *ifindex = bpf_map_lookup_elem(&route_map, &dst_ip);
    if (ifindex) {
        /* اعادة توجيه الحزمة مباشرة دون المرور الكامل عبر مكدس IP */
        return bpf_redirect(*ifindex, 0);
    }
    
    return TC_ACT_OK;
}

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

وقت المغادرة المبكر (EDT) والقضاء على تدفقات الحزم الفجائية

يعد تدفق الحزم المفاجئ وغير المنتظم من أبرز تحديات الشبكات الافتراضية عالية السرعة. فعندما يرسل عدة عملاء تدفقات ضخمة في وقت واحد، تضخ أجهزة إرسال TCP دفعات كثيفة من الحزم داخل النفق. كانت خوارزميات التحديد التقليدية مثل مرشح دلو الرموز (TBF) والدلو الهرمي (HTB) تفرض حدود السرعة عن طريق تجميع الحزم الزائدة في طوابير محمية بأقفال عامة (spinlocks). وتحت أعباء العمل المتزامنة العالية، يؤدي التنافس على الأقفال إلى خفض كفاءة المعالجات متعددة الأنوية.

تتغلب نواة لينكس الحديثة على هذه المشكلة عبر تقنية وقت المغادرة المبكر (Early Departure Time - EDT). فبدلاً من احتجاز الحزم في طوابير معتمدة على الأقفال، يُسند إلى كل حزمة طابع زمني دقيق لوقت انطلاقها الفعلي على السلك (skb->tstamp).

باستخدام eBPF TC في مسار الخروج (Egress)، ينفذ المهندسون تشكيلاً لمعدل النقل دون أي اختناقات:

  1. يحسب برنامج eBPF في مسار الخروج الفاصل الزمني المطلوب بين الحزم بناءً على النطاق الترددي المخصص للمستخدم.
  2. يحدث البرنامج الطابع الزمني: skb->tstamp = max(current_time, last_departure_time + packet_len / rate).
  3. تقوم آلية الصفوف العادلة sch_fq بإطلاق الحزم إلى بطاقة الشبكة بدقة متناهية وفقاً لطابعها الزمني المحدد، دون أي تعليق أو انتظار للأقفال البرمجية.

الإعداد في بيئة الإنتاج: تحميل البرامج عبر clsact

يتم ضبط وتشغيل بنية eBPF TC على لينكس باستخدام حزمة الأدوات القياسية iproute2:

# 1. ربط نظام clsact بالواجهة الفيزيائية
tc qdisc add dev eth0 clsact

# 2. تحميل مصنف BPF على نقطة الدخول بوضع direct-action
tc filter add dev eth0 ingress bpf da obj vpn_router.o sec tc_ingress

# 3. تحميل منظم التدفق بتقنية EDT على نقطة الخروج
tc filter add dev eth0 egress bpf da obj vpn_shaper.o sec tc_egress

# 4. استعراض المرشحات النشطة وإحصائيات المعالجة
tc filter show dev eth0 ingress
tc filter show dev eth0 egress

بفضل الفصل الدقيق لنقاط الربط داخل clsact، تجري عمليات تحديث البرامج واستبدالها بسلاسة تامة دون أي فقد في الحزم أو انقطاع في الاتصال.

التطبيق المؤسسي في بنية RiceGuard Anycast

تعتمد بنية RiceGuard الموزعة عبر شبكة Anycast على تقنية eBPF TC لضمان جودة خدمة مستقرة:

  • تطبيق صارم لحصص المشتركين: تربط RiceGuard مرشحات eBPF لمسار الخروج مباشرة بواجهات الأنفاق، مما يعطي كل عميل جدول EDT مستقلاً ويمنع التدفقات الفردية الكثيفة من استنزاف الحزم الحساسة لزمن الاستجابة.
  • قياس عن بعد آني عبر خرائط BPF: تسجل مصنفات الدخول إحصائيات التدفق اللحظية (عدد الحزم، الأحجام المنقولة، كشف الحزم غير الصالحة) في مخازن ذاكرة دائرية (ring buffers)، لتغذية أنظمة الكشف الأمني دون استهلاك زائد لموارد النظام.
  • التكامل مع بطاقات الشبكة الذكية SmartNIC: في الخوادم المجهزة بشرائح معالجة متقدمة، تُترجم قواعد eBPF TC مباشرة إلى عتاد البطاقة، مما يتيح معالجة الحزم بمعدل 100 جيجابت في الثانية وتأخير يقل عن جزء من المليون من الثانية.

من خلال استثمار قدرات eBPF TC في التوجيه البرمجي وجدولة الخروج الخالية من الأقفال، يحقق نظاما WireGuard و RiceGuard كفاءة استثنائية وعزلاً محكماً لحركة البيانات عبر مختلف البيئات السحابية.