NNRPD(8) InterNetNews Documentation NNRPD(8)

nnrpd - کارساز NNTP برای کلاینت‌های خواننده خبر

nnrpd [-BDfnoSt] [-4 address] [-6 address] [-b address] [-c configfile] [-i initial] [-I instance] [-p port] [-P prefork] [-r reason] [-s padding]

nnrpd یک کارساز NNTP برای برنامه‌های خواننده خبر (newsreaders) است. این برنامه دستورات را از ورودی استاندارد خود دریافت کرده و پاسخ‌ها را در خروجی استاندارد ارسال می‌کند. معمولاً توسط innd(8) فراخوانی می‌شود و این توصیف‌کننده‌ها به یک اتصال کلاینت راه دور متصل هستند. همچنین nnrpd از اجرا به عنوان یک دیمن مستقل پشتیبانی می‌کند.

برخلاف innd(8)، برنامه nnrpd از تمامی دستورات NNTP مربوط به خواندن و ارسال خبر توسط کاربر پشتیبانی می‌کند. nnrpd از فایل readers.conf برای کنترل دسترسی افراد مجاز به پایگاه‌داده یوزنت (Usenet) استفاده می‌کند.

هنگام خروج، nnrpd آمار استفاده را از طریق syslog(3) گزارش می‌دهد.

nnrpd معمولاً از طریق innd (حالت پیش‌فرض) یا از طریق inetd(8)، xinetd(8) یا برنامه‌های معادل اجرا می‌شود. همچنین در بسیاری از موارد به صورت یک دیمن با گزینه -D اجرا می‌شود تا پشتیبانی از TLS را روی یک پورت اختصاصی فراهم کند.

nnrpd فایل‌های پیکربندی (readers.conf، inn.conf و inn-secrets.conf) را تنها در زمان راه‌اندازی و ایجاد پردازش (spawn) می‌خواند. بنابراین، هرگز نمی‌توانید رفتار کلاینتی را که از قبل متصل شده است تغییر دهید. از آنجا که برای هر اتصال یک پردازش جدید nnrpd ایجاد می‌شود، هرگونه تغییر در این فایل‌های پیکربندی فوراً برای تمامی اتصالات جدید اعمال خواهد شد. تنها یک استثنا وجود دارد: هنگامی که nnrpd با گزینه -D به عنوان دیمن اجرا می‌شود، هرگونه تغییر پیکربندی در inn.conf تا زمانی که nnrpd بازراه‌اندازی نشود اعمال نخواهد شد.

تنظیم nnrpdflags در inn.conf می‌تواند برای ارسال هر یک از گزینه‌های زیر به نمونه‌های nnrpd که مستقیماً از innd ایجاد می‌شوند استفاده شود. بسیاری از گزینه‌ها تنها زمانی معنا پیدا می‌کنند که از -D استفاده شود، بنابراین این گزینه‌ها نباید همراه با nnrpdflags به کار روند. همچنین به توضیحات مربوط به nnrpdflags در inn.conf(5) مراجعه کنید.

هنگامی که مقدار nnrpdloadlimit در inn.conf برابر با "0" نباشد، در صورتی که میانگین بار کاری سیستم (load average) بیشتر از آن مقدار باشد (معمولاً "16")، اتصالات را رد خواهد کرد. nnrpd همچنین می‌تواند از سوءاستفاده ارسال‌کنندگان پرترافیک از منابع سیستم جلوگیری کند. به توضیحات مربوط به عقب‌نشینی نمایی (exponential backoff) در inn.conf(5) مراجعه کنید.

nnrpd مقالات را از طریق یک سوکت دامنه یونیکس (UNIX domain socket)، یا در صورت عدم پشتیبانی از طریق یک سوکت دامنه INET، به کارساز محلی در حال اجرای innd تزریق می‌کند. اگر باید از کارساز دیگری برای تزریق استفاده شود، می‌توانید آن را با پارامتر nnrpdposthost در inn.conf تنظیم کنید. در صورتی که در طول تزریق نیاز به اطلاعات احراز هویت باشد، nnrpd از فایل passwd.nntp در pathetc استفاده خواهد کرد.

-4 address
پارامتر -4 به nnrpd دستور می‌دهد تا در صورت راه‌اندازی به عنوان دیمن مستقل با فلگ -D، به آدرس IPv4 مشخص‌شده متصل شود (bind). این آدرس باید یک آدرس IPv4 معتبر متعلق به یکی از رابط‌های میزبان محلی باشد. همچنین می‌تواند "0.0.0.0" باشد که به معنای اتصال به تمامی آدرس‌ها است (این حالت پیش‌فرض است).
-6 address
پارامتر -6 به nnrpd دستور می‌دهد تا در صورت راه‌اندازی به عنوان دیمن مستقل با فلگ -D، به آدرس IPv6 مشخص‌شده متصل شود (bind). این آدرس باید یک آدرس IPv6 معتبر متعلق به یکی از رابط‌های میزبان محلی باشد. همچنین می‌تواند "::0" باشد که به معنای اتصال به تمامی آدرس‌های IPv6 است.

به طور پیش‌فرض، nnrpd در حالت دیمن به هر دو آدرس IPv4 و IPv6 گوش می‌دهد. با استفاده از این گزینه، تنها به آدرس‌های IPv6 مشخص‌شده گوش خواهد داد. با این حال، در برخی سیستم‌ها مقدار "::0" باعث می‌شود که به تمامی آدرس‌های IPv4 نیز گوش دهد.

مشابه فلگ -4 است. گزینه -b برای سازگاری با نسخه‌های پیشین حفظ شده است.
در صورت تعیین، nnrpd تلاش‌های ورود به سیستم را برای مسدودسازی خودکار پس از چند تلاش ناموفق، به blocklistd(8) گزارش می‌دهد. برای استفاده از این فلگ، کتابخانه blocklist باید در زمان پیکربندی یافت شده باشد یا گزینه --with-blocklist در زمان configure مشخص شده باشد. برای اطلاعات بیشتر، بخش "پشتیبانی از BLOCKLISTD" در ادامه را ببینید.
به طور پیش‌فرض، nnrpd فایل پیکربندی readers.conf را می‌خواند تا نحوه احراز هویت اتصالات را تعیین کند. فلگ -c یک فایل جایگزین برای این منظور مشخص می‌کند. اگر نام فایل یک مسیر کامل نباشد، نسبت به pathetc در inn.conf در نظر گرفته می‌شود. (این مورد برای اجرای چندین نمونه از nnrpd روی پورت‌ها یا آدرس‌های IP مختلف با تنظیمات متفاوت کاربرد دارد.)
در صورت تعیین، این پارامتر باعث می‌شود nnrpd به عنوان دیمن عمل کند؛ یعنی خود را از ترمینال جدا کرده و در پس‌زمینه اجرا شود و برای هر اتصال یک پردازش جدید منشعب (fork) کند. به طور پیش‌فرض، nnrpd روی پورت NNTP (پورت ۱۱۹) گوش می‌دهد، بنابراین یا باید innd(8) روی پورت دیگری راه‌اندازی شود یا از پارامتر -p استفاده گردد. توجه داشته باشید که با این پارامتر، nnrpd تا زمان متوقف شدن به اجرا ادامه می‌دهد. این بدان معناست که فایل inn.conf را فقط یک بار در زمان راه‌اندازی می‌خواند و تا زمان بازراه‌اندازی هرگز دوباره آن را بازخوانی نمی‌کند. بنابراین اگر inn.conf تغییر یابد، nnrpd باید بازراه‌اندازی شود.

هنگامی که nnrpd در حالت دیمن راه‌اندازی می‌شود، شناسه پردازش (PID) خود را در فایلی درون دایرکتوری pathrun می‌نویسد. اگر nnrpd روی پورت ۱۱۹ (پیش‌فرض) گوش دهد نام این فایل nnrpd.pid خواهد بود، و در غیر این صورت نام آن nnrpd-%d.pid خواهد بود که در آن "%d" با پورتی که nnrpd برای گوش دادن به آن پیکربندی شده است جایگزین می‌شود (در صورتی که گزینه -p داده شده باشد و آرگومان آن "119" نباشد).

همچنین ممکن است بخواهید هنگام اجرای nnrpd به عنوان دیمن، از گزینه -s استفاده کنید.

در صورت تعیین، هنگام راه‌اندازی به عنوان یک دیمن مستقل با فلگ -D، nnrpd از ترمینال جدا نشده و در پیش‌زمینه اجرا می‌شود.
یک دستور اولیه برای nnrpd مشخص می‌کند. در صورت استفاده، با initial طوری برخورد می‌شود که گویی اولین دستور دریافت‌شده توسط nnrpd بوده است. پس از ارسال پاسخ، nnrpd اتصال را خواهد بست.
در صورت تعیین، زمانی که virtualhost در گروه‌های دسترسی در readers.conf تنظیم شده باشد، instance به عنوان بخش ثابت اضافی در Message-IDهای تولیدشده توسط nnrpd استفاده می‌شود؛ معمولاً از این گزینه زمانی استفاده می‌شود که خوشه‌ای از ماشین‌ها با همان نام میزبان مجازی وجود دارند و باید در هنگام ارسال مقالات از یکدیگر متمایز شوند.
فلگ -n تحلیل و تبدیل آدرس‌های IP به نام‌های میزبان (DNS resolution) را غیرفعال می‌کند. اگر فقط از محدودیت‌های مبتنی بر IP در readers.conf استفاده می‌کنید و مشکلی با ثبت آدرس‌های IP در گزارش‌های خود ندارید، استفاده از این فلگ می‌تواند سرعت را تا حدی افزایش دهد.
فلگ -o باعث می‌شود تمامی مقالات به جای ارسال به innd(8)، صف‌بندی (spool) شوند. برنامه rnews با فلگ -U باید به طور منظم از طریق cron فراخوانی شود تا به این مقالات رسیدگی کند. این فلگ زمانی مفید است که innd در حال پذیرش مقالات باشد و nnrpd به صورت مستقل یا با استفاده از inetd(8) راه‌اندازی شده باشد.
پارامتر -p به nnrpd دستور می‌دهد تا هنگام راه‌اندازی به عنوان دیمن مستقل با فلگ -D، روی port مشخص‌شده گوش دهد.
پارامتر -P به nnrpd دستور می‌دهد تا هنگام راه‌اندازی به عنوان دیمن مستقل با فلگ -D، به تعداد prefork پردازش فرزند را از پیش منشعب کرده (prefork) و در انتظار اتصالات نگه دارد.
اگر از فلگ -r استفاده شود، nnrpd اتصال ورودی را رد کرده و متن reason را به عنوان دلیل بازمی‌گرداند. این فلگ توسط innd(8) زمانی که متوقف (pause) یا محدود (throttle) شده است استفاده می‌شود. مقدار reason باید با کدگذاری UTF-8 باشد.
با دریافت هر دستور از کلاینت، nnrpd تلاش می‌کند آرایه "argv" خود را که حاوی عنوان پردازش است تغییر دهد تا دستوراتی مانند ps(1) بتوانند نام میزبان کلاینت متصل‌شده و دستوری را که در حال اجرا است چاپ کنند. برای دستیابی به نمایش کامل، می‌توان از فلگ -s با یک رشته طولانی به عنوان آرگومان آن استفاده کرد که با تغییر عنوان توسط nnrpd رونویسی خواهد شد.

هنگامی که innd برنامه nnrpd را ایجاد می‌کند، این فلگ را با آرگومانی متشکل از ۴۸ فاصله خالی به کار می‌برد.

در صورت تعیین، nnrpd به محض برقراری اتصال، مذاکره برای یک نشست TLS را آغاز می‌کند. برای استفاده از این فلگ، کتابخانه‌های SSL و crypto از OpenSSL باید در زمان پیکربندی یافت شده باشند، یا --with-openssl در زمان configure مشخص شده باشد. برای اطلاعات بیشتر در مورد اجرای nnrpd با پشتیبانی از TLS، بخش "پشتیبانی از TLS" را ببینید.
در صورت استفاده از فلگ -t، تمامی دستورات کلاینت و پاسخ‌های اولیه با گزارش در syslog ردگیری می‌شوند. این فلگ توسط innd(8) تحت کنترل دستور "trace" در ctlinnd(8) تنظیم می‌شود و با دریافت سیگنال SIGHUP وضعیت آن تغییر می‌کند (فعال/غیرفعال)؛ به signal(2) مراجعه کنید.

اگر INN با گزینه --with-openssl ساخته شده باشد یا کتابخانه‌های SSL و crypto متعلق به OpenSSL در زمان پیکربندی یافت شوند، nnrpd از خواندن خبر روی TLS (که با نام SSL نیز شناخته می‌شود) پشتیبانی خواهد کرد. برای کلاینت‌هایی که از دستور STARTTLS استفاده می‌کنند، به غیر از ایجاد یک گواهی TLS/SSL برای کارساز، به پیکربندی خاصی نیاز نیست. شما باید این کار را دقیقاً به همان روشی انجام دهید که برای یک وب‌سرور گواهی تولید می‌کنید.

اگر از یک گواهی خودامضا (self-signed) رضایت دارید (که البته در برخی کلاینت‌های خبرخوان هشدار ایجاد می‌کند)، می‌توانید پس از اجرای "make install" در هنگام نصب INN، با اجرای "make cert" یک گواهی در مسیر پیش‌فرض ایجاد و نصب کنید، یا اینکه دستورات زیر را اجرا نمایید:

umask 077
openssl req -new -x509 -nodes -out <pathetc>/cert.pem \
    -days 366 -keyout <pathetc>/key.pem
chown news:news <pathetc>/cert.pem
chmod 640 <pathetc>/cert.pem
chown news:news <pathetc>/key.pem
chmod 600 <pathetc>/key.pem

مسیرها را با موارد متناسب با نصب INN خود جایگزین کنید. این کار یک گواهی خودامضا ایجاد می‌کند که پس از یک سال منقضی می‌شود. برنامه openssl از شما سؤالات مختلفی درباره سازمانتان خواهد پرسید. نام دامنه کاملاً معتبر (FQDN) سرویس خبری خود (یا نام متعارف کارساز و یا یک نام مستعار اختصاصی برای سرویس خبری) را به عنوان نامی که گواهی برای آن صادر می‌شود وارد کنید.

سپس باید این پارامترهای inn.conf را با مسیرهای درست مقداردهی کنید:

tlscapath:      <pathetc>
tlscertfile:    <pathetc>/cert.pem
tlskeyfile:     <pathetc>/key.pem

اگر می‌خواهید از زنجیره کامل گواهی (certificate chain) استفاده کنید، می‌توانید آن را مستقیماً در tlscertfile قرار دهید (مانند دستورالعمل SSLCertificateFile در آپاچی). متناوباً، می‌توانید یک گواهی واحد را در tlscertfile قرار داده و از tlscafile برای گواهی‌های اضافی مورد نیاز برای تکمیل زنجیره، مانند گواهی ریشه مرجع صدور مجزا، استفاده کنید.

به طور ملموس‌تر، هنگام استفاده از گواهی‌های Let's Encrypt، فایل‌های Certbot را می‌توان به صورت زیر نصب کرد:

tlscapath:      /etc/letsencrypt/live/news.server.com
tlscertfile:    /etc/letsencrypt/live/news.server.com/fullchain.pem
tlskeyfile:     /etc/letsencrypt/live/news.server.com/privkey.pem

یا:

tlscapath:      /etc/letsencrypt/live/news.server.com
tlscafile:      /etc/letsencrypt/live/news.server.com/chain.pem
tlscertfile:    /etc/letsencrypt/live/news.server.com/cert.pem
tlskeyfile:     /etc/letsencrypt/live/news.server.com/privkey.pem

اطمینان حاصل کنید که مجوزهای دسترسی به درستی تنظیم شده باشند تا کاربر news یا گروه news بتواند این دایرکتوری‌ها و فایل‌ها را بخواند (به طور معمول، باید به /etc/letsencrypt/live/news.server.com و /etc/letsencrypt/archive/news.server.com که کلیدهای واقعی در آنجا قرار دارند دسترسی داشته باشد، و کلید خصوصی نباید برای همگان خواندنی باشد).

اگر ترجیح می‌دهید به فایل‌های خارج از دایرکتوری Let's Encrypt اشاره کنید، می‌توانید یک هوک پس از تمدید (post-renewal hook) برای Let's Encrypt اضافه کنید تا فایل‌های تولیدشده را در مکان دیگری کپی کرده و دسترسی‌های مورد انتظار را به آن‌ها اختصاص دهد.

دو روش متداول برای کلاینت‌های خبری جهت مذاکره در مورد اتصال TLS وجود دارد: یا از طریق استفاده از یک پورت اختصاصی (معمولاً ۵۶۳) که در آن TLS بلافاصله پس از برقراری اتصال مذاکره می‌شود، یا از طریق روشی که اکنون (طبق RFC 8143) منع شده است، یعنی استفاده از دستور STARTTLS روی پورت معمول NNTP (پورت ۱۱۹) برای ارتقای پویا از ترافیک رمزگذاری‌نشده به ترافیک محافظت‌شده با TLS در طول یک نشست NNTP. با این حال، innd نحوه گوش دادن به اتصالات روی آن پورت مجزا (۵۶۳) را بلد نیست. بنابراین باید ترتیبی دهید که nnrpd از طریق ابزار دیگری روی آن پورت گوش دهد. این کار را می‌توان با فلگ -D به همراه "-p 563"; انجام داد و آن را در اسکریپت‌های آغازین (init scripts) خود قرار داد:

su news -s /bin/sh -c '<pathbin>/nnrpd -D -p 563 -S'

اما ساده‌ترین راه احتمالاً افزودن خطی مانند زیر است:

nntps stream tcp nowait news <pathbin>/nnrpd nnrpd -S

به /etc/inetd.conf یا فایل معادل آن در سیستم شما تا اجازه دهید inetd برنامه nnrpd را اجرا کند. (مسیر به nnrpd را متناسب با نصب خود تغییر دهید.) در صورتی که "nntps" در /etc/services سیستم شما تعریف نشده باشد، ممکن است نیاز باشد "nntps" را با "563" جایگزین کنید. همچنین ممکن است بخواهید از فلگ کوچک -s با یک رشته طولانی به عنوان آرگومان آن استفاده کنید تا اطلاعات بیشتری درباره اتصالات ورودی در خروجی ps(1) مشاهده نمایید.

به صورت اختیاری، می‌توانید پارامترهای tlsciphers، tlsciphers13، tlscompression، tlseccurve، tlspreferserverciphers و tlsprotocols را در inn.conf تنظیم کنید تا در صورت کشف هرگونه حمله جدید به پروتکل TLS یا برخی مجموعه‌های رمزنگاری پشتیبانی‌شده، رفتار مذاکره TLS/SSL را به طور دقیق تنظیم نمایید.

برنامه blocklistd(8) یک دیمن در FreeBSD/NetBSD برای جلوگیری از حملات بروت فورس (brute force) از طریق مسدودسازی مهاجمان پس از تعدادی تلاش ناموفق برای ورود است. هنگامی که nnrpd با پشتیبانی از blocklistd ساخته شود، تلاش‌های ورود را برای مسدودسازی احتمالی به دیمن blocklistd گزارش خواهد داد.

افزودن پیکربندی زیر به /etc/blocklistd.conf در بخش "[local]"، با این فرض که nnrpd روی پورت ۵۶۳ گوش می‌دهد، منجر به این می‌شود که مهاجمان پس از ۵ تلاش ناموفق برای ورود، به مدت ۱۰ دقیقه مسدود شوند.

# adr/mask:port type    proto owner name nfail disable
563             stream  *     *     *    5     10m

برای اطلاعات بیشتر، به مستندات blocklistd(8) مراجعه کنید.

برنامه nnrpd دستورات NNTP تعریف‌شده در RFC 3977 (NNTP)، RFC 4642 به‌روزرسانی‌شده توسط RFC 8143 (TLS/NNTP)، RFC 4643 (احراز هویت NNTP)، RFC 6048 (افزوده‌های LIST در NNTP) و RFC 8054 (فشرده‌سازی NNTP) را با تفاوت‌های زیر پیاده‌سازی می‌کند:

1.
دستور XGTITLE [wildmat] ارائه شده است. این افزونه توسط ANU-News استفاده می‌شود و در RFC 2980 مستند شده است. این دستور کد پاسخ "282" را برمی‌گرداند که پس از آن یک توضیح یک‌خطی از تمام گروه‌های خبری منطبق بر الگو قرار دارد. حالت پیش‌فرض، گروه فعلی است.

توجه داشته باشید که باید از LIST NEWSGROUPS به جای XGTITLE استفاده شود.

2.
دستور XHDR header [message-ID|range] پیاده‌سازی شده است. این دستور یک کد پاسخ "221" برمی‌گرداند که پس از آن فیلدهای سربرگ مشخص برای محدوده تعیین‌شده قرار می‌گیرند؛ حالت پیش‌فرض بازگرداندن داده‌ها برای مقاله فعلی است. به RFC 2980 مراجعه کنید.

توجه داشته باشید که باید از HDR به جای XHDR استفاده شود.

3.
دستور XOVER [range] ارائه شده است. این دستور کد پاسخ "224" را برمی‌گرداند که به دنبال آن داده‌های مرور اجمالی (overview) برای محدوده مشخص‌شده می‌آید؛ حالت پیش‌فرض بازگرداندن داده‌ها برای مقاله فعلی است. به RFC 2980 مراجعه کنید.

توجه داشته باشید که باید از OVER به جای XOVER استفاده شود.

4.
دستور جدیدی به نام XPAT header message-ID|range pattern [pattern ...] ارائه شده است. آرگومان اول نام حساس‌نبودن‌به‌حروف‌کوچک‌و‌بزرگ (case-insensitive) فیلد سربرگ مورد جستجو است. آرگومان دوم همان‌طور که در RFC 2980 مشخص شده است، یک محدوده مقاله یا یک شناسه پیام منفرد است. آرگومان سوم یک الگوی مبتنی بر شیوه uwildmat است؛ اگر آرگومان‌های بیشتری وجود داشته باشد، آن‌ها با یک فاصله از هم جدا شده و به یکدیگر می‌پیوندند تا الگوی کامل را تشکیل دهند. این دستور مشابه دستور XHDR است. کد پاسخ "221" را برمی‌گرداند که پس از آن پاسخ متنی تمامی شماره مقالاتی که با الگو مطابقت دارند قرار می‌گیرد.
5.
نام گروه خبری برای nnrpd به بزرگی و کوچکی حروف حساس است (case-sensitive).
6.
اگر قابلیت IHAVE اعلام شده باشد، لزوماً برای کل نشست اعلام نخواهد شد (برخلاف بخش 3.4.1 در RFC 3977). برنامه nnrpd تنها زمانی قابلیت IHAVE را اعلام می‌کند که واقعاً در دسترس باشد.
7.
برنامه nnrpd ساختار نحوی گسترده‌تری را برای الگوهای wildmat و محدوده‌ها مجاز می‌داند (به‌ویژه "-" و "-article-number").
8.
هنگامی که تولید کلمات کلیدی استفاده می‌شود (یک ویژگی آزمایشی که با پارامتر keywords در inn.conf فعال می‌شود)، عبارت "Keywords:full" در LIST OVERVIEW.FMT اعلام می‌شود، حتی با اینکه اطلاعات مرور اجمالی محاسبه می‌شوند و لزوماً از فیلدهای سربرگ Keywords به دست نمی‌آیند.

نوشته‌شده توسط Rich $alz <rsalz@uunet.uu.net> برای InterNetNews. پشتیبانی از مرور اجمالی (Overview) توسط Rob Robertston <rob@violet.berkeley.edu> و Rich در ژانویه ۱۹۹۳ اضافه شد. عقب‌نشینی نمایی (Exponential backoff برای ارسال) توسط Dave Hayes در فوریه ۱۹۹۸ اضافه گردید.

blocklistd(8), ctlinnd(8), innd(8), inn.conf(5), inn-secrets.conf(5), libinn_uwildmat(3), nnrpd.track(5), passwd.nntp(5), readers.conf(5), signal(2).

2026-06-12 INN 2.7.4