طراحی درگاه‌های مدرن VPN برای حفظ نرخ تبادل چند گیگابیتی در ثانیه، نیازمند کنترل برنامه‌پذیر هم‌زمان بر جریان بسته‌های ورودی و خروجی است. اگرچه فناوری eXpress Data Path (XDP) به دلیل توان فیلترینگ با سرعت کابل در لایه درایور کارت شبکه شناخته شده است، اما این رویکرد دارای محدودیتی بنیادین است: XDP تنها در مسیر ورودی (Ingress) و پیش از تخصیص ساختار فراداده بافر سوکت لینوکس (struct sk_buff) عمل می‌کند. از این رو توانایی بازرسی بسته‌های ارسالی به بیرون، مدیریت صف‌های خروجی یا تغییر عمیق بسته‌ها پس از پردازش لایه سوکت را ندارد.

برای کنترل جامع دوطرفه بر مسیر بسته‌ها، مهندسان شبکه لینوکس به زیرسیستم کنترل ترافیک (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 (ساختار clsact)
└──────┬───────────┘       (تحلیل کامل لایه‌های ۳ و ۴، نگاشت‌های BPF، ارسال به تونل)
      │
      ▼
 پشته پروتکل (IP/TCP/UDP) ── لایه سوکت
      │
      ▼ (ترافیک رمزشده خروجی 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

در معماری‌های چندکاربره پرتردد، انتقال بسته‌ها میان رابط‌های فیزیکی و اینترفیس‌های مجازی تونل معمولاً نیازمند دو بار پیمایش کامل پشته مسیریابی هسته است. این مسیر مستلزم جستجو در جدول‌های مسیریابی، جدول ردگیری اتصال (conntrack) و زنجیره‌های فیلترینگ است که سربار حافظه کش پردازنده را به دنبال دارد.

با کمک 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;
    
    /* بررسی ابعاد: حداقل اندازه سرایندهای اترنت و آی‌پی */
    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 */
    __u32 *ifindex = bpf_map_lookup_elem(&route_map, &dst_ip);
    if (ifindex) {
        /* هدایت مستقیم بسته بدون پیمایش مجدد پشته شبکه */
        return bpf_redirect(*ifindex, 0);
    }
    
    return TC_ACT_OK;
}

این برنامه با استقرار روی رابط فیزیکی، بسته‌های ورودی را بررسی کرده و پس از تطبیق نگاشت با جدول هش، بسته را بی‌درنگ به صف ورودی رابط تونل تحویل می‌دهد. تمام این فرایند بدون نسخه کپی در حافظه رخ می‌دهد و مصرف چرخه‌های پردازنده به ازای هر بسته را تا بیش از ۴۰ درصد کاهش می‌دهد.

زمان خروج زودهنگام (EDT) و مهار ریزجهش‌های ترافیکی

نوسان ناگهانی ارسال داده یکی از چالش‌های اصلی در پیوندهای سرعت بالا است. هنگامی که چندین کلاینت به طور هم‌زمان جریان داده حجیم ارسال می‌کنند، فرستنده‌های TCP خوشه‌های متراکمی از بسته‌ها را به رابط تونل تزریق می‌کنند. الگوریتم‌های سنتی مانند سطل نشانه‌دار (TBF) یا سطل سلسله‌مراتبی (HTB) با ذخیره بسته‌های مازاد در صف‌های دارای قفل سراسری نرخ را محدود می‌کردند. در ترافیک‌های بسیار سنگین، رقابت بر سر قفل‌ها کارایی پردازنده‌های چند‌هسته‌ای را کاهش می‌دهد.

هسته لینوکس با پیاده‌سازی سازوکار زمان خروج زودهنگام (Early Departure Time - EDT) بر این معضل غلبه کرده است. به جای انباشت بسته در بافرهای همراه با قفل، به هر بسته یک برچسب زمانی دقیق برای زمان ارسال به کابل شبکه (skb->tstamp) تخصیص می‌یابد.

برنامه eBPF TC در مسیر خروجی (egress) به این ترتیب عمل می‌کند: ۱. بر اساس پهنای باند اختصاص‌یافته به کاربر، تأخیر مورد نیاز بین بسته‌ها را محاسبه می‌کند. ۲. برچسب زمانی بسته را به صورت skb->tstamp = max(current_time, last_departure_time + packet_len / rate) به‌روزرسانی می‌کند. ۳. الگوریتم صف‌بندی عادلانه sch_fq بسته را دقیقاً در زمان ثبت‌شده به سمت درایور فیزیکی ارسال می‌کند؛ بدون اینکه معطلی ناشی از قفل حافظه رخ دهد.

استقرار عملیاتی با دستورات clsact

راه‌اندازی ساختار eBPF TC با استفاده از ابزار استاندارد iproute2 انجام می‌گیرد:

# ۱. اتصال qdisc ساختار clsact به رابط فیزیکی
tc qdisc add dev eth0 clsact

# ۲. بارگذاری فیلتر ورودی BPF با پرچم direct-action
tc filter add dev eth0 ingress bpf da obj vpn_router.o sec tc_ingress

# ۳. بارگذاری کنترل‌کننده نرخ خروجی EDT در مسیر Egress
tc filter add dev eth0 egress bpf da obj vpn_shaper.o sec tc_egress

# ۴. مشاهده وضعیت فیلترها و آمارهای ترافیکی
tc filter show dev eth0 ingress
tc filter show dev eth0 egress

جداسازی دقیق قلاب‌ها در clsact این امکان را می‌دهد که ارتقا یا تعویض برنامه‌های BPF بدون از دست رفتن بسته‌ها و بدون قطعی پیوند انجام پذیرد.

کاربرد در معماری Anycast سامانه RiceGuard

سامانه RiceGuard بر بستر شبکه توزیع‌شده Anycast از فناوری eBPF TC برای تثبیت کیفیت خدمات شبکه استفاده می‌کند:

  • تضمین سهمیه ترافیک هر کاربر: اتصال مستقیم فیلترهای eBPF خروجی به اینترفیس‌های تونل موجب تخصیص زمان‌بندی مستقل EDT برای هر کلاینت شده و مانع از تأثیر منفی کاربران پرمصرف بر بسته‌های حساس به تأخیر می‌شود.
  • تله‌متری بلادرنگ با نگاشت‌های BPF: ثبت دائمی آمار جریان‌ها (تعداد بسته‌ها، حجم بایت، تشخیص بسته‌های نامعتبر) در حلقه‌های بافر حافظه، داده‌های نظارتی را بدون ایجاد بار پردازشی به سامانه‌های امنیتی می‌رساند.
  • سازگاری با کارت‌های هوشمند SmartNIC: در سرورهای مجهز به کارت‌های پردازش شبکه، کدهای eBPF TC مستقیماً در سخت‌افزار اجرا می‌شوند و هدایت ترافیک را با سرعت ۱۰۰ گیگابیت بر ثانیه و تأخیر زیر میکروثانیه ممکن می‌سازند.

ترکیب eBPF TC و سازوکار زمان‌بندی خروج EDT در بسترهای WireGuard و RiceGuard، بهره‌وری پایدار و ایزولاسیون کامل ترافیک را در بالاترین مقیاس عملیاتی محقق ساخته است.