گلوگاه هدایت بسته‌ها در سرورها و گیت‌وی‌های رمزنگاری‌شده VPN

در متمرکزکننده‌های بزرگ VPN، مسیریاب‌های NAT در مقیاس ارائه‌دهنده اینترنت و گیت‌وی‌های چندمستاجره، مدیران شبکه معمولاً با محدودیت پردازنده در ترافیک سنگین روبرو می‌شوند. حتی هنگامی که سرور به پردازنده‌های چندده‌هسته‌ای و کارت‌های شبکه پیشرفته با درگاه PCIe 4.0 مجهز است، نرخ انتقال بسته در ثانیه (PPS) غالباً قبل از پر شدن پهنای باند فیزیکی کابل، در سقف پردازش وقفه‌های نرم‌افزاری روی یک تک‌هسته متوقف می‌شود.

در معماری سنتی شبکه لینوکس، هر بسته‌ای که از سرور عبور می‌کند باید تمام مراحل زنجیره دیواره آتش Netfilter را گام‌به‌گام بپیماید:

[ کابل فیزیکی شبکه ] 
          |
          v
[ بافر دریافت درایور RX / NAPI Poll ]
          |
          v
[ مرحله PREROUTING (رهگیری conntrack، تغییر سرآیند mangle و dnat) ]
          |
          v
[ تصمیم‌گیری مسیریابی (fib_lookup) ]
          |
          v
[ مرحله FORWARD (فیلتر بسته، محدودسازی نرخ انتقال) ]
          |
          v
[ مرحله POSTROUTING (تغییر مبدا snat و masquerade) ]
          |
          v
[ تفکیک آدرس همسایه (ARP/NDP) / صف خروج Egress Qdisc ]
          |
          v
[ بافر ارسال درایور TX ] ---> [ کابل فیزیکی شبکه ]

هر یک از این بخش‌ها نیازمند به‌روزرسانی شمارنده‌های اتمیک، قفل‌های گردشی در جدول رهگیری اتصال (nf_conntrack_lock)، تخصیص حافظه برای بافرهای sk_buff و جستجوهای پیاپی در جدول مسیرهای FIB است. زمانی که یک گیت‌وی هزاران تونل همزمان (نظیر WireGuard، RiceGuard یا IPsec) را مدیریت می‌کند، این بار محاسباتی رشد فزاینده‌ای پیدا می‌کند:

  1. ارزیابی مکرر اتصالات پایدار: بسته‌های متعلق به نشست‌های طولانی TCP یا جریان‌های مداوم UDP در هر بار عبور باید مجدداً با تمام قوانین دیواره آتش و ماشین حالات conntrack تطبیق داده شوند.
  2. تداخل خطوط حافظه کش میان هسته‌ها: جدول رهگیری اتصالات میان تمام هسته‌های CPU مشترک است. جریان فشرده بسته‌ها موجب جابجایی و ابطال پی‌درپی داده‌ها در حافظه کش لایه سوم (L3 Cache Line Bouncing) می‌شود.
  3. تاخیر کپسوله‌سازی دوگانه: هدایت بسته‌های رمزگشایی‌شده به سمت اینترنت یا مسیریابی بسته‌های UDP حامل تونل، مستلزم پیمایش دوباره زنجیره نقاط رهگیری Netfilter است.

برای غلبه بر این چالش مقیاس‌پذیری بدون کاهش سطح امنیت فیلترهای وضعیت‌مند، هسته لینوکس زیرساخت Netfilter Flowtable را معرفی کرد (که توسط پابلو نیرا آیوسو توسعه یافته و از نسخه 4.16 به هسته اضافه شد).

ساختار مسیر سریع Ingress Fastpath در Netfilter Flowtable

زیرسیستم Netfilter Flowtable یک سازوکار ذخیره‌سازی میانبر در سطح هسته برای جریان‌های دوطرفه تثبیت‌شده است. به جای فرستادن تک‌تک بسته‌ها به مسیر پرپیچ‌وخم شبکه، Flowtable نشست را پس از پایان دست‌دادن اولیه (ct state established) شناسایی کرده و یک مسیر مستقیم در نقطه دریافت درایور کارت شبکه (Ingress Hook) ایجاد می‌کند.

                       [ بسته ورودی به کارت شبکه ]
                                     |
                                     v
                       +---------------------------+
                       |   Flowtable Ingress Hook  |
                       +---------------------------+
                                    / \
                     تطبیق جریان؟  /   \   جریان ناشناخته؟
                                  /     \
                                 بله     خیر
                                 /         \
                                v           v
          +-----------------------+     +-------------------------------+
          | هدایت از مسیر سریع:   |     | مسیر سنتی و کامل Netfilter:  |
          | - به‌روزرسانی وضعیت   |     | - مرحله PREROUTING            |
          | - اعمال NAT و هدرها   |     | - تحلیل conntrack             |
          | - کسر TTL و ثبت MAC   |     | - تصمیم‌گیری در fib_lookup    |
          | - ارسال به خروجی کارت |     | - مراحل FORWARD و POSTROUTING |
          +-----------------------+     +-------------------------------+
                      |                                |
                      |                       آیا اتصال پایدار شد؟
                      |                                |
                      |                                v
                      |                    [ ثبت در Flowtable ]
                      \                                /
                       \                              /
                        v                            v
                      +--------------------------------+
                      |   dev_queue_xmit (کارت خروجی)  |
                      +--------------------------------+

شیوه اجرای الگوریتم در هسته لینوکس

هسته عملیاتی در فایل net/netfilter/nf_flow_table_core.c مستقر است. زمانی که بسته وارد کارتی می‌شود که روی آن Flowtable تعریف شده است:

  1. رهگیری در بدو ورود (Ingress): تابع nf_flow_offload_ip_hook() بسته خام را در سطح NF_INET_INGRESS و پیش از فراخوانی ip_rcv() و زنجیره PREROUTING دریافت می‌کند.
  2. تطبیق پنج‌تایی بدون قفل: یک جدول هش با محافظت RCU پنج پارامتر را با سرعت بررسی می‌کند: IP مبدا و مقصد، پورت مبدا و مقصد، و پروتکل لایه انتقال.
  3. اجرای مستقیم عملیات:
    • کسر TTL: زمان حیات بسته کاهش یافته و جمع کنترلی سرآیند IP مجدداً محاسبه می‌شود.
    • اعمال بلادرنگ NAT: اگر جریان مشمول SNAT یا DNAT باشد، آدرس‌ها و پورت‌ها مستقیماً روی سرآیند بسته اصلاح می‌شوند.
    • جایگذاری سرآیند لایه دو: آدرس MAC مقصد گام بعدی (که در مرحله اولیه ذخیره شده) بدون نیاز به جدول ARP در قاب اترنت درج می‌گردد.
    • تحویل به درایور فرستنده: بسته بدون ورود به کدهای مسیریابی لایه سوم (ip_forward)، مستقیماً از طریق dev_queue_xmit() به صف ارسال کارت شبکه هدایت می‌شود.

اگر بسته‌ای دارای پرچم TCP FIN یا RST باشد، یا دوره عدم فعالیت به پایان برسد، نشست از Flowtable حذف می‌گردد و بسته‌های بعدی برای اتمام استاندارد ارتباط به زنجیره عادی بازمی‌گردند.

مقایسه مسیر سریع نرم‌افزاری با برون‌سپاری به SmartNIC

زیرساخت Flowtable با توجه به سخت‌افزار سرور دو سطح از شتاب‌بخشی را ارائه می‌دهد:

معیار مسیریابی استاندارد لینوکس مسیر سریع نرم‌افزاری Flowtable برون‌سپاری سخت‌افزاری به SmartNIC
محل رهگیری زنجیره‌های متعدد (Pre/Fwd/Post) NF_INET_INGRESS (هسته) تراشه ASIC / TCAM روی کارت شبکه
محاسبات conntrack برای هر بسته مستقل فقط هنگام اتصال اولیه فقط هنگام اتصال اولیه
میزان بار روی پردازنده بالا (مشغول شدن هسته‌ها) پایین (عدم ورود به پشته IP) صفر درصد پردازنده برای جریان‌های فعال
تاخیر انتقال بسته ۱۵ تا ۳۵ میکروثانیه ۴ تا ۸ میکروثانیه کمتر از ۱.۵ میکروثانیه
نرخ پردازش PPS ۱.۵ تا ۳.۲ میلیون بسته در هسته ۶.۵ تا ۱۲.۰ میلیون بسته در هسته سرعت اسمی درگاه (بیش از ۱۰۰ گیگابیت)
نیازمندی سخت‌افزاری هر کارت شبکه اترنت هر کارت شبکه اترنت کارت‌های دارای TC offload (ملانوکس، E810)

برون‌سپاری سخت‌افزاری (Hardware Offload)

در سرورهای مجهز به کارت‌های شبکه پیشرفته (نظیر NVIDIA Mellanox ConnectX-5 و ConnectX-6 Dx یا Intel E810)، هسته لینوکس می‌تواند رکوردهای Flowtable را مستقیماً به حافظه سخت‌افزاری TCAM کارت ارسال نماید.

با فعال‌سازی دستور flags { offload; } در قواعد nftables، هسته قواعد جریان و تبدیل آدرس NAT را از طریق رابط switchdev به دستورات سخت‌افزاری ترجمه می‌کند. در این حالت بسته‌های داده بدون نیاز به مداخله پردازنده و تولید وقفه، کاملاً روی سیلیکون کارت شبکه مسیریابی و ارسال می‌شوند.

تاثیر Flowtable در زیرساخت‌های VPN

در گیت‌وی‌های پربار VPN، جریان داده به دو بخش تقسیم می‌شود:

  1. ترافیک رمزنگاری‌شده خارجی UDP: بسته‌های ورودی از اینترنت که به سمت موتور رمزگشایی هدایت می‌شوند (wg0، riceguard0، tun0).
  2. ترافیک هدایت‌شده داخلی: بسته‌های آشکارشده که پس از رمزگشایی باید میان شبکه‌های محلی، جداول مسیریابی مجازی (VRF) یا اینترنت از طریق NAT توزیع شوند.

به‌کارگیری Flowtable مزایای فنی قابل توجهی به همراه دارد:

۱. آزادسازی توان پردازشی برای پروتکل RiceGuard

در گیت‌وی‌های مجهز به RiceGuard که پذیرای ده‌ها هزار ارتباط همزمان هستند، کاهش تا ۶۰ درصدی دستورات بررسی بسته، توان پردازنده را متوجه الگوریتم‌های رمزنگاری ChaCha20-Poly1305 می‌کند. این امر موجب پایداری سیستم در زمان اوج بار و جلوگیری از افت بسته‌ها می‌گردد.

۲. مهار لرزش تاخیر (Jitter) در صدا و بازی

مکالمات صوتی (VoIP SIP/RTP) و داده‌های بازی آنلاین پورت‌های ثابت دارند. با کمک Flowtable، بیش از ۹۹.۸ درصد این بسته‌ها از مسیر سریع عبور می‌کنند. زمان حضور بسته در لینوکس از ۲۵ میکروثانیه به کمتر از ۵ میکروثانیه کاهش می‌یابد و تداخل ترتیب بسته‌ها در هسته‌های مختلف از بین می‌رود.

۳. هماهنگی با مدیریت کیفیت خدمات (QoS)

هنگامی که بسته از طریق dev_queue_xmit() از مسیر سریع خارج می‌شود، به صف qdisc درگاه خروجی می‌پیوندد. مدیران می‌توانند Flowtable را با FQ-CoDel یا CAKE ترکیب کنند تا ضمن بهره‌گیری از حداکثر توان کارت، بافربلوت را به طور کامل مهار نمایند.

پیکربندی عملیاتی nftables Flowtable

نمونه فایل پیکربندی استاندارد nftables برای راه‌اندازی Flowtable میان اینترفیس متصل به اینترنت (eth0) و شبکه داخلی یا اینترفیس تونل (eth1 / wg0):

#!/usr/sbin/nft -f

# پاکسازی قوانین قبلی
flush ruleset

table inet vpn_router {
    # ۱. تعریف جدول Flowtable متصل به اینترفیس‌ها
    flowtable ft_fastpath {
        hook ingress priority filter
        devices = { eth0, eth1 }
        # برای فعال‌سازی شتاب سخت‌افزاری در کارت‌های سازگار:
        # flags { offload; }
    }

    # ۲. زنجیره هدایت بسته‌ها (Forward chain)
    chain forward {
        type filter hook forward priority filter; policy drop;

        # فرستادن ارتباطات پایدار TCP و UDP به مسیر سریع
        meta l4proto { tcp, udp } flow add @ft_fastpath

        # پذیرش بسته‌های established و related در مسیر عادی
        ct state established,related accept

        # رد بسته‌های نامعتبر
        ct state invalid drop

        # اجازه آغاز ارتباطات جدید از شبکه داخلی به بیرون
        iifname "eth1" oifname "eth0" accept
    }

    # ۳. تبدیل آدرس مبدا (SNAT / Masquerade)
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;

        # مبدل‌سازی آدرس روی پورت خروجی
        oifname "eth0" masquerade
    }
}

بررسی و پایش عملکرد

پس از اجرای پیکربندی، وضعیت پردازش بسته‌ها را ارزیابی نمایید:

# مشاهده جریان‌های فعال در Flowtable و شمارنده‌های بسته
nft list flowtable inet vpn_router ft_fastpath

# مشاهده وضعیت اشکال‌زدایی سخت‌افزاری در sysfs
cat /sys/kernel/debug/netfilter/nf_flowtable/*

# مقایسه آمارهای conntrack در مسیرهای عادی و سریع
cat /proc/net/stat/nf_conntrack

خروجی دستور nft list flowtable میزان بایت‌ها و بسته‌ها را برای هر نشست نمایش می‌دهد. در صورت فعال بودن شتاب سخت‌افزاری، وضعیت [OFFLOAD] نشان‌دهنده پردازش مستقیم ترافیک در کارت شبکه است.

نکات کلیدی در پیاده‌سازی عملی

  1. تکه‌تکه شدن بسته‌ها (Fragmentation): ساختار Flowtable بسته‌های خردشده IP را بازسازی نمی‌کند. بسته‌هایی که سرآیند کامل لایه ۴ ندارند به مسیر conntrack بازمی‌گردند. پیکربندی تنظیم خودکار سقف سگمنت (TCP MSS Clamping) روی اینترفیس‌های تونل را مد نظر قرار دهید.
  2. به‌روزرسانی کلیدها (Re-keying): تونل‌هایی مانند WireGuard به طور مداوم کلیدهای ارتباطی را بازسازی می‌کنند. این بسته‌های کنترلی ساختار مستقل دارند و از مسیر عادی عبور می‌کنند، بدون آنکه خللی در جریان‌های فعال Flowtable ایجاد نمایند.
  3. پشتیبانی از کارت‌های مجازی: زیرسیستم Flowtable می‌تواند به ساب‌اینترفیس‌های VLAN (eth0.100) و درگاه‌های تجمیعی (Bonding) پیوند بخورد و در مراکز داده با معماری مدرن به‌خوبی عمل نماید.

تغییر رویه از بررسی تک‌تک بسته‌ها به ثبت یک‌باره ارتباط در مرحله راه‌اندازی، به گیت‌وی‌های لینوکسی VPN امکان می‌دهد به نرخ انتقال بالا با کمترین میزان تاخیر دست یابند.