| dhclient-script(8) | System Manager's Manual | dhclient-script(8) |
نام (NAME)
dhclient-script - اسکریپت پیکربندی شبکه برای کلاینت DHCP
توضیحات (DESCRIPTION)
اسکریپت پیکربندی شبکه کلاینت DHCP هرازگاهی توسط dhclient(8) فراخوانی میشود. این اسکریپت توسط کلاینت DHCP برای تنظیم پیکربندی اولیه هر رابط شبکه پیش از درخواست آدرس، بررسی و آزمایش آدرس پس از پیشنهاد شدن آن، و اعمال پیکربندی نهایی رابط پس از دریافت اجارهنامه (lease) به کار میرود. اگر هیچ اجارهنامهای به دست نیاید، از این اسکریپت برای آزمایش اجارهنامههای از پیش تعریفشده (در صورت وجود) استفاده میشود و همچنین اگر هیچ اجارهنامه معتبری شناسایی نشود، یک بار فراخوانی میگردد.
این اسکریپت برای سفارشیسازی توسط کاربر نهایی در نظر گرفته نشده است. در صورت نیاز به سفارشیسازیهای محلی، این کار باید از طریق قلابهای (hooks) ورود و خروج ارائهشده انجام گیرد (برای جزئیات به بخش HOOKS مراجعه کنید). این قلابها به کاربر اجازه میدهند تا رفتار پیشفرض کلاینت را در ایجاد فایل /etc/resolv.conf بازنویسی کنند.
برای برخی سیستمعاملها اسکریپت کلاینت استانداردی وجود ندارد، حتی اگر خود کلاینت به درستی کار کند؛ بنابراین ممکن است یک کاربر پیشرو نیاز به ایجاد یک اسکریپت جدید یا تغییر اسکریپت موجود داشته باشد. به طور کلی، سفارشیسازیهای مختص به یک رایانه خاص باید در فایل ETCDIR/dhclient.conf انجام شوند. اگر متوجه شدید که نمیتوانید چنین سفارشیسازی را بدون ویرایش ETCDIR/dhclient.conf یا استفاده از قلابهای ورود و خروج انجام دهید، لطفاً یک گزارش اشکال ارسال کنید.
قلابها (HOOKS)
هنگام آغاز به کار، اسکریپت کلاینت ابتدا یک تابع شل به نام make_resolv_conf تعریف میکند که بعداً برای ایجاد فایل /etc/resolv.conf استفاده میشود. برای لغو رفتار پیشفرض، این تابع را در اسکریپت قلاب ورود (enter hook) مجدداً تعریف کنید.
پس از تعریف تابع make_resolv_conf، اسکریپت کلاینت وجود یک اسکریپت اجرایی به نام ETCDIR/dhclient-enter-hooks را بررسی میکند و در صورت وجود، آن را به صورت درونخطی و با استفاده از دستور نقطه (´.´) در شل Bourne اجرا مینماید. تمام متغیرهای محیطی مستندشده در بخش OPERATION در دسترس این اسکریپت قرار دارند و در صورت نیاز، این اسکریپت میتواند محیط را برای تغییر رفتار اسکریپت ویرایش کند. اگر خطایی در حین اجرای اسکریپت رخ دهد، میتواند متغیر exit_status را روی یک مقدار غیرصفر تنظیم کند و CLIENTBINDIR/dhclient-script بلافاصله پس از خروج اسکریپت کلاینت، با همان کد خطا خارج خواهد شد.
پس از اتمام تمام پردازشها، CLIENTBINDIR/dhclient-script وجود یک اسکریپت اجرایی به نام ETCDIR/dhclient-exit-hooks را بررسی میکند که در صورت وجود، با استفاده از دستور نقطه (´.´) اجرا میشود. وضعیت خروج dhclient-script از طریق متغیر شل exit_status به dhclient-exit-hooks منتقل خواهد شد و اگر اسکریپت در انجام وظیفهای که برای آن فراخوانی شده بود موفق شود، همیشه برابر صفر خواهد بود. مابقی متغیرهای محیطی که پیشتر برای dhclient-enter-hooks شرح داده شدند نیز در دسترس هستند. اسکریپت ETCDIR/dhclient-exit-hooks میتواند مقدار exit_status را تغییر دهد تا وضعیت خروج dhclient-script عوض شود.
عملیات (OPERATION)
هنگامی که dhclient نیاز به اجرای اسکریپت پیکربندی کلاینت دارد، مجموعهای از متغیرها را در محیط تعریف کرده و سپس CLIENTBINDIR/dhclient-script را اجرا میکند. در تمام موارد، متغیر $reason روی نام دلیلی که اسکریپت به خاطر آن فراخوانی شده است تنظیم میشود. دلایل زیر در حال حاضر تعریف شدهاند: MEDIUM، PREINIT، BOUND، RENEW، REBIND، REBOOT، EXPIRE، FAIL، STOP، RELEASE، NBI و TIMEOUT.
MEDIUM
کلاینت DHCP درخواست میکند نوع رسانه (media type) یک رابط شبکه تنظیم شود. نام رابط در $interface و نوع رسانه در $medium ارسال میشود.
PREINIT
کلاینت DHCP درخواست میکند که یک رابط شبکه بر اساس نیازها پیکربندی شود تا پیش از دریافت آدرس واقعی، توانایی ارسال بستهها را داشته باشد. برای کلاینتهایی که از کتابخانه سوکت BSD استفاده میکنند، این به معنای پیکربندی رابط با آدرس آیپی 0.0.0.0 و آدرس پخش (broadcast) برابر با 255.255.255.255 است. برای کلاینتهای دیگر ممکن است بالا آوردن ساده رابط (up) بدون تخصیص هیچ آدرس آیپی به آن کفایت کند. نام رابط در $interface و نوع رسانه در $medium ارسال میشود.
اگر یک نام مستعار آیپی (IP alias) در dhclient.conf تعریف شده باشد، آدرس آن در $alias_ip_address ارسال میشود و آن نام مستعار باید به همراه تمام مسیرهای منتهی به آن از رابط شبکه حذف شود.
BOUND
کلاینت DHCP اتصال اولیه (binding) به یک آدرس جدید را برقرار کرده است. آدرس آیپی جدید در $new_ip_address و نام رابط در $interface ارسال میشود. نوع رسانه در $medium قرار میگیرد. هر گزینهای که از سرور به دست آمده باشد، با استفاده از نام گزینه شرحدادهشده در dhcp-options ارسال میشود؛ با این تفاوت که خط تیرهها (´-´) برای تبدیل به متغیرهای معتبر شل با زیرخط (´_´) جایگزین شدهاند و نام متغیرها با new_ شروع میشود. بنابراین برای مثال، ماسک زیرشبکه جدید در $new_subnet_mask ارسال خواهد شد. گزینههای مربوط به یک حوزه (universe) غیرپیشفرض، نام آن حوزه را در ابتدای نام گزینه خواهند داشت؛ به عنوان مثال $new_dhcp6_server_id. گزینههایی که کلاینت صریحاً از طریق گزینه PRL یا ORO درخواست کرده باشد، با همان نام گزینه پیشین اما با پیشوند requested_ و با مقدار 1 ارسال میشوند، مانند requested_subnet_mask=1. چنین متغیری برای گزینههایی که توسط کلاینت درخواست نشدهاند یا گزینههایی که به گزینه درخواستی نیاز ندارند، مانند آدرس آیپی (*_ip_address) یا زمان انقضا (*_expiry) تعریف نمیشود.
پیش از پیکربندی واقعی آدرس، dhclient-script باید به نحوی برای آن ARP انجام دهد و در صورت دریافت پاسخ، با وضعیتی غیرصفر خارج شود. در این حالت، کلاینت یک پیام DHCPDECLINE به سرور ارسال میکند و آدرس متفاوتی به دست میآورد. این کار ممکن است در وضعیتهای RENEW، REBIND یا REBOOT نیز انجام شود، اما اجباری نیست و در واقع شاید مطلوب هم نباشد.
هنگامی که یک اتصال برقرار شد، احتمالاً پارامترهای شبکه متعددی باید تنظیم شوند. یک فایل /etc/resolv.conf جدید باید با استفاده از مقادیر $new_domain_name و $new_domain_name_servers (که ممکن است بیش از یک سرور را با فاصله از هم فهرست کند) ایجاد شود. یک مسیر پیشفرض باید با استفاده از $new_routers تنظیم گردد، و ممکن است لازم باشد مسیرهای ایستا با استفاده از $new_static_routes تعیین شوند.
اگر یک نام مستعار آیپی (IP alias) تعریف شده باشد، باید در اینجا تنظیم شود. آدرس آیپی مستعار در $alias_ip_address نوشته خواهد شد و سایر گزینههای DHCP که برای نام مستعار تنظیم شدهاند (مانند ماسک زیرشبکه) در متغیرهایی با نامگذاری مشابه آنچه پیشتر شرح داده شد ارسال میشوند؛ به جز اینکه به جای $new_ با $alias_ آغاز میشوند. باید دقت شود که در صورت یکسان بودن آدرس آیپی مستعار با آدرس آیپی متصلشده ($new_ip_address) نباید از آدرس مستعار استفاده گردد، زیرا در این حالت ممکن است سایر پارامترهای مستعار نادرست باشند.
RENEW
هنگامی که یک اتصال تجدید (renew) میشود، اسکریپت مانند BOUND فراخوانی میگردد؛ با این تفاوت که علاوه بر تمام متغیرهایی که با $new_ و $requested_ آغاز میشوند، مجموعه دیگری از متغیرها وجود دارند که با $old_ شروع میشوند. تنظیمات پایداری که ممکن است تغییر کرده باشند باید حذف شوند؛ برای مثال، اگر یک مسیر محلی به آدرس متصلشده در حال پیکربندی است، مسیر محلی قدیمی باید حذف شود. اگر مسیر پیشفرض تغییر کرده باشد، مسیر پیشفرض قدیمی باید حذف شود. اگر مسیرهای ایستا تغییر کرده باشند، مسیرهای قدیمی باید حذف گردند. در غیر این صورت، پردازش میتواند مانند BOUND انجام شود.
REBIND
کلاینت DHCP اتصال مجدد به یک سرور DHCP جدید برقرار کرده است. این وضعیت را میتوان مانند RENEW مدیریت کرد، با این تفاوت که اگر آدرس آیپی تغییر کرده باشد، جدول ARP باید پاکسازی شود.
REBOOT
کلاینت DHCP پس از راهاندازی مجدد، آدرس قدیمی خود را با موفقیت مجدداً به دست آورده است. این وضعیت میتواند مانند BOUND پردازش شود.
EXPIRE
کلاینت DHCP در تجدید اجارهنامه خود یا دریافت یک اجارهنامه جدید ناموفق بوده و مهلت اجارهنامه منقضی شده است. آدرس آیپی باید واگذار شود و تمام پارامترهای مرتبط با آن نیز مانند RENEW و REBIND حذف گردند.
FAIL
کلاینت DHCP قادر به برقراری ارتباط با هیچ سرور DHCP نبوده است و هیچیک از اجارهنامههای آزمایششده نیز معتبر شناخته نشدهاند. پارامترهای مربوط به آخرین اجارهنامه آزمایششده باید از پیکربندی خارج شوند. این وضعیت را میتوان به همان شیوه EXPIRE مدیریت کرد.
STOP
به dhclient اطلاع داده شده است که به صورت آرام متوقف شود؛ dhclient-script باید بر حسب مورد، رابط شبکه را از پیکربندی خارج کرده یا غیرفعال کند.
RELEASE
برنامه dhclient با استفاده از پرچم -r اجرا شده است که نشان میدهد مدیر سیستم مایل است اجارهنامه(ها) آزاد شوند. dhclient-script باید رابط شبکه را از پیکربندی خارج کرده یا غیرفعال کند.
NBI
بدون رابطهای پخش (No-Broadcast-Interfaces)... برنامه dhclient قادر به یافتن رابطی نبوده است که معتقد باشد باید DHCP را روی آن آغاز کند. اینکه dhclient-script در این شرایط چه کاری باید انجام دهد، کاملاً بر عهده پیادهساز است.
TIMEOUT
کلاینت DHCP موفق به برقراری ارتباط با هیچ سرور DHCP نشده است. با این حال، یک اجارهنامه قدیمی شناسایی شده و پارامترهای آن مانند BOUND ارسال شدهاند. اسکریپت پیکربندی کلاینت باید این پارامترها را آزمایش کند و اگر دلیلی دارد که آنها معتبر هستند، باید با مقدار صفر خارج شود. در غیر این صورت، باید با یک مقدار غیرصفر خارج گردد.
V6ONLY
کلاینت DHCPv4 گزینه درخواستی و معتبر v6-only-preferred را دریافت کرده است. سیستم باید IPv4 را روی رابط شبکه غیرفعال کند. از طرف خود، dhclient به مدت زمان V6ONLY_WAIT ثانیه (زمانسنجی که توسط این گزینه منتقل میشود و حداقل آن برابر با MIN_V6ONLY_WAIT است) پیش از بازگشت به وضعیت INIT منتظر میماند.
روش معمول برای آزمایش یک اجارهنامه این است که شبکه همانند وضعیت REBIND راهاندازی شود (چرا که این ممکن است برای آزمایش بیش از یک اجارهنامه فراخوانی شود) و سپس به اولین مسیریاب تعریفشده در $routers پیام پینگ ارسال گردد. اگر پاسخی دریافت شود، اجارهنامه باید برای شبکهای که رابط در حال حاضر به آن متصل است معتبر باشد. کاملتر خواهد بود اگر پینگ کردن تمام مسیریابهای فهرستشده در $new_routers و همچنین موارد فهرستشده در $new_static_routes امتحان شود، اما اسکریپتهای فعلی چنین کاری را انجام نمیدهند.
فایلها (FILES)
هر سیستمعامل عموماً باید فایل اسکریپت مخصوص به خود را داشته باشد، اگرچه فایلهای اسکریپت سیستمعاملهای مشابه ممکن است شبیه یا حتی یکسان باشند. فایلهای اسکریپت موجود در توزیع DHCP کنسرسیوم سامانههای اینترنتی در درخت توزیع زیر مسیر client/scripts قرار دارند و نام سیستمعاملهایی را دارند که برای کار روی آنها در نظر گرفته شدهاند.
اشکالات (BUGS)
اگر بیش از یک رابط شبکه استفاده شود، هیچ راه مشخصی برای جلوگیری از تداخل بین پارامترهای پیکربندی ارائهشده از سوی سرور وجود ندارد؛ برای مثال، اسکریپت اصلی dhclient-script فایل /etc/resolv.conf را بازنویسی میکند. اگر بیش از یک رابط پیکربندی شود، /etc/resolv.conf به طور مکرر با مقادیر ارائهشده توسط یک سرور و سپس سرور دیگر بازنشانی خواهد شد. با فرض اینکه اطلاعات ارائهشده توسط هر دو سرور معتبر است، این نباید مشکل واقعی ایجاد کند، اما میتواند گیجکننده باشد.
همچنین ببینید (SEE ALSO)
dhclient(8)، dhcpd(8)، dhcrelay(8)، dhclient.conf(5) و dhclient.leases(5).
نویسندگان (AUTHORS)
dhclient-script(8) توسط کنسرسیوم سامانههای اینترنتی (ISC) نگارش یافته است. برای کسب اطلاعات بیشتر در مورد Internet Systems Consortium، نشانی زیر را ببینید: https://www.isc.org