xdp-forward(8) XDP program loader xdp-forward(8)

xdp-forward - لایه هدایت بسته مبتنی بر XDP

دستور xdp-forward یک لایه هدایت بسته‌ها با XDP است که هدایت بسته‌های شبکه را با استفاده از XDP شتاب‌بخشی می‌کند. برای استفاده از آن، کافی است آن را روی مجموعه‌ای از رابط‌های شبکه که می‌خواهید هدایت بسته بین آن‌ها تسریع شود، بارگذاری نمایید. سپس بخش فضای کاربری (Userspace) دستور xdp-forward برنامه‌های XDP را روی آن رابط‌ها پیکربندی و بارگذاری کرده و بسته‌ها را با استفاده از XDP_REDIRECT بین آن‌ها هدایت می‌کند؛ در این فرآیند، برای تعیین مقصد هر بسته از جدول مسیریابی هسته یا جدول جریان (flowtable) مربوط به netfilter استفاده می‌شود.

هر بسته‌ای که xdp-forward نحوه هدایت آن را نداند، به پشته شبکه ارسال شده و طبق معمول توسط هسته مدیریت می‌شود. بسته به حالتی که xdp-forward در آن بارگذاری شده است، این امر به رفتارهای هدایت متفاوتی منجر می‌گردد. بخش حالت‌های هدایت (FORWARDING MODES) را در ادامه ببینید.

نحو اجرای xdp-forward به صورت زیر است:

xdp-forward COMMAND [options]
Where COMMAND can be one of:
       load        - Load the XDP forwarding plane
       unload      - Unload the XDP forwarding plane
       help        - show the list of available commands

هر دستور و گزینه‌های آن در ادامه توضیح داده شده‌اند. همچنین می‌توانید از xdp-forward COMMAND --help برای مشاهده گزینه‌های هر دستور استفاده کنید.

دستور load لایه هدایت بسته XDP را روی فهرستی از رابط‌های شبکه بارگذاری می‌کند.

نحو دستور load به صورت زیر است:

xdp-forward load [options] <ifname...>

که در آن <ifname...> نام مجموعه‌ای از رابط‌های شبکه است که بسته‌ها باید بین آن‌ها هدایت شوند. یک برنامه XDP روی هر رابط بارگذاری خواهد شد و به گونه‌ای پیکربندی می‌شود که بسته‌ها را به تمام رابط‌های دیگر در آن مجموعه هدایت کند (با استفاده از جدول مسیریابی هسته برای تعیین رابط مقصد هر بسته).

گزینه‌های پشتیبانی‌شده عبارتند از:

مشخص می‌کند که xdp-forward در کدام حالت هدایت باید کار کند. بسته به حالت انتخاب‌شده، xdp-forward هدایت را به روش‌های مختلفی انجام می‌دهد که می‌تواند به رفتارهای متفاوتی منجر شود، از جمله اینکه کدام زیرمجموعه از پیکربندی‌های هسته (مانند قوانین دیوار آتش) در حین هدایت رعایت می‌شوند. برای توضیحات کامل درباره هر حالت، به بخش حالت‌های هدایت (FORWARDING MODES) در ادامه مراجعه کنید.

مشخص می‌کند که xdp-forward چگونه جستجوی جدول مسیریابی را در هسته لینوکس انجام دهد. برای توضیحات کامل درباره هر حالت، به بخش حالت‌های FIB (FIB MODES) در ادامه مراجعه کنید.

مشخص می‌کند که برنامه XDP در چه حالتی بارگذاری شود. مقادیر معتبر عبارتند از: native که حالت پیش‌فرض XDP درون درایور (in-driver) است؛ skb که باعث استفاده از حالت موسوم به حالت skb (همچنین معروف به generic XDP) می‌شود؛ hw که باعث می‌شود برنامه به سخت‌افزار منتقل (offload) شود؛ یا unspecified که انتخاب حالت را به هسته واگذار می‌کند (که اگر درایور پشتیبانی کند حالت native، وگرنه حالت generic را انتخاب خواهد کرد). توجه داشته باشید که استفاده از unspecified می‌تواند پیش‌بینی حالتی را که در نهایت برنامه در آن بارگذاری می‌شود دشوار سازد؛ به همین دلیل، مقدار پیش‌فرض native است. همچنین توجه داشته باشید که سخت‌افزارهایی با پشتیبانی از حالت hw نادر هستند: کارت‌های Solarflare (با درایور 'sfc') تنها دستگاه‌هایی با این پشتیبانی در هسته اصلی لینوکس محسوب می‌شوند.

فعال‌سازی ثبت گزارش‌های اشکال‌زدایی (دیباگ). برای دریافت جزئیات بیشتر، این گزینه را دو بار مشخص کنید.

نمایش خلاصه‌ای از گزینه‌های موجود.

دستور unload برای تخلیه برنامه‌ها از یک رابط شبکه استفاده می‌شود.

نحو دستور unload به صورت زیر است:

xdp-forward unload [options] <ifname...>

که در آن <ifname...> فهرست رابط‌هایی است که باید لایه هدایت بسته XDP از روی آن‌ها تخلیه شود. توجه داشته باشید که هرچند xdp-forward برنامه‌های XDP بارگذاری‌شده روی هر رابط را بررسی کرده و اطمینان حاصل می‌کند که فقط برنامه خود را تخلیه نماید، اما بررسی نمی‌کند که آیا فهرست رابط‌های داده‌شده دقیقاً همان فهرستی است که هنگام بارگذاری داده شده بود یا خیر. از این رو، ممکن است با دادن فهرستی متفاوت از رابط‌ها، یک تخلیه جزئی صورت گیرد که این امر می‌تواند به رفتارهای غیرمنتظره منجر شود.

گزینه‌های پشتیبانی‌شده عبارتند از:

فعال‌سازی ثبت گزارش‌های اشکال‌زدایی (دیباگ). برای دریافت جزئیات بیشتر، این گزینه را دو بار مشخص کنید.

نمایش خلاصه‌ای از گزینه‌های موجود.

ابزار xdp-forward از حالت‌های هدایت زیر پشتیبانی می‌کند (که توسط پارامتر --fwd-mode در دستور xdp-forward load انتخاب می‌شود):

در حالت هدایت fib، ابزار xdp-forward برای هر بسته یک جستجو در جدول مسیریابی هسته (یا FIB) انجام می‌دهد و بسته‌ها را بر اساس نتیجه این جستجو بین رابط‌های پیکربندی‌شده هدایت می‌کند. هر بسته‌ای که جستجوی آن با شکست مواجه شود، به پشته شبکه فرستاده خواهد شد. این شامل بسته‌هایی است که نیازمند کشف همسایه (Neighbour discovery) برای گام بعدی (Next hop) هستند؛ بدین معنا که بسته‌ها به صورت دوره‌ای (در ابتدا و زمانی که مدخل nexthop منقضی می‌شود) برای کشف گام بعدی به پشته هسته ارسال خواهند شد.

توجه داشته باشید که به جز جستجوی FIB، هیچ بررسی دیگری انجام نمی‌شود؛ به ویژه، این حالت زیرسیستم netfilter را به طور کامل دور می‌زند، بنابراین قوانین دیوار آتش قبل از هدایت بررسی نخواهند شد.

حالت عملیاتی flowtable در صورتی که flowtable سخت‌افزاری در دسترس نباشد، منطق flowtable نرم‌افزاری netfilter را به لایه XDP منتقل (offload) می‌کند. در حال حاضر xdp-forward تنها قادر است مدخل‌های TCP یا UDP مربوط به netfilter flowtable را به XDP منتقل نماید. کاربر باید flowtable را به طور جداگانه پیکربندی کند.

ابزار xdp-forward از حالت‌های FIB زیر پشتیبانی می‌کند (که توسط پارامتر --fib-mode در دستور xdp-forward load انتخاب می‌شود):

در حالت عملیاتی full، ابزار xdp-forward برای هر بسته یک جستجوی کامل در جدول مسیریابی هسته (یا FIB) انجام می‌دهد و بسته‌ها را بر اساس نتیجه این جستجو بین رابط‌های پیکربندی‌شده هدایت می‌کند. به ویژه، هرگونه قوانین مسیریابی مبتنی بر خط‌مشی (Policy routing) پیکربندی‌شده توسط کاربر را اعمال خواهد کرد.

حالت direct مانند full عمل می‌کند، با این تفاوت که فلگ BPF_FIB_LOOKUP_DIRECT را به روال جستجوی FIB ارسال می‌کند. این بدان معناست که در طول جستجو، هرگونه قوانین مسیریابی مبتنی بر خط‌مشی نادیده گرفته می‌شوند که این امر می‌تواند عملکرد را بهبود بخشد (اما طبیعتاً از خط‌مشی آن قوانین پیروی نخواهد کرد).

برای فعال‌سازی انتقال (offload) جدول جریان (flowtable) برای ترافیک tcp و udp بین کارت‌های شبکه n0 و n1، دستورات زیر را اجرا کنید:

#nft -f /dev/stdin <<EOF
table inet filter {
    flowtable ft {
        hook ingress priority filter
        devices = { n0, n1 }
    }
    chain forward {
        type filter hook forward priority filter
        meta l4proto { tcp, udp } flow add @ft
    }
}
EOF
#xdp-forward load -f flowtable n0 n1

برای آگاهی از جزئیات معنایی بارگذاری XDP و نیازمندی‌های سازگاری هسته، به libxdp(3) مراجعه کنید.

لطفاً هرگونه اشکال را در گیت‌هاب گزارش دهید: https://github.com/xdp-project/xdp-tools/issues

دستور xdp-forward توسط Toke Høiland-Jørgensen و بر پایه نمونه هسته xdp_fwd که در ابتدا توسط David Ahern نوشته شده بود، توسعه یافته است. این صفحه راهنما توسط Toke Høiland-Jørgensen نوشته شده است.

October 11, 2024 V1.6.3