مقدمه
همیشه موقع ویرایش فایل
resolve.conf
برام سوال بود که گزین های دیگهای که توی این فایل تنظیم شدهاند چکاری انجام میدهند.
درواقع من همیشه دستور
namveserver
را برای تغییر سرور
dns
ویرایش میکردم. اما دستور هایی دیگهای هم برای این فایل وجود دارد که لیست آنها در
man resolve.conf
توضیح داده شده است.
توی این پست من بعضی از دستورات این فایل را توضیح میدم.
در مرحله اول یادتون باشه لینوکس هایی که systemd دارند، معمولا از سرویس systemd-resolved هم استفاده میکنند، این یک سرویس DNS لوکال است. در واقع دامنمهها را resolve میکند و سپس آنها را کش میکند که یک دامنه را چندین بار resolve نکند.
یک دامنه حد اقل از دو بخش تشکیل میشود.
- TLD
- Domain
|
|
دستورات
1
nameserver
این دستور برای تعیین IP یک سرور DNS استفاده میشود.(در واقع اینجا منظورم یک سرویسی است که به نامه دامنه ها پاسخ دهد که به آن NS میگویم.)
شما میتوانید تا حداقل سه IP لیست کنید، و resolver سیستم شما به ترتیب به آنها کوئری خواهد زد. البته زمانی که اولین NS جواب گو نباشد، از دیگر NS های لیست شده استفاده خواهد شد.
اگر به همین ترتیب هر یک از NS ها جوابگو نباشد، کوئری ها از اول شروع میشود تا به حداکثر تعداد کوئری تعیین شده برسد.
برای مثال من میتوانم چند NS مختلف را برای خودم تعیین کنم.
1 2
nameserver 1.1.1.1 nameserver 8.8.8.8
2
options
برای این دستور متغیر های مختلفی را میتوان تعیین کرد.
2.1
ndots
حداقل هر دامنهای در سطح اینترنت یک نقطه دارد، برای مثال google.com یک نقطه دارد. شما میتوانید با این متغیر تعین کنید که دامنههای در سطح اینترنت باید چند نقطه داشته باشند، هر نقطه نشانه ساب دامنه است. برای مثال به صورت پیشفرض این متغیر 1 تنظیم شده است. به این معنی است که هر دامنهای یک نقطه داشت، این دامنه در سطح اینترنت است. ولی اگر شما مقدار این متغیر را 2 تنظیم کنید، دامنهای مثل
google.com
بعنوان دامنه لوکال تشخیص داده خواهد شد وhostname
شما به اول دامنه اضافه خواهد شد. مثلا اگرhostname
شماarya
باشد، دامنه به این شکل کوئری زده خواهد شدgoogle.com.arya
در صورتی که شما برای جست و جوی یک دامنه از هیچ TLD استفاده نکید، از
hostname
و یا از مقداری که برایsearch
مشخص کردهاید استفاده خواهد شد.
2.2
timeout
- این متغیر تعیین میکند که resolver چه مقدار زمانی باید منتظر جواب از سمت NS باشد، و اگر آن NS جواب نداد، از NS های بعدی سوال کند.
2.3
attempts
- این متغیر تعین میکند که resolver در صورت جواب ندادن توسط NS باید در نهایت چند کوئری دیگر ارسال کند.
برای مثال اگر اولین NS پاسخ نداد، سوال از NS دوم و به همین ترتیب از سوم پرسیده خواهد شد، تابه حداکثر مقدار attempts برسیم.(پس attempts مجوع سوال ها از همه NS ها است.)
2.4
rotate
- به صورت پیشفرض کوئری های DNS همه برای اولین NS لیست شده ارسال میشود و خب این باعث میشود که بار زیادی روی اولین NS باشد، برای اینکه این بار را بین همه NS ها تقسیم کنیم، کافیست از این متغیر استفاده کنیم. اینکار باعث میشود که هر کوئری ها به صورت چرخشی به ترتیب به NS های لیست شده ارسال شود.
- 3
search
همانطور که در مثال بالا گفتم، ما نام دامنه ها را تنظیم میکنیم که حداقل وقتی یک نقطه دارند، resolver آنها را دامنه در سطح اینترنت در نظر بگیرد و به NS کوئری بزند. ولی اگر هیچ نقطهای نداشت و یا شماndots
را بیشتر یا مساوی با 2 نتظیم کرده باشید،hostname
سیستم شما به آخر آن دامنه اضافه خواهد شد و یک دامنه داخلی (local) تلقی خواهد شد. اما اگر میخواهید قبل از اضافه شدنhostname
به آن چیز دیگری اضافه کنید، کافیست متغیر سرچ را تعریف کنید و یک یا چند مقدار برای آن تعیین کنید.
سرویس systemd-resolve
اگر به فایل /etc/resolve.conf نگاه کنید، میبینید که یک ns برای شما تنظیم شده است که IP آن داخلی است.
|
|
همانطور که توی نکتهای در مقدمه این پست گفتم، سیستم عاملی هایی که از systemd استفاده میکنند معمولا سرویس systemd-resolve را دارند که یک DNS داخلی است. این سرویس روی IP 127.0.0.53 و 127.0.0.54 شنود میکند.
این سرویس خودش یک کانفیگ در
etc/ststemd/resolved.conf/
دارد.
اگر داخل این فایل را نگاه کنیم، میبنیم که در قسمت DNS میتوان NS های بالاتر را وارد کرد، اینکار باعث میشود که سیستم شما وقتی یک دامنه را در حافظه کش خود نداشت، از NS های بالاتر که در این فایل تنظیم شده است سوال کند.
|
|
ابته تاکید کنم در صورتی از این NS ها استفاده میشود که شما از 127.0.0.53 و 127.0.0.54 در کانفیگ /etc/resolve.conf استفاده کرده باشید.
تفاوت 127.0.0.54 این است که هر کوئری را مستقیم به NS بالاتر ارسال خواهد کرد و از دیتای کش شده استفاده نمیکند. ولی 127.0.0.53 از قابلیت کش استفاده میکند.
مثال
|
|
سخنی با شما
این را بگم که DNS به صورت recursive(بازگشتی) عمل میکنه، این یعنی وقتی شما یک کوئری ارسال میکنید، این کوئری هر بار به یک سرور بالاتر ارسال میشود تا در نهایت به جواب برسه. و خب این موضوع خودش در نهایت یک جریان خیلی جالب داره که امیدوارم یک روز اون رو هم بنویسم :)