passt(1) General Commands Manual passt(1)

passt - اتصال شبکه‌ای حالت کاربری بدون امتیاز برای ماشین‌های مجازی
pasta - اتصال شبکه‌ای حالت کاربری بدون امتیاز برای فضاهای نام شبکه

passt [گزینه]...
pasta [گزینه]... [دستور [آرگومان]...]
pasta [گزینه]... PID
pasta [گزینه]... --netns [مسیر|نام]

passt (Plug A Simple Socket Transport) اتصال شبکه‌ای کامل و شبه‌محلی را برای ماشین‌های مجازی در حالت کاربری (user-mode) و بدون نیاز به هیچ‌گونه قابلیت ویژه یا امتیازات دسترسی، فراهم می‌کند.

صفحه داده (data plane) یک لایه ترجمه میان رابط شبکه مجازی لایه ۲ و سوکت‌های محلی لایه ۴ (TCP، UDP، ping) روی میزبان پیاده‌سازی می‌کند؛ به‌طوری که از دیدگاه شبکه، این تصور ایجاد می‌شود که فرآیندهای برنامه‌های موجود در ماشین مهمان مستقیماً روی میزبان محلی در حال اجرا هستند.

پیاده‌سازی‌های داخلی ARP، DHCP، NDP و DHCPv6 به‌گونه‌ای طراحی شده‌اند که پیکربندی شبکه‌ای متناسب و کاملاً شبیه به پیکربندی بومی میزبان را در اختیار مهمان قرار دهند. با گزینه‌های پیش‌فرض، ماشین مهمان و میزبان آدرس‌های IP، مسیرها و پیوندهای درگاه (port bindings) را به اشتراک می‌گذارند.

هدایت درگاه (Port forwarding) و ترجمه به سرویس‌های شبکه در حال اجرا در ماشین مهمان اجازه می‌دهد تا هم از میزبان‌های محلی و هم از راه دور در دسترس باشند.

برخلاف slirp4netns(1)، ابزار passt پشته کامل TCP را پیاده‌سازی نمی‌کند: لایه ترجمه TCP هیچ بافر داده باحفظ‌وضعیت (stateful) ندارد و با بازتاب دادن پارامترهای مشاهده‌شده یکی از طرفین (اندازه پنجره ازدحام، داده‌های تایید شده و غیره) به طرف مقابل عمل می‌کند.

در حال حاضر تنها هایپروایزر پشتیبانی‌شده qemu(1) است که از طریق یک سوکت دامنه یونیکس (UNIX domain socket) به passt متصل می‌شود. این قابلیت از نسخه 7.2 qemu به بعد پشتیبانی می‌شود. برای نسخه‌های قدیمی‌تر qemu، بسته کمکی qrap(1) را ببینید.

pasta (Pack A Subtle Tap Abstraction) کارکردی معادل با فضاهای نام شبکه (network namespaces) را فراهم می‌کند، مشابه آنچه passt برای ماشین‌های مجازی ارائه می‌دهد.

اگر PID یا --netns مشخص شده باشد، pasta به یک فضای نام کاربر و شبکه موجود متصل می‌شود. در غیر این صورت، pasta یک فضای نام کاربر و شبکه جدید ایجاد کرده و دستور داده‌شده یا یک پوسته (shell) پیش‌فرض را در این بستر اجرا می‌کند. یک دستگاه tap درون فضای نام شبکه ایجاد می‌شود تا اتصال شبکه را برقرار سازد.

تنها برای ترافیک محلی TCP و UDP، ابزار pasta به دلایل کارایی و سرعت، یک مسیر میان‌بر (bypass path) پیاده‌سازی می‌کند که سوکت‌های لایه ۴ را مستقیماً میان فضاهای نام init و هدف نگاشت می‌نماید.

مگر در مواردی که در ادامه قید شده باشد، اگر گزینه‌های متناقض یا متعددی داده شوند، آخرین گزینه اعمال می‌شود.

خروجی با جزئیات کامل، عدم ثبت لاگ در ثبت‌کننده رویدادهای سیستم (system logger).
خروجی با جزئیات فوق‌العاده بالا، نمایش تک‌تک بسته‌ها. گزینه --debug را نیز فعال می‌کند.
نمایش آمار رویدادها با حداقل فاصله زمانی DELAY ثانیه میان به‌روزرسانی‌ها. اگر هیچ رویدادی رخ ندهد، آماری نمایش داده نمی‌شود.
پیام‌های اطلاعاتی چاپ نشوند.
عدم اجرا در پس‌زمینه. این بدان معناست که فرآیند پس از شروع به یک فضای نام PID مجزا منتقل نمی‌شود، زیرا خود PID نمی‌تواند تغییر کند. حالت پیش‌فرض، انشعاب به پس‌زمینه است.
این گزینه هیچ تاثیری ندارد و صرفاً برای سازگاری با نسخه‌های پیشین حفظ شده است.

توجه داشته باشید که این گزینه پیکربندی منسوخ شده است و در نسخه‌های آینده حذف خواهد شد.

ثبت گزارش‌ها در فایل PATH، و عدم ارسال به ثبات رویدادهای سیستم.

مشخص کردن چندباره این گزینه منجر به ایجاد چندین فایل لاگ نمی‌شود: آخرین گزینه مشخص‌شده اعمال خواهد شد.

محدود کردن اندازه فایل لاگ به SIZE بایت. هنگامی که فایل لاگ پر شود، با حذف ورودی‌های قدیمی در ابتدای فایل، برای ورودی‌های جدید جا باز می‌شود. این محدودیت الزامی است. مقدار پیش‌فرض برابر با ۱۰۴۸۵۷۶ (۱ مگابایت) است.
تلاش برای تغییر هویت به UID داده‌شده و گروه متناظر (اگر UID داده شود)، یا به UID و GID داده‌شده در صورت تعیین هر دو. به عنوان جایگزین، می‌توان نام کاربری (login)، یا نام کاربری و نام گروه را ارسال کرد. این کار برای اجرا به امتیازات ویژه (یا UID موثر اولیه 0 یا قابلیت CAP_SETUID) نیاز دارد. در صورت اجرا به عنوان کاربر ریشه، پیش‌فرض تغییر به کاربر nobody است.
مسیر سوکت کنترل و پیکربندی که توسط pesto(1) برای به‌روزرسانی پویای پیکربندی passt یا pasta استفاده می‌شود.
نمایش پیام راهنما و خروج.
نمایش نسخه و خروج.
ضبط بسته‌های شبکه متصل به tap (یعنی سمت ماشین مهمان یا سمت فضای نام) در فایل file با فرمت pcap.

مشخص کردن چندباره این گزینه منجر به ایجاد چندین فایل ضبط بسته نمی‌شود: آخرین گزینه مشخص‌شده اعمال خواهد شد.

نوشتن PID خود در فایل file پس از پایان مقداردهی اولیه، قبل از انشعاب به پس‌زمینه (در صورتی که برای چنین کاری تنظیم شده باشد).
اختصاص مقدار mtu از طریق DHCP (گزینه 26) و NDP (گزینه نوع 5). مقدار صفر اختصاص MTU را غیرفعال می‌کند. به‌طور پیش‌فرض، MTU اعلان‌شده برابر با ۶۵۵۲۰ بایت است، یعنی حداکثر MTU در 802.3 منهای طول هدر 802.3، گرد شده به ۳۲ بیت (کلمات IPv4).
اختصاص addr برای IPv4 از طریق DHCP (yiaddr)، یا addr از طریق DHCPv6 (گزینه 5) و یک پیشوند مبتنی بر addr از طریق اعلان روتر NDP (گزینه نوع 3) برای یک addr در IPv6. یک پیشوند اختیاری /prefix_len (۰-۳۲ برای IPv4، ۰-۱۲۸ برای IPv6) می‌تواند با نمادگذاری CIDR الحاق شود (مثلاً 192.0.2.1/24). این روش جایگزینی برای استفاده از گزینه -n، --netmask است. ترکیب نمادگذاری CIDR با -n منجر به خطا می‌شود. اگر با این روش به یک آدرس IPv6 طول پیشوند اختصاص داده شود، در نسخه فعلی کد با مقدار پیش‌فرض ۶۴ بازنویسی می‌شود. این گزینه می‌تواند از صفر (برای مقادیر پیش‌فرض) تا دو بار (یک‌بار برای IPv4، یک‌بار برای IPv6) مشخص شود. به‌طور پیش‌فرض، آدرس‌های اختصاص‌یافته IPv4 و IPv6 از رابط‌های میزبانی که دارای اولین مسیر پیش‌فرض برای نسخه IP مربوطه هستند گرفته می‌شوند. اگر مسیر پیش‌فرضی موجود نباشد و رابطی با هر مسیری برای نسخه IP مشخص وجود داشته باشد، اولین رابط از میان آن‌ها انتخاب خواهد شد. در صورتی که چنین رابطی برای نسخه IP مشخص وجود نداشته باشد، آدرس محلی پیوند (link-local) به نشانی 169.254.2.1 برای IPv4 اختصاص داده می‌شود و هیچ آدرس دیگری برای IPv6 تخصیص نخواهد یافت.
اختصاص ماسک شبکه IPv4 با مقدار mask، بیان‌شده به‌صورت دهدهی نقطه‌دار یا تعداد بیت‌ها، از طریق DHCP (گزینه 1). همچنین می‌توان طول پیشوند را با استفاده از نمادگذاری CIDR همراه با گزینه -a، --address مشخص کرد (مثلاً -a 192.0.2.1/24). ترکیب -n با نمادگذاری CIDR منجر به خطا خواهد شد. اگر هیچ آدرسی مشخص نشده باشد، ماسک شبکه مرتبط با آدرس پذیرفته‌شده میزبان، در صورت وجود، استفاده می‌شود. اگر آدرسی مشخص شده باشد ولی بدون طول پیشوند باشد، ماسک شبکه بر اساس کلاس شبکه متناظر تعیین می‌گردد. در تمام موارد دیگر، ماسک شبکه با استفاده از طول پیشوند مشخص‌شده تعیین می‌شود.
استفاده از آدرس MAC مبدأ addr هنگام برقراری ارتباط با ماشین مهمان یا فضای نام هدف. مقدار پیش‌فرض، آدرس MAC مدیریت‌شده محلی 9a:55:9a:55:9a:55 است.
اختصاص addr برای IPv4 به عنوان دروازه پیش‌فرض (default gateway) از طریق DHCP (گزینه 3)، یا addr برای IPv6 به عنوان مبدأ برای پیام‌های اعلان روتر NDP و DHCPv6. این گزینه می‌تواند از صفر (برای مقادیر پیش‌فرض) تا دو بار (یک‌بار برای IPv4، یک‌بار برای IPv6) مشخص شود. به‌طور پیش‌فرض، دروازه‌های IPv4 و IPv6 از رابط میزبانی که دارای اولین مسیر پیش‌فرض برای نسخه IP مربوطه است گرفته می‌شوند. اگر مسیر پیش‌فرض از نوع چندمسیره (multipath) باشد، دروازه اولین روتر گام‌بعدی (nexthop) بازگردانده‌شده توسط هسته خواهد بود که بیشترین وزن را در مجموعه مسیرها دارد. اگر هیچ مسیر پیش‌فرضی موجود نباشد و تنها یک رابط با هر نوع مسیری وجود داشته باشد، آن رابط انتخاب خواهد شد. در صورتی که چنین رابطی برای نسخه IP مشخص وجود نداشته باشد، آدرس محلی پیوند 169.254.2.2 برای IPv4 و آدرس محلی پیوند fe80::1 برای IPv6 استفاده خواهد شد.

نکته: این آدرس‌ها همچنین به عنوان آدرس مبدأ برای بسته‌های ارسالی به ماشین مهمان یا فضای نام هدف که دارای آدرس مبدأ محلی یا loopback هستند استفاده می‌شوند، تا نگاشت ترافیک محلی به مهمان و فضای نام هدف امکان‌پذیر باشد. برای جزئیات بیشتر درباره این سازوکار، بخش نکات (NOTES) را در ادامه ببینید.

استفاده از رابط میزبان name برای استخراج آدرس‌ها و مسیرها. حالت پیش‌فرض استفاده از رابط‌های مشخص‌شده با --outbound-if4 و --outbound-if6، به ترتیب برای آدرس‌ها و مسیرهای IPv4 و IPv6 است.

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

استفاده از یک آدرس IPv4 addr به عنوان آدرس مبدأ برای اتصالات خروجی TCP، جریان‌های UDP و درخواست‌های ICMP در IPv4، یا یک آدرس IPv6 addr برای ارتباطات IPv6، از طریق متصل کردن سوکت‌های خروجی به آن. این گزینه می‌تواند از صفر (برای مقادیر پیش‌فرض) تا دو بار (یک‌بار برای IPv4، یک‌بار برای IPv6) مشخص شود. به‌طور پیش‌فرض، آدرس مبدأ توسط جدول‌های مسیریابی انتخاب می‌شود.
متصل کردن سوکت‌های خروجی IPv4 به رابط میزبان name، و استفاده از این رابط برای استخراج آدرس‌ها و مسیرهای IPv4 (مگر اینکه رابط دیگری از طریق -i، --interface مشخص شده باشد).

به‌طور پیش‌فرض، رابط تعیین‌شده توسط مسیر پیش‌فرض انتخاب می‌شود. اگر هیچ مسیر پیش‌فرضی موجود نباشد و فقط یک رابط با هر مسیری وجود داشته باشد، آن رابط انتخاب خواهد شد. در صورت عدم وجود چنین رابطی، سوکت‌های خروجی به رابط خاصی متصل نخواهند شد.

متصل کردن سوکت‌های خروجی IPv6 به رابط میزبان name، و استفاده از این رابط برای استخراج آدرس‌ها و مسیرهای IPv6 (مگر اینکه رابط دیگری از طریق -i، --interface مشخص شده باشد).

به‌طور پیش‌فرض، رابط تعیین‌شده توسط مسیر پیش‌فرض انتخاب می‌شود. اگر هیچ مسیر پیش‌فرضی موجود نباشد و فقط یک رابط با هر مسیری وجود داشته باشد، آن رابط انتخاب خواهد شد. در صورت عدم وجود چنین رابطی، سوکت‌های خروجی به رابط خاصی متصل نخواهند شد.

دستور دادن به ماشین مهمان (از طریق DHCP، DHCPv6 یا NDP) برای استفاده از addr (IPv4 یا IPv6) به عنوان کارساز نام (nameserver)، طبق پیکربندی (گزینه‌های --no-dhcp-dns و --dhcp-dns را ببینید)، به جای خواندن آدرس‌ها از /etc/resolv.conf. این گزینه می‌تواند چندین بار مشخص شود. تعیین -D none استفاده از آدرس‌های DNS را به‌طور کلی غیرفعال می‌کند. برخلاف آدرس‌های برگرفته از /etc/resolv.conf، آدرس addr بدون بازنگاشت به مهمان داده می‌شود. به عنوان مثال --dns 127.0.0.1 به مهمان دستور می‌دهد که از خود به عنوان کارساز نام استفاده کند، نه از میزبان.
نگاشت آدرس addr (IPv4 یا IPv6) آن‌گونه که از سمت مهمان یا فضای نام دیده می‌شود، به کارساز نام (با نسخه IP مربوطه) که توسط گزینه --dns-host تعیین شده است. تنها ترافیک UDP و TCP به پورت ۵۳ یا پورت ۸۵۳ نگاشت می‌شود. پاسخ‌ها با یک نگاشت معکوس بازگردانده می‌شوند. این گزینه می‌تواند از صفر تا دو بار (یک‌بار برای IPv4، یک‌بار برای IPv6) مشخص گردد.
پیکربندی کارساز نام میزبان که پرس‌وجوهای ارسالی از مهمان یا فضای نام به آدرس --dns-forward به آن هدایت خواهند شد. این گزینه می‌تواند از صفر تا دو بار (یک‌بار برای IPv4، یک‌بار برای IPv6) مشخص شود. به‌طور پیش‌فرض، اولین کارساز نام برگرفته از /etc/resolv.conf در میزبان است.
استفاده از فهرست جداشده با فاصله list برای مقاصد DHCP، DHCPv6 و NDP، به جای خواندن ورودی‌ها از /etc/resolv.conf. گزینه‌های --no-dhcp-search و --dhcp-search را ببینید. گزینه --search none فهرست جستجوی دامنه DNS را به‌طور کامل غیرفعال می‌کند (اگر نیاز دارید دامنه‌ای با نام "none" را جستجو کنید می‌توانید از --search none. استفاده کنید).
در حالت passt، آدرس‌های IPv4 از طریق DHCP (گزینه 23) یا آدرس‌های IPv6 از طریق اعلان روتر NDP (گزینه نوع 25) و DHCPv6 (گزینه 23) به عنوان تحلیل‌گرهای DNS اختصاص داده نشوند. به‌طور پیش‌فرض، تمام آدرس‌های پیکربندی‌شده ارسال می‌شوند.
در حالت pasta، اختصاص آدرس‌های IPv4 از طریق DHCP (گزینه 23) یا آدرس‌های IPv6 از طریق اعلان روتر NDP (گزینه نوع 25) و DHCPv6 (گزینه 23) به عنوان تحلیل‌گرهای DNS. به‌طور پیش‌فرض، آدرس‌های پیکربندی‌شده، در صورت وجود، ارسال نمی‌شوند.
در حالت passt، آدرس‌های فهرست جستجوی دامنه DNS از طریق DHCP (گزینه 119)، از طریق اعلان روتر NDP (گزینه نوع 31) و DHCPv6 (گزینه 24) ارسال نشوند. به‌طور پیش‌فرض، فهرست جستجوی دامنه DNS حاصل از پیکربندی ارسال می‌شود.
در حالت pasta، ارسال آدرس‌های فهرست جستجوی دامنه DNS از طریق DHCP (گزینه 119)، از طریق اعلان روتر NDP (گزینه نوع 31) و DHCPv6 (گزینه 24). به‌طور پیش‌فرض، فهرست جستجوی دامنه DNS حاصل از پیکربندی ارسال نمی‌شود.
غیرفعال کردن گرداننده پروتکل TCP. هیچ اتصال TCP در سمت میزبان پذیرفته نخواهد شد و بسته‌های TCP دریافتی از ماشین مهمان یا فضای نام هدف بدون هیچ هشداری دور ریخته می‌شوند.
غیرفعال کردن گرداننده پروتکل UDP. هیچ ترافیک UDP از سمت میزبان هدایت نخواهد شد و بسته‌های UDP دریافتی از ماشین مهمان یا فضای نام هدف بدون هیچ هشداری دور ریخته می‌شوند.
غیرفعال کردن گرداننده پروتکل ICMP/ICMPv6. درخواست‌های ICMP و ICMPv6 دریافتی از ماشین مهمان یا فضای نام هدف بدون هیچ هشداری دور ریخته می‌شوند. گزینه --no-ndp را نیز در بر می‌گیرد.
غیرفعال کردن کارساز DHCP. درخواست‌های کلاینت DHCP دریافتی از ماشین مهمان یا فضای نام هدف نادیده گرفته می‌شوند. در صورتی که هیچ دروازه‌ای روی مسیر پیش‌فرض IPv4 انتخاب‌شده وجود نداشته باشد، این گزینه به صورت ضمنی اعمال می‌شود.
غیرفعال کردن کشف همسایه (Neighbor Discovery). پیام‌های NDP دریافتی از مهمان یا فضای نام هدف نادیده گرفته می‌شوند. هیچ پیام NDP اولیه‌ای ارسال نخواهد شد.
غیرفعال کردن کارساز DHCPv6. درخواست‌های کلاینت DHCPv6 دریافتی از ماشین مهمان یا فضای نام هدف نادیده گرفته می‌شوند.
غیرفعال کردن اعلان‌های روتر (Router Advertisements). تقاضاهای روتر (Router Solicitations) دریافتی از ماشین مهمان یا فضای نام هدف نادیده گرفته می‌شوند.
اجازه به مشخص کردن هر آدرس اتصال (binding address) برای گزینه‌های -t و -u. معمولاً آدرس‌های اتصال باید آدرس‌هایی باشند که در حال حاضر روی میزبان پیکربندی شده‌اند. با --freebind، گزینه سوکت IP_FREEBIND یا IPV6_FREEBIND فعال شده و امکان استفاده از هر آدرسی را فراهم می‌کند. این گزینه معمولاً برای پیوند دادن آدرس‌هایی استفاده می‌شود که ممکن است در آینده روی میزبان پیکربندی شوند و در آن لحظه هدایت ترافیک بلافاصله شروع به کار خواهد کرد.
ترجمه addr برای ارجاع به میزبان. بسته‌های ارسالی از مهمان به addr به میزبان هدایت خواهند شد. در میزبان، چنین بسته‌هایی طوری به نظر می‌رسند که هم مبدأ و هم مقصد آن‌ها 127.0.0.1 یا ::1 است.

اگر addr برابر با 'none' باشد، هیچ آدرسی نگاشت نمی‌شود (این به معنی --no-map-gw است). تنها یک آدرس IPv4 و یک آدرس IPv6 می‌تواند ترجمه شود؛ اگر این گزینه چند بار مشخص شود، آخرین مورد اعمال می‌گردد.

حالت پیش‌فرض، ترجمه آدرس دروازه پیش‌فرض مهمان است، مگر اینکه --no-map-gw مشخص شده باشد که در این صورت هیچ آدرسی نگاشت نمی‌شود.

اتصالات TCP و ترافیک ردیابی‌نشده UDP که مقصد آن‌ها آدرس دروازه است، به میزبان بازنگاشت نشوند. در صورتی که هیچ دروازه‌ای روی مسیر پیش‌فرض انتخاب‌شده وجود نداشته باشد، یا برای هر یک از خانواده‌های آدرس فعال مسیر پیش‌فرضی موجود نباشد، این گزینه به صورت ضمنی اعمال می‌شود.
فعال کردن بازگشت به chroot() در صورتی که pivot_root() (که برای جابجایی به یک فایل‌سیستم خالی به منظور جداسازی دقیق‌تر استفاده می‌شود) با خطا مواجه شود. این گزینه برای یکپارچه‌سازی‌هایی که از tmpfs یا initramfs به عنوان فایل‌سیستم ریشه استفاده می‌کنند و pivot_root() در آن‌ها به دلیل خطای شناسه نامعتبر (EINVAL) قابل استفاده نیست، کاربرد دارد.

به‌طور پیش‌فرض، قابلیت بازگشت غیرفعال است. اگر pivot_root() ناموفق باشد، کل فرآیند ایزوله‌سازی و sandbox با شکست مواجه می‌شود.

ترجمه addr در مهمان به آدرسی برابر با آدرس اختصاص‌یافته به مهمان در میزبان. به این معنا که بسته‌های مهمان به addr به آدرس اختصاص‌یافته به مهمان با -a، یا به طور پیش‌فرض به آدرس سراسری (global) میزبان هدایت خواهند شد. این کار به مهمان اجازه می‌دهد به سرویس‌های موجود روی آدرس سراسری میزبان دسترسی داشته باشد، حتی اگر آدرس خود مهمان آدرس میزبان را بپوشاند (shadow کند).

اگر addr برابر با 'none' باشد، هیچ آدرسی نگاشت نمی‌شود. تنها یک آدرس IPv4 و یک آدرس IPv6 قابل ترجمه هستند و اگر این گزینه چند بار مشخص شود، آخرین مورد برای هر نوع آدرس اعمال خواهد شد.

به‌طور پیش‌فرض، نگاشت همان‌طور که برای گزینه --map-host-loopback توضیح داده شد انجام می‌شود.

-4, --ipv4-only
فعال کردن عملکرد فقط IPv4. ترافیک IPv6 نادیده گرفته خواهد شد. به‌طور پیش‌فرض، عملکرد IPv6 تا زمانی که حداقل یک مسیر IPv6 و یک آدرس رابط روی یک رابط میزبان مشخص پیکربندی شده باشد، فعال است.
-6, --ipv6-only
فعال کردن عملکرد فقط IPv6. ترافیک IPv4 نادیده گرفته خواهد شد. به‌طور پیش‌فرض، عملکرد IPv4 تا زمانی که حداقل یک مسیر IPv4 و یک آدرس رابط روی یک رابط میزبان مشخص پیکربندی شده باشد، فعال است.
نام میزبان (hostname) برای پیکربندی روی کلاینت. ارسال name به عنوان گزینه 12 در DHCP (hostname).
نام کامل دامنه (FQDN) برای پیکربندی روی کلاینت. ارسال name به عنوان Client FQDN: گزینه 81 در DHCP و گزینه 39 در DHCPv6.
پیکربندی هدایت درگاه TCP به مهمان یا فضای نام. spec می‌تواند یکی از موارد زیر باشد:
عدم هدایت هیچ درگاهی

یا

[address[%interface]/]ports ...

درگاه‌ها برای هدایت. به‌صورت اختیاری، یک آدرس شنود مشخص و نام رابط (از لینوکس 5.7 به بعد) می‌تواند تعیین شود.

ports فهرستی از ورودی‌ها است که با کاما از هم جدا شده‌اند و می‌تواند هر یک از موارد زیر باشد:

بازه شمول (Include range). هدایت شماره پورت‌های میان first و last (شامل هر دو) به پورت‌های میان tofirst و tolast روی آدرس toaddr. اگر toaddr حذف شود، آدرس مهمان یا فضای نام به‌طور خودکار تعیین می‌شود. اگر tofirst و tolast حذف شوند، برابر با همان مقادیر first و last فرض می‌شوند. اگر last حذف شود، برابر با first در نظر گرفته می‌شود.
~first[-last]
بازه عدم شمول (Exclude range). عدم هدایت شماره پورت‌های بین first و last. این گزینه بر بازه‌های شمول اولویت دارد.
هدایت تمام پورت‌های متصل‌نشده و غیرموقت (non-ephemeral) که تحت پوشش بازه‌های عدم شمول فوق نیستند، بر اساس مجوزها و قابلیت‌های فعلی، به پورت‌های متناظر روی آدرس toaddr. اگر toaddr حذف شود، آدرس مهمان یا فضای نام به‌طور خودکار تعیین می‌شود. برای پورت‌های پایین (کمتر از ۱۰۲۴)، بخش نکات (NOTES) را ببینید. برای پورت‌های غیرقابل‌دسترس هیچ خطایی گزارش نمی‌شود، مگر اینکه هیچ پورتی اصلاً امکان هدایت نداشته باشد.
تنها برای pasta. تنها پورت‌هایی از مجموعه مشخص‌شده را هدایت کن که پورت‌های هدف در فضای نام متصل (bound) شده باشند. فهرست پورت‌ها به صورت دوره‌ای (هر یک ثانیه) از سوکت‌های شنود ارائه‌شده توسط /proc/net/tcp و /proc/net/tcp6 استخراج می‌شود، proc(5) را ببینید.

مشخص کردن بازه‌های عدم شمول به تنهایی به این معناست که تمام پورت‌های غیرموقت دیگر هدایت می‌شوند. تعیین نکردن هیچ بازه‌ای معادل با 'all' است. در این حالت، برای پورت‌های غیرقابل دسترس هیچ خطایی گزارش نمی‌شود، مگر اینکه هیچ پورتی قابل هدایت نباشد.

مثال‌ها:

-t all
هدایت تمام پورت‌های متصل‌نشده و غیرموقت طبق قابلیت‌های فعلی به پورت متناظر در ماشین مهمان یا فضای نام
-t ::1/all
برای آدرس محلی ::1، هدایت تمام پورت‌های متصل‌نشده و غیرموقت بر اساس قابلیت‌های فعلی
-t 22
هدایت پورت محلی 22 به پورت 22 در ماشین مهمان یا فضای نام
-t 22:23
هدایت پورت محلی 22 به پورت 23 در ماشین مهمان یا فضای نام
-t 22,25
هدایت پورت‌های محلی 22 و 25 به پورت‌های 22 و 25 در ماشین مهمان یا فضای نام
-t 22-80
هدایت پورت‌های محلی بین 22 و 80 به پورت‌های متناظر در ماشین مهمان یا فضای نام
-t 22-80:32-90
هدایت پورت‌های محلی بین 22 و 80 به پورت‌های بین 32 و 90 در ماشین مهمان یا فضای نام
-t 192.0.2.1/22
هدایت پورت محلی 22، متصل به 192.0.2.1، به پورت 22 در ماشین مهمان یا فضای نام
-t 192.0.2.1%eth0/22
هدایت پورت محلی 22، متصل به 192.0.2.1 و رابط eth0، به پورت 22
-t %eth0/22
هدایت پورت محلی 22، متصل به هر آدرسی روی رابط eth0، به پورت 22
-t 0.0.0.0/5000:192.0.2.5/6000
هدایت پورت محلی 5000، متصل به هر آدرس IPv4، به پورت 6000 روی آدرس 192.0.2.5.
-t 127.0.0.6/all:192.0.2.6
برای آدرس محلی 127.0.0.6، هدایت تمام پورت‌های متصل‌نشده و غیرموقت طبق قابلیت‌های فعلی به پورت متناظر روی 192.0.2.6.
-t 2000-5000,~3000-3010
هدایت پورت‌های محلی بین 2000 و 5000، به‌جز پورت‌های بین 3000 و 3010
-t 192.0.2.1/20-30,~25
برای آدرس محلی 192.0.2.1، هدایت پورت‌های بین 20 و 24 و همچنین بین 26 و 30
-t ~20000-20010
هدایت تمام پورت‌ها به ماشین مهمان، به‌جز بازه 20000 تا 20010
-t auto
هدایت خودکار هر پورتی که در فضای نام متصل شده باشد
-t ::1/auto
هدایت خودکار هر پورتی که در فضای نام متصل شده باشد، با شنود فقط روی آدرس محلی ::1
-t 8000-8010,auto
هدایت پورت‌ها در بازه 8000-8010 تنها در صورتی که در فضای نام متصل شده باشند

حالت پیش‌فرض برای passt برابر با none و برای pasta برابر با auto است.

پیکربندی هدایت پورت UDP به ماشین مهمان. پارامتر spec همانند آنچه برای TCP در بالا توضیح داده شد عمل می‌کند.

نکته: مگر در صورتی که بازنویسی شود، پورت‌های UDP با شماره‌های متناظر با پورت‌های هدایت‌شده TCP نیز بدون هیچ‌گونه ترجمه پورتی هدایت می‌شوند. پورت‌های متصل به IPv6 نیز برای IPv4 هدایت خواهند شد.

حالت پیش‌فرض برای passt برابر با none و برای pasta برابر با auto است.

مسیر سوکت دامنه یونیکس (UNIX domain socket) مورداستفاده توسط qemu(1) برای اتصال به passt. حالت پیش‌فرض، بررسی یک سوکت آزاد، بدون پذیرش اتصالات، از /tmp/passt_1.socket تا /tmp/passt_64.socket است.
فعال‌سازی vhost-user. سوکت دستور vhost-user توسط --socket فراهم می‌شود.
چاپ قابلیت‌های back-end در قالب فرمت JSON، تنها برای حالت vhost-user معنی‌دار است.
مسیر سوکت دامنه یونیکس مورداستفاده توسط ابزار کمکی passt-repair(1) برای اتصال به passt به منظور تنظیم یا پاک کردن گزینه TCP_REPAIR روی سوکت‌ها، در حین مهاجرت (migration). گزینه --repair-path none این رابط را غیرفعال می‌کند (اگر نیاز دارید یک مسیر سوکت به نام "none" تعیین کنید، می‌توانید پیشوند ./ را به مسیر اضافه کنید).

حالت پیش‌فرض، فقط برای حالت --vhost-user، افزودن پسوند .repair به مسیر انتخاب‌شده برای سوکت دامنه یونیکس هایپروایزر است. اگر در حالت --vhost-user نباشد هیچ سوکتی ایجاد نمی‌شود.

خروج پس از اتمام مهاجرت به عنوان مبدأ. به‌طور پیش‌فرض، passt در حال اجرا باقی می‌ماند و ماشین مهمان مهاجرت‌کرده می‌تواند به استفاده از اتصال خود ادامه دهد، یا یک مهمان جدید متصل شود.

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

بستن سوکت‌های TCP روی نمونه مبدأ به محض اتمام مهاجرت.

به‌طور پیش‌فرض، سوکت‌ها باز نگه داشته می‌شوند و رویدادهای روی سوکت‌های داده نادیده گرفته می‌شوند تا هرگونه پیام دیگری که پس از مهاجرت مبدأ به سوکت‌ها می‌رسد نادیده گرفته شود تا در صورت دریافت داده پس از مهاجرت، از بازنشانی اتصال (connection resets) جلوگیری شود.

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

ارسال یک سوکت از قبل بازشده و متصل به passt. معمولاً سوکت در فرآیند والد باز می‌شود و passt هنگام اجرا به عنوان فرآیند فرزند، آن را به ارث می‌برد. این امکان به فرآیند والد اجازه می‌دهد سوکت‌ها را با استفاده از یک خانواده آدرس دیگر یا نیازمند به امتیازات ویژه باز کند.

این گزینه پس از بسته شدن سوکت، رفتاری مشابه گزینه --one-off را به همراه دارد.

-1, --one-off
خروج پس از مدیریت یک اتصال تک‌کلاینت؛ به محض اینکه کلاینت سوکت را ببندد، یا به محض اینکه با خطای سوکت مواجه شویم.

نکته: این گزینه پس از اتمام مهاجرت passt به عنوان مبدأ هیچ تاثیری ندارد، زیرا در آن صورت، خروج سوکت‌ها را برای اتصالات فعال خواهد بست که به نوبه خود در صورت دریافت هرگونه داده بعدی باعث بازنشانی اتصال می‌شود. توضیحات گزینه --migrate-no-linger را نیز ببینید.

نام رابط tap که باید در فضای نام هدف ایجاد شود. به‌طور پیش‌فرض، نام رابط همانند نام رابط خارجی و قابل مسیریابی استفاده می‌شود. اگر چنین رابطی وجود نداشته باشد، از نام tap0 استفاده خواهد شد.
پیکربندی هدایت درگاه TCP از فضای نام هدف به فضای نام init. پارامتر spec همانند آنچه در بالا برای TCP توضیح داده شد تعریف می‌شود.

مقدار پیش‌فرض auto است.

پیکربندی هدایت درگاه UDP از فضای نام هدف به فضای نام init. پارامتر spec همانند آنچه در بالا برای UDP توضیح داده شد تعریف می‌شود.

مقدار پیش‌فرض auto است.

در صورت تعیین، اتصالاتی که با -t یا -u به یک آدرس loopback میزبان هدایت می‌شوند، به همان آدرس loopback در فضای نام تحویل داده خواهند شد. بدون این گزینه، چنین اتصالاتی به آدرس عمومی فضای نام هدایت می‌شوند. این گزینه با --no-splice ناسازگار است.
فضای نام کاربری هدف برای پیوستن، به صورت یک مسیر. اگر PID داده شود بدون این گزینه، فضای نام کاربری متناظر با همان فرآیند استفاده خواهد شد.
فضای نام شبکه هدف برای پیوستن، به صورت یک مسیر یا یک نام. یک نام مشابه با ip-netns(8) به عنوان معادل مسیری در /run/netns در نظر گرفته می‌شود.

این گزینه نمی‌تواند همراه با یک PID مشخص شود.

فقط به یک فضای نام شبکه هدف بپیوند، نه یک فضای نام کاربری، و برای اهداف ایزوله‌سازی (sandboxing) نیز فضای نام کاربری جدید ایجاد نکن. در صورتی که PATH یا NAME بدون --userns داده شوند، این گزینه به صورت ضمنی فعال است.
پس از حذف مرجع فضای نام هدف، از برنامه خارج نشو.

بدون این گزینه، اگر فضای نام شبکه هدف به سیستم‌فایل متصل (bound) باشد و مسیر داده‌شده حذف شود، یا اگر فضای نام شبکه هدف با یک ورودی procfs نشان داده شده باشد و آن ورودی حذف گردد (که نشان‌دهنده پایان فرآیند با PID داده‌شده است)، pasta خاتمه خواهد یافت.

پیکربندی شبکه در فضای نام: تنظیم آدرس‌ها و مسیرها طبق پیکربندی یا برگرفته از میزبان، و فعال‌سازی رابط tap.
همراه با --config-net، از کپی کردن تمام مسیرهای مرتبط با رابطی که آدرس‌ها و مسیرها را از آن می‌گیریم خودداری کن: فقط دروازه پیش‌فرض را تنظیم کن. به صورت ضمنی توسط -g, --gateway، فقط برای نسخه IP مربوطه فعال می‌شود.

حالت پیش‌فرض، کپی کردن تمامی ورودی‌های مسیریابی از رابط موجود در فضای نام بیرونی به فضای نام هدف، با تبدیل ویژگی رابط خروجی به رابط خروجی درون فضای نام است.

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

همراه با --config-net، از کپی کردن تمام آدرس‌های مرتبط با رابطی که آدرس‌ها و مسیرها را از آن می‌گیریم خودداری کن: تنها یک آدرس را تنظیم کن. به صورت ضمنی توسط -a, --address، فقط برای نسخه IP مربوطه فعال می‌شود.

حالت پیش‌فرض، کپی کردن تمام آدرس‌ها (به‌جز آدرس‌های link-local) از رابط فضای نام بیرونی به فضای نام هدف است.

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

پیکربندی آدرس MAC با مقدار addr روی رابط tap در فضای نام.

حالت پیش‌فرض واگذاری به درایور tap است تا یک آدرس سخت‌افزاری شبه‌تصادفی بسازد.

غیرفعال کردن مسیر میان‌بر برای ترافیک ورودی و محلی. برای جزئیات بیشتر، بخش مدیریت ترافیک محلی در pasta را در نکات (NOTES) ببینید.
هیچ دستگاه tap در فضای نام ایجاد نکن. در این حالت، pasta فقط ترافیک loopback را میان فضاهای نام هدایت می‌کند.

ایجاد و استفاده از یک فضای نام کاربر و شبکه جدید و متصل

$ iperf3 -s -D
$ pasta --config-net
# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
2: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65520 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether be:16:49:5a:65:dc brd ff:ff:ff:ff:ff:ff
    inet 88.198.0.164/27 brd 88.198.0.191 scope global noprefixroute enp9s0
       valid_lft forever preferred_lft forever
    inet6 2a01:4f8:222:904::2/64 scope global nodad 
       valid_lft forever preferred_lft forever
    inet6 fe80::bc16:49ff:fe5a:65dc/64 scope link nodad proto kernel_ll 
       valid_lft forever preferred_lft forever
# ip route show
default via 88.198.0.161 dev enp9s0 proto dhcp metric 1002 
88.198.0.160/27 dev enp9s0 proto dhcp scope link metric 1002 
# ip -6 route show
2a01:4f8:222:904::/64 dev enp9s0 proto kernel metric 256 pref medium
fe80::/64 dev enp9s0 proto kernel metric 256 pref medium
default via fe80::1 dev enp9s0 metric 1024 onlink pref medium
# iperf3 -c 127.0.0.1 -t1
Connecting to host 127.0.0.1, port 5201
[  5] local 127.0.0.1 port 59112 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  3.89 GBytes  33.4 Gbits/sec    0   2.62 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-1.00   sec  3.89 GBytes  33.4 Gbits/sec    0             sender
[  5]   0.00-1.00   sec  3.89 GBytes  33.4 Gbits/sec                  receiver
iperf Done.
# iperf3 -c ::1 -t1
Connecting to host ::1, port 5201
[  5] local ::1 port 49138 connected to ::1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  4.32 GBytes  37.0 Gbits/sec    0   1.06 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-1.00   sec  4.32 GBytes  37.0 Gbits/sec    0             sender
[  5]   0.00-1.00   sec  4.32 GBytes  37.0 Gbits/sec                  receiver
iperf Done.
# ping -nc1 -4 spaghetti.pizza
PING spaghetti.pizza (5.161.47.86) 56(84) bytes of data.
64 bytes from 5.161.47.86: icmp_seq=1 ttl=255 time=99.4 ms
--- spaghetti.pizza ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 99.433/99.433/99.433/0.000 ms
# ping -nc1 -6 spaghetti.pizza
PING spaghetti.pizza (2a01:4f8:1c1e:d6f1::1) 56 data bytes
64 bytes from 2a01:4f8:1c1e:d6f1::1: icmp_seq=1 ttl=255 time=3.11 ms
--- spaghetti.pizza ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.110/3.110/3.110/0.000 ms

اتصال به یک فضای نام کاربر و شبکه موجود

$ unshare -rUn
# echo $$
1295969

[از یک ترمینال دیگر]

$ pasta --config-net 1295969
Template interface: enp9s0 (IPv4), enp9s0 (IPv6)
Namespace interface: enp9s0
MAC:
    host: 9a:55:9a:55:9a:55
    NAT to host 127.0.0.1: 88.198.0.161
DHCP:
    assign: 88.198.0.164
    mask: 255.255.255.224
    router: 88.198.0.161
DNS:
    185.12.64.1
    185.12.64.2
    NAT to host ::1: fe80::1
NDP/DHCPv6:
    assign: 2a01:4f8:222:904::2
    router: fe80::1
    our link-local: fe80::1
Inbound forwarding rules (HOST):
    TCP [*]:1-32767  =>  1-32767  (best effort) (auto-scan)
    TCP [*]:61000-65535  =>  61000-65535  (best effort) (auto-scan)
    UDP [*]:1-32767  =>  1-32767  (best effort) (auto-scan)
    UDP [*]:61000-65535  =>  61000-65535  (best effort) (auto-scan)
Outbound forwarding rules (SPLICE):
    TCP [*]%lo:1-32767  =>  1-32767  (best effort) (auto-scan)
    TCP [*]%lo:61000-65535  =>  61000-65535  (best effort) (auto-scan)
    UDP [*]%lo:1-32767  =>  1-32767  (best effort) (auto-scan)
    UDP [*]%lo:61000-65535  =>  61000-65535  (best effort) (auto-scan)

[بازگشت به ترمینال اصلی]

# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
2: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65520 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 9a:44:5e:54:d3:2c brd ff:ff:ff:ff:ff:ff
    inet 88.198.0.164/27 brd 88.198.0.191 scope global noprefixroute enp9s0
       valid_lft forever preferred_lft forever
    inet6 2a01:4f8:222:904::2/64 scope global nodad 
       valid_lft forever preferred_lft forever
    inet6 fe80::9844:5eff:fe54:d32c/64 scope link nodad proto kernel_ll 
       valid_lft forever preferred_lft forever

راه‌اندازی و اتصال ماشین مهمان با هدایت پایه درگاه

$ passt -f -t 2222:22
UNIX domain socket bound at /tmp/passt_1.socket
No IPv6 nameserver available for NDP/DHCPv6
Template interface: enp9s0 (IPv4), enp9s0 (IPv6)
MAC:
    host: 9a:55:9a:55:9a:55
    NAT to host 127.0.0.1: 88.198.0.161
DHCP:
    assign: 88.198.0.164
    mask: 255.255.255.224
    router: 88.198.0.161
DNS:
    185.12.64.1
    185.12.64.2
    NAT to host ::1: fe80::1
NDP/DHCPv6:
    assign: 2a01:4f8:222:904::2
    router: fe80::1
    our link-local: fe80::1
Inbound forwarding rules (HOST):
    TCP [*]:2222  =>  22 
You can now start qemu (>= 7.2, with commit 13c6be96618c):
    kvm ... -device virtio-net-pci,netdev=s -netdev stream,id=s,server=off,addr.type=unix,addr.path=/tmp/passt_1.socket

[از یک ترمینال دیگر]

$ qemu-system-x86_64 -m 128 test.qcow2 -display none -nodefaults -nographic -device virtio-net-pci,netdev=s -netdev stream,id=s,server=off,addr.type=unix,addr.path=/tmp/passt_1.socket

[بازگشت به ترمینال اصلی]

accepted connection from PID 1301736
New guest MAC address observed: 52:54:00:12:34:56
DHCP: offer to discover
    from 52:54:00:12:34:56
DHCP: ack to request
    from 52:54:00:12:34:56
NDP: received RS, sending RA

[از یک ترمینال دیگر]

$ ssh -p 2222 root@localhost
root@localhost's password: 
[...]
# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 88.198.0.164/27 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a01:4f8:222:904:5054:ff:fe12:3456/64 scope global dynamic flags 100 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe12:3456/64 scope link 
       valid_lft forever preferred_lft forever

هر دو ابزار passt و pasta بسته به پیکربندی می‌توانند روی پورت‌هایی با آدرس loopback (شامل 127.0.0.0/8 یا ::1) متصل شوند. آدرس‌های مبدأ یا مقصد loopback باید پیش از تحویل بسته‌ها به ماشین مهمان یا فضای نام هدف تغییر داده شوند: اکثر سیستم‌عامل‌ها بسته‌های دریافتی با آدرس‌های loopback روی رابط‌های غیر-loopback را دور می‌ریزند، و همچنین برای مهمان یا فضای نام هدف غیرممکن خواهد بود که پاسخ‌ها را به عقب بازگردانند.

برای سهولت، آدرس مبدأ روی این بسته‌ها به آدرس مشخص‌شده توسط گزینه --map-host-loopback ترجمه می‌شود (با برخی استثناها در حالت pasta، بخش بعدی را ببینید). اگر این گزینه مشخص نشده باشد، این مقدار به صورت پیش‌فرض به آدرس دروازه پیش‌فرض IPv4 یا IPv6 (در صورت وجود) نسبت داده می‌شود -- چرا که مشخص است این آدرس یک آدرس معتبر و موجود روی همان زیرشبکه (subnet) است. اگر --no-map-gw یا --map-host-loopback none مشخص شده باشند، این ترجمه غیرفعال شده و بسته‌های حاوی آدرس loopback به سادگی دور ریخته می‌شوند.

آدرس‌های مقصد loopback به آدرس خارجی مشاهده‌شده ماشین مهمان یا فضای نام هدف ترجمه می‌شوند. برای IPv6، اگر آدرس مبدأ ترجمه‌شده یک آدرس link-local باشد، از آدرس link-local مشاهده‌شده استفاده می‌شود، در غیر این صورت از آدرس سراسری مشاهده‌شده استفاده خواهد شد. هم برای IPv4 و هم برای IPv6، اگر هنوز هیچ آدرسی مشاهده نشده باشد، آدرس‌های پیکربندی‌شده در عوض استفاده خواهند شد.

به عنوان مثال، اگر passt یا pasta اتصالی از 127.0.0.1 با مقصد 127.0.0.10 دریافت کنند، و دروازه پیش‌فرض IPv4 برابر با 192.0.2.1 باشد، در حالی که آخرین آدرس مبدأ مشاهده‌شده از مهمان یا فضای نام 192.0.2.2 باشد، این ارتباط به اتصالی از 192.0.2.1 به 192.0.2.2 ترجمه خواهد شد.

به همین ترتیب، برای ترافیکی که از مهمان یا فضای نام می‌آید، بسته‌هایی که آدرس مقصد آن‌ها با آدرس --map-host-loopback مطابقت دارد، آدرس مقصدشان به یک آدرس loopback ترجمه خواهد شد.

به عنوان یک استثنا، ترافیک شناسایی‌شده به عنوان DNS که ابتدا به آدرس --map-host-loopback ارسال شده باشد، در صورتی که این آدرس با آدرس تحلیل‌گر روی میزبان مطابقت داشته باشد، به loopback ترجمه نمی‌شود، بلکه همانند حالتی مدیریت می‌شود که به عنوان آدرس --dns-forward مشخص شده باشد (اگر چنین گزینه‌ای داده نشده باشد). در حالت رایجی که دروازه میزبان به عنوان تحلیل‌گر نیز عمل می‌کند، این کار مانع از آن می‌شود که نگاشت میزبان خود دروازه/تحلیل‌گر را بپوشاند.

بسته به پیکربندی، ابزار pasta می‌تواند به پورت‌های محلی در فضای نام init، در فضای نام هدف یا هر دو متصل شود و اتصالات و بسته‌ها را به پورت‌های متناظر در فضای نام دیگر هدایت کند.

برای جلوگیری از سربار غیرضروری، این اتصالات و بسته‌ها از طریق دستگاه tap متصل‌کننده فضاهای نام هدایت نمی‌شوند: pasta یک سوکت در فضای نام مقصد، با پروتکل لایه ۴ منطبق، ایجاد می‌کند و از آن برای هدایت داده‌های محلی استفاده می‌نماید. برای TCP، داده‌ها بین سوکت مبدأ و سوکت جدید با استفاده از فراخوان سیستمی splice(2) هدایت می‌شوند و برای UDP، یک جفت فراخوان سیستمی recvmmsg(2) و sendmmsg(2) انتقال بسته‌ها را انجام می‌دهند.

از آنجا که اتصال سوکت‌ها به آدرس‌های خارجی ممکن نیست، این مسیر میان‌بر تنها برای اتصالات و ترافیک محلی کاربرد دارد. این موضوع همچنین به این معنی است که ترجمه آدرس اندکی با حالت passt تفاوت دارد. اتصالات از loopback به loopback روی میزبان، طوری به نظر می‌رسند که گویی از آدرس عمومی فضای نام هدف در ماشین مهمان می‌آیند، مگر اینکه --host-lo-to-ns-lo مشخص شده باشد که در آن صورت به نظر می‌رسد از loopback درون فضای نام نیز می‌آیند. این رفتار اخیر پیش‌تر رفتار پیش‌فرض بود، اما معمولاً نامطلوب است، زیرا می‌تواند ناخواسته سرویس‌های محلی فضای نام را در معرض دید میزبان قرار دهد.

اگر پیکربندی هدایت درگاه نیازمند اتصال به پورت‌هایی با شماره کمتر از ۱۰۲۴ باشد، ابزارهای passt و pasta تلاش می‌کنند به آن‌ها متصل شوند، اما این کار با شکست مواجه خواهد شد، مگر اینکه یکی از موارد زیر برقرار باشد:

  • پارامتر sysctl مربوط به sys.net.ipv4.ip_unprivileged_port_start روی شماره پایین‌ترین پورتی که passt و pasta نیاز دارند تنظیم شود. به عنوان مثال، با کاربر root:
    sysctl -w net.ipv4.ip_unprivileged_port_start=443

    نکته: این روش توصیه‌شده برای فعال‌سازی اتصال passt و pasta به پورت‌های زیر ۱۰۲۴ است.

  • یا قابلیت CAP_NET_BIND_SERVICE در لینوکس اعطا شود، services(5) و capabilities(7) را ببینید.

    این روش به طور کلی توصیه نمی‌شود، زیرا passt و pasta ممکن است به عنوان برداری برای استفاده موثر از این قابلیت توسط فرآیند دیگری مورد استفاده قرار گیرند.

    با این حال، اگر محیط شما به اندازه کافی توسط یک LSM (ماژول امنیت لینوکس) مانند AppArmor، SELinux، Smack یا TOMOYO کنترل می‌شود، و هیچ فرآیند دیگری نمی‌تواند به واسطه این قابلیت با آن‌ها تعامل داشته باشد، اعطای این قابلیت تنها به passt و pasta می‌تواند به طور موثری مانع از بهره‌برداری سایر فرآیندها از آن شود.

    توجه داشته باشید که این روش برای تشخیص و هدایت خودکار درگاه‌ها با pasta کار نخواهد کرد، زیرا pasta در زمان اجرا این قابلیت را واگذار (رها) می‌کند.

    برای اعطای این قابلیت، می‌توانید به عنوان کاربر root دستور زیر را اجرا کنید:

    for p in $(which passt passt.avx2); do
    	setcap 'cap_net_bind_service=+ep' "${p}"
    done

درخواست‌های اکو (Echo requests) پروتکل‌های ICMP و ICMPv6 ارسالی از مهمان یا فضای نام هدف با استفاده از به اصطلاح سوکت‌های "ping" که در لینوکس 2.6.30 معرفی شدند مدیریت می‌شوند. برای حفظ شناسه اصلی (به RFC 792، صفحه 14 برای ICMP، و RFC 4443، بخش 4.1 برای ICMPv6 مراجعه کنید)، passt و pasta تلاش می‌کنند این سوکت‌ها را با استفاده از شناسه مبدأ مشاهده‌شده به عنوان "port" متصل کنند -- که با شناسه‌های Echo برای سوکت‌های "ping" مطابقت دارد.

از آنجا که خطاهای bind(2) با سیاست‌های امنیتی به شدت محدودکننده SELinux دیده شده است، یک سازوکار جایگزین شناسه‌های مختلف را به سوکت‌های مختلف نگاشت می‌کند، و شناسه‌ها در پاسخ‌ها به شناسه اصلی درخواست بازگردانده می‌شوند. با این حال، اگر bind(2) با شکست مواجه شود و سازوکار جایگزین استفاده شود، درخواست‌های اکو با شناسه‌های متفاوت، هرچند یکتا، هدایت خواهند شد.

برای کارکرد درخواست‌های اکو ICMP و ICMPv6، پارامتر ping_group_range باید شامل PID مربوط به passt یا pasta باشد، icmp(7) را ببینید.

هنگامی که pasta به یک فضای نام موجود متصل می‌شود، یا زمانی که یک فضای نام جدید ایجاد می‌کند، اطمینان حاصل خواهد کرد که رابط loopback به نام lo نیز بالا بیاید (UP شود). این کار برای اتصال پورت‌ها با استفاده از آدرس loopback در فضای نام الزامی است.

برای همگام‌سازی پنجره ارسال TCP از سوکت‌های لایه ۴ میزبان با پارامترهای TCP اعلان‌شده در سگمنت‌های TCP ارسال‌شده روی رابط لایه ۲، ابزارهای passt و pasta به طور منظم اندازه پنجره ارسال مشاهده‌شده توسط هسته روی سوکت مربوطه را با استفاده از گزینه سوکت TCP_INFO استعلام می‌کنند، tcp(7) را ببینید. پیش از لینوکس 5.3، یعنی پیش از کامیت 8f7baad7f035 هسته لینوکس ("tcp: Add snd_wnd to TCP_INFO")، پنجره ارسال (فیلد snd_wnd) در دسترس نیست.

اگر پنجره ارسال قابل استعلام نباشد، همیشه به عنوان اندازه بافر ارسال فعلی به ماشین مهمان یا فضای نام هدف اعلان خواهد شد. این موضوع ممکن است بر توان عملیاتی اتصالات TCP تأثیر بگذارد.

اگر passt و pasta نتوانند رابط میزبانی با آدرس پیکربندی‌شده برای یک نسخه IP خاص به جز آدرس‌های loopback پیدا کنند، مسلماً تلاشی برای استخراج آدرس‌ها یا مسیرها از میزبان برای آن نسخه IP انجام نخواهند داد.

در این حالت، مگر در صورت پیکربندی خلاف آن، آدرس محلی پیوند IPv4 به نشانی 169.254.2.1 را به ماشین مهمان یا فضای نام هدف اختصاص می‌دهند، و هیچ آدرس IPv6ای اختصاص نخواهد یافت. مفهوم آدرس IPv6 ماشین مهمان یا فضای نام هدف از اولین آدرس link-local مشاهده‌شده استخراج می‌شود.

دروازه‌های پیش‌فرض به عنوان آدرس محلی پیوند 169.254.2.2 برای IPv4 و آدرس محلی پیوند fe80::1 برای IPv6 اختصاص داده می‌شوند.

در حال حاضر، پروکسی IGMP/MLD (بر اساس RFC 4605) و پشتیبانی از SCTP (بر اساس RFC 4960) پیاده‌سازی نشده‌اند.

پروتکل TCP Selective Acknowledgment (بر اساس RFC 2018)، و همچنین حفاظت در برابر دنباله‌های پیچیده (PAWS) و اندازه‌گیری زمان رفت و برگشت (RTTM) که هر دو در RFC 7232 توصیف شده‌اند، در حال حاضر پیاده‌سازی نشده‌اند.

Stefano Brivio <sbrivio@redhat.com>, David Gibson <david@gibson.dropbear.id.au>.

لطفاً مشکلات را در سامانه ردیابی باگ در https://passt.top/passt/bugs گزارش دهید، یا پیامی به لیست پستی passt-user@passt.top ارسال نمایید، https://passt.top/passt/lists را ببینید.

حق نشر (c) 2020-2022 Red Hat GmbH.

ابزارهای passt و pasta نرم‌افزار آزاد هستند: شما می‌توانید آن‌ها را تحت شرایط مجوز عمومی همگانی گنو (GNU GPL) منتشرشده توسط بنیاد نرم‌افزارهای آزاد؛ نسخه ۲ یا (به انتخاب خودتان) هر نسخه بعدی، بازتوزیع کرده و/یا تغییر دهید.

namespaces(7), qemu(1), qrap(1), slirp4netns(1).

مستندات سطح بالا در نشانی https://passt.top/passt/about در دسترس است.