INNBIND(8) InterNetNews Documentation INNBIND(8)

innbind - اتصال سوکت‌های ممتاز برای INN

innbind [-p] fd,family,address,port [...]

برنامه کمکی innbind برای اجرای مستقیم در نظر گرفته نشده است. در عوض، innd و nnrpd از آن به‌صورت داخلی برای اتصال به درگاه‌هایی که نیاز به دسترسی‌های ریشه (root) دارند، استفاده می‌کنند.

این برنامه باید به‌صورت setuid root نصب شود تا innd یا nnrpd بتوانند به درگاه‌های زیر ۱۰۲۴ متصل شوند. تنها عملکردهایی که این برنامه مایل به انجام آن‌هاست، اتصال یک توصیف‌گر فایل باز به نشانی و درگاه مشخص‌شده، یا ایجاد یک سوکت جدید، متصل کردن آن، و بازگرداندن سوکت متصل‌شده به فراخواننده است. این برنامه فقط توسط کاربر news (همان‌طور که در زمان configure تعیین شده) قابل اجرا است و فقط به درگاه‌های ۱۱۹، ۴۳۳، ۵۶۳، یک درگاه اضافی که با آرگومان --with-innd-port در configure مشخص شده است، یا درگاه‌های شماره ۱۰۲۴ و بالاتر متصل خواهد شد.

هر آرگومان ورودی innbind باید فهرستی از چهار جزء جداشده با کاما باشد. جزء اول شماره توصیف‌گر فایل است که باید متصل شود، جزء دوم خانواده عددی سوکت (AF_INET یا AF_INET6) است، جزء سوم نشانی محلی برای اتصال است (در قالب چهارگانه با نقطه برای IPv4 و در قالب نشانی جداشده با دونقطه برای IPv6)، و جزء چهارم شماره درگاه است. برای اتصال به تمامی نشانی‌ها با IPv4، از "0.0.0.0" به‌عنوان نشانی استفاده کنید. برای اتصال به تمامی نشانی‌ها با IPv6، از "::" به‌عنوان نشانی استفاده کنید.

می‌توان چندین آرگومان را مشخص کرد تا به innbind دستور دهد چندین سوکت را به‌طور هم‌زمان متصل کند. هرگونه خطایی (به‌جز عدم اجازه دسترسی -- پایین‌تر را ببینید) که رخ دهد، باعث متوقف شدن innbind می‌شود، و پیام‌های خطا به syslog و خروجی استاندارد خطا ارسال خواهند شد.

به‌طور پیش‌فرض، innbind صرفاً تلاش می‌کند توصیف‌گر فایل از قبل باز را که از فراخواننده خود به ارث برده متصل کند. به ازای هر توصیف‌گر فایل با موفقیت متصل‌شده (به ترتیبی که در خط فرمان داده شده است)، innbind رشته "ok" و یک خط جدید را در خروجی استاندارد خود چاپ می‌کند.

با این حال در برخی سیستم‌ها (ظاهراً فقط سیستم‌های مبتنی بر STREAMS)، حتی یک برنامه setuid root نمی‌تواند سوکتی را که توسط فرآیندی بدون دسترسی ایجاد شده است، به یک درگاه ممتاز متصل کند. اگر innbind هنگام تلاش برای اتصال سوکت با خطای عدم اجازه دسترسی مواجه شود، رشته "no" و یک خط جدید را در خروجی استاندارد خود چاپ می‌کند. سپس یک سوکت جدید می‌سازد، آن را طبق مشخصات متصل می‌کند، و سپس سعی می‌کند با استفاده از ioctl متعلق به STREAMS با نام I_SENDFD آن سوکت را به فراخواننده بازگرداند. فراخواننده باید آن توصیف‌گر فایل را با I_RECVFD دریافت کرده و به جای توصیف‌گری که خودش ساخته بود، از آن استفاده کند.

توجه داشته باشید که انتقال توصیف‌گر فایل فقط در سیستم‌های مبتنی بر STREAMS پشتیبانی می‌شود، چرا که از طریق ioctl بر روی لوله (pipe) انجام می‌گیرد. با این حال تصور می‌شود آن سیستم‌ها دقیقاً همان سیستم‌هایی هستند که نمی‌توانند توصیف‌گر فایل به ارث رسیده را به سادگی متصل کنند. اگر نادرست بودن این فرض ثابت شود، روش سنتی BSD برای انتقال توصیف‌گر فایل از طریق سوکت دامنه یونیکس باید اضافه شود.

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

از آن‌جا که innbind معمولاً به‌صورت setuid root نصب می‌شود، امنیت برای آن مسئله‌ای حتی حساس‌تر از سایر بخش‌های INN است. این برنامه نسبتاً کوتاه است و چنانچه زبان C را می‌دانید، تشویق می‌شوید که خودتان آن را بازبینی کنید تا مطمئن شوید فقط همان کاری را انجام می‌دهد که باید انجام دهد. تنها توابع کتابخانه‌ای INN که استفاده می‌کند شامل توابع vector، توابع message برای گزارش خطا، و xstrdup است.

درگاه‌هایی که متصل خواهند شد محدود شده‌اند تا از حملات احتمالی که از طریق قابلیت اتصال به درگاه‌های با شماره پایین امکان‌پذیر می‌شوند (مانند آسیب‌پذیری‌های خانواده دستورات rsh(1) در برخی سیستم‌ها) جلوگیری شود. اگر innbind به‌صورت setuid root نصب شده باشد، فقط توسط کاربر news قابل اجراست تا از توانایی سایر کاربران سیستم برای اتصال حتی به همان تعداد معدود درگاه‌های ممتاز مجاز جلوگیری کند.

دستور innbind از هیچ فایل پیکربندی خارجی استفاده نمی‌کند؛ تنها فایل‌هایی که ممکن است باز کند از طریق سرویس سیستمی getpwnam(3) برای به‌دست آوردن UID کاربر news است. تنها ورودی کاربری که می‌پذیرد، آرگومان‌های خط فرمان آن است.

دستور innbind ممکن است پیام‌های زیر را در syslog ثبت کرده و آن‌ها را در خروجی استاندارد خطا چاپ کند.

(مهلک) innbind به تلاش برای ساخت یک سوکت جدید جهت اتصال برای آرگومان ارائه‌شده متوسل شد، اما ایجاد سوکت شکست خورد.
(مهلک) فراخوانی bind برای سوکت مربوط به آرگومان ارائه‌شده با خطای سیستمی شکست خورد. اگر خطا نشان‌دهنده عدم اجازه دسترسی (permission denied) باشد، مطمئن شوید که innbind به‌صورت setuid root تنظیم شده است. این خطا همچنین می‌تواند ناشی از تلاش برای استفاده از IPv6 روی سیستمی باشد که هسته آن از IPv6 پشتیبانی نمی‌کند.
(مهلک) بخش شماره درگاه در آرگومان خط فرمان ارائه‌شده، مربوط به درگاهی کمتر از ۱۰۲۴ است که ۱۱۹، ۴۳۳، ۵۶۳ یا درگاه داده‌شده به --with-innd-port در زمان configure نیست. سایر درگاه‌ها به دلایل امنیتی مجاز نیستند.
(مهلک) innbind نتوانست گزینه‌های سوکت را برای آن توصیف‌گر فایل دریافت کند. محتمل‌ترین دلیل این خطا ارسال شماره توصیف‌گر فایل اشتباه به innbind است (توصیف‌گر فایلی که باز نیست، یا به جای یک سوکت شبکه، به یک فایل معمولی مربوط می‌شود).
(مهلک) innbind نتوانست UID کاربر news را که هنگام configure مشخص شده بود (و به‌طور پیش‌فرض "news" است) دریافت کند. این حالت معمولاً به این معنی است که کاربر در فایل passwd سیستم وجود ندارد.
(مهلک) innbind یک سوکت جدید برای آرگومان ارائه‌شده ایجاد کرد اما نتوانست نشانی اتصال آن را به‌عنوان قابل استفاده مجدد علامت‌گذاری کند (گزینه سوکت SO_REUSEADDR).
(مهلک) innbind یک توصیف‌گر فایل جدید ایجاد و متصل کرد، اما نتوانست آن را با استفاده از ioctl متعلق به STREAMS با نام I_SENDFD، از طریق خروجی استاندارد خود به فراخواننده بازگرداند.
(مهلک) توصیف‌گر فایل ارائه‌شده یک سوکت SOCK_STREAM نیست. innbind فقط می‌تواند سوکت‌های SOCK_STREAM را متصل کند.
(مهلک) نشانی IPv4 مشخص‌شده در گزینه خط فرمان ارائه‌شده نتوانست توسط inet_aton(3) تجزیه شود. نشانی‌های IPv4 باید در قالب استاندارد چهارگانه با نقطه (10.2.3.4) مشخص شوند.
(مهلک) نشانی IPv6 مشخص‌شده در گزینه خط فرمان ارائه‌شده نتوانست توسط inet_pton(3) تجزیه شود. نشانی‌های IPv6 باید در قالب RFC 4291 (مانند 1080:0:0:0:8:800:200C:417A یا 1080::8:800:200C:417A) مشخص شوند.
(مهلک) آرگومان خط فرمان مشخص‌شده قابل تجزیه نبود یا در قالب صحیحی قرار نداشت.
(مهلک) بخش توصیف‌گر فایل در آرگومان خط فرمان ارائه‌شده، یک عدد صحیح غیرمنفی نیست.
(مهلک) بخش شماره درگاه در آرگومان خط فرمان ارائه‌شده، یک عدد صحیح غیرمنفی نیست.
(مهلک) بخش خانواده پروتکل در آرگومان خط فرمان ارائه‌شده، یک عدد صحیح غیرمنفی نیست. این مقدار در سیستمی که innbind روی آن اجرا می‌شود باید برابر با AF_INET یا AF_INET6 باشد.
(مهلک) در حالت setuid root، به دلایل امنیتی innbind تنها توسط کاربر news همان‌طور که در زمان configure تعیین شده (به‌طور پیش‌فرض "news") قابل اجرا است.
(مهلک) هیچ آرگومانی در خط فرمان داده نشده است (به‌جز شاید -p).
(مهلک) بخش شماره درگاه در آرگومان خط فرمان ارائه‌شده، صفر بوده است.
(مهلک) بخش شماره پروتکل در آرگومان خط فرمان ارائه‌شده، نه AF_INET و نه AF_INET6 است.

همان‌طور که در بالا ذکر شد، innbind هرگز مستقیماً اجرا نمی‌شود، بلکه تنها توسط innd و سایر برنامه‌هایی که نیاز به اتصال و گوش فرا دادن به درگاه‌های شبکه دارند اجرا می‌شود. فراخوانی‌های نمونه توسط innd به صورت زیر خواهد بود:

innbind 3,10,::,119

برای اتصال سوکت IPv6 روی توصیف‌گر فایل ۳ به درگاه ۱۱۹ و تمامی نشانی‌ها، یا:

innbind 6,2,10.0.0.3,433

برای اتصال سوکت IPv4 روی توصیف‌گر فایل ۶ به درگاه ۴۳۳ در نشانی 10.0.0.3.

نوشته‌شده توسط Russ Allbery <eagle@eyrie.org> برای InterNetNews.

inet_aton(3)، inet_pton(3)، innd(8)، nnrpd(8).

2022-07-10 INN 2.7.4