سرویسها یا دایمنها میتوانند به دو صورت اجرا شوند:
- به صورت مستقل و standalone
- تحت نظارت و مدیریت سرویس inetd
inetd سرویسی است که وظیفه آن مدیریت کردن دیگر سرویسهاست. به همین دلیل به inetd یک Super Server میگویند. بنا به دلایلی شاید نخواهیم تا بعضی از سرویس ها را به طور مستقل اجرا کنیم. مثلا ممکن است که سرویس مورد نظر خیلی کم مورد استفاده قرار گیرد و اجرای مداوم آن صحیح نباشد. این گونه سرویس ها را میتوان تحت مدیریت و قیومیت inetd درآورد. تنها زمانی که درخواستی برای استفاده از یک سرویس رسید، آن سرویس صدا زده شده و وارد عمل میشود و بعد از پایان کار مجددا اجرای آن متوقف میشود.
در حقیقت inetd با قابلیتهایی که فراهم کرده باعث شده تا مدیریت بعضی از سرویس ها بسیار آسان تر انجام پذیرد. به مرور که با inetd آشنا شدید، دلایل استفاده از آن را هم خواهید فهمید.
inetd چگونه کار میکند؟
inetd بر روی پورت های خاصی منتظر رسیدن درخواست ها میماند. وقتی که درخواستی را دریافت کرد، بررسی میکند که این درخواست برای کدام برنامه ارسال شده است. سپس برنامه مورد نظر را فراخوانی کرده و درخواست رسیده را به آن برنامه تحویل میدهد. به طور کلی اگر سرویس هایی که معمولا کمتر مورد استفاده قرار میگیرند را تحت کنترل inetd درآوریم، فشار و بار وارده بر سیستم کمتر میشود. inetd معمولا درخواست های رسیده را به برنامههای مربوطه تحویل میدهد. اما تعدادی از پروتکل ها هستند که مستقیما توسط خود inetd مدیریت میشوند. تعدادی از این پروتکلها عبارتند از chargen,auth و daytime .
تنظیم inetd
برای فعال کردن این سرویس خط زیر را به فایل /etc/rc.conf اضافه کنید:
inetd_enable="YES"
خب دستور inetd هم تعدادی گزینه دارد که برای دیدن همه آنها میتوانید به inetd مراجعه کنید.
این گزینه ها را می توانید با دایرکتیو inetd_flags در فایل /etc/rc.conf برای inetd ارسال کنید. به صورت پیش فرض مقدار این دایرکتیو -wW -C 60 است. یعنی اینکه قابلیت TCP wrapping برای سرویس ها فعال بوده و هر آدرس IP فقط میتواند ۶۰ درخواست برای هر سرویس در هر دقیقه ارسال کند.
پیکربندی inetd توسط فایل /etc/inetd.conf صورت میگیرد. هنگامی که تغییری در این فایل ایجاد کردید، باید inetd را از انجام این تغییرات با خبر کنید تا فایل پیکربندی را مجددا بخواند. این کار بصورت زیر قابل انجام است:
# /etc/rc.d/inetd reload
در فایل پیکربندی، هر خط مشخص کننده یک سرویس یا دایمن است. با استفاده از کاراکتر # می توانید توضیحات دلخواه خود را در این فایل درج کنید. هر خط از فیلدهای زیر تشکیل میشود:
service-name socket-type protocol {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]] user[:group][/login-class] server-program server-program-arguments
یک مثال:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
service-name
این فیلد نام سرویسی که توسط دایمن مورد نظر ارائه میشود را مشخص میکند. این نام باید با فایل /etc/services منطبق باشد. زیرا این نام مشخص میکند که inetd باید بر روی چه پورتی منتظر رسیدن درخواست ها باشد. اگر سرویس جدیدی ایجاد شد، باید آن را به فایل /etc/services هم اضافه کنید.
socket-type
این فیلد می تواند یکی از مقادیرstream, dgram, raw, یا seqpacketرا داشته باشد. Stream برای اتصالات نوع TCP و همچنین dgram هم برای اتصالات نوع UDP استفاده میشوند.
protocol
این فیلد می تواند یکی از مقادیر زیر را داشته باشد:
پروتکل | توضیحات |
---|---|
tcp, tcp4 | TCP IPv4 |
udp, udp4 | UDP IPv4 |
tcp6 | TCP IPv6 |
udp6 | UDP IPv6 |
tcp46 | Both TCP IPv4 and v6 |
udp46 | Both UDP IPv4 and v6 |
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
wait|nowait مشخص میکند که آیا دایمن مورد نظر می تواند سوکتِ خودش را اداره کند یا نه.
سوکت های نوع dgram باید مقدار wait را بگیرند؛ در حالیکه سوکت های stream که معمولا چند-نخی هم هستند باید مقدار nowait را بگیرند.
هر دایمن میتواند از نظر تعدادِ نمونههای (instance) در حال اجرا محدودیت داشته باشد. وقتی که این تعداد به نهایت مقدار خود رسید، inetd دیگر دایمن جدیدی از آن نوع را اجرا نخواهد کرد. این محدودیت را می توانید توسط max-child اعمال کنید. مثلا اگر میخواهید از یک دایمن بیشتر از ۱۰ نمونه اجرا نشود، میتوانید /۱۰ را بعد از nowait قرار دهید. اگر /۰ را مشخص کنید، دایمن مورد نظر به صورت نامحدود اجرا خواهد شد.
می توانید یک آدرس IP را از نظر تعداد اتصالات در دقیقه محدود کنید. مثلا مقدار ۱۰ به این معنی است که IP مورد نظر نمی تواند بیشتر از ۱۰ اتصال در هر دقیقه برقرار کند. max-child-per-ip هم مشخص کننده تعداد نمونههایی از یک سرویس است که میتواند از طرف یک IP در هر زمانی اجرا شود. از این گزینهها می توانید برای جلوگیری از حملات DoS استفاده کنید.
در این فیلد، wait|nowait اجباری است. اما دیگر قسمتها اختیاری هستند و میتوانید آنها را مشخص نکنید.
user
این فیلد مشخص میکند که دایمن مورد نظر باید توسط کدام کاربر اجرا شود. بیشتر دایمنها توسط root اجرا میشوند. بنابر اهداف امنیتی، بعضی از سرویس ها توسط کاربر daemon یا حتی توسط کاربر nobody (که کمترین امتیازات را داراست) اجرا میشوند.
server-program
این فیلد مشخص کننده مسیر کامل فایل اجرایی دایمن مورد نظر است. این فایل در هنگام رسیدن درخواست ها اجرا خواهد شد. اگر سرویس مورد نظر مستقیما توسط inetd اداره میشود، باید از کلمه ‘’internal’’ استفاده شود.
server-program-arguments
اگر میخواهید برای فایل اجرایی دایمن مورد نظر آرگومان هایی را ارسال کنید، می توانید این آرگومان ها را در این قسمت وارد کنید. مثلا اگر میخواهید دایمنی به نام mydaemon را با گزینه –d فراخوانی کنید، مقدار mydaemon –d را در این فیلد وارد کنید. اگر دایمن مورد نظر یکی از دایمنهای داخلی inetd است، عبارت ‘’internal’’ را در این فیلد وارد کنید.