Featured image of post etc/resolve.conf/

etc/resolve.conf/

در لینوکس کوئری های DNS مسیر خاص خودشون رو سفر می‌کنند تا به جواب برسند. این پست حداقل این مسیر را در یک سیستم توضیح می‌دهد.

مقدمه

همیشه موقع ویرایش فایل resolve.conf برام سوال بود که گزین های دیگه‌ای که توی این فایل تنظیم شده‌اند چکاری انجام می‌دهند. درواقع من همیشه دستور namveserver را برای تغییر سرور dns ویرایش می‌کردم. اما دستور هایی دیگه‌ای هم برای این فایل وجود دارد که لیست آنها در man resolve.conf توضیح داده شده است.

توی این پست من بعضی از دستورات این فایل را توضیح می‌دم.

در مرحله اول یادتون باشه لینوکس هایی که systemd دارند، معمولا از سرویس systemd-resolved هم استفاده می‌کنند، این یک سرویس DNS لوکال است. در واقع دامنمه‌ها را resolve می‌کند و سپس آنها را کش می‌کند که یک دامنه را چندین بار resolve نکند.

یک دامنه حد اقل از دو بخش تشکیل می‌شود.

  1. TLD
  2. Domain
1
2
3
4
5
6
7
8
bin.example.com        
│     │     │         
│     │     └─► TDL(Top Level Domain) 
│     │               
│     └───────► Domain
└─────────────► SubDomain
                                                 

دستورات

  • 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 آن داخلی است.

1
2
# cat /etc/resolve.conf
nameserver 127.0.0.53

همانطور که توی نکته‌ای در مقدمه این پست گفتم، سیستم عاملی هایی که از systemd استفاده می‌کنند معمولا سرویس systemd-resolve را دارند که یک DNS داخلی است. این سرویس روی IP 127.0.0.53 و 127.0.0.54 شنود می‌کند.

این سرویس خودش یک کانفیگ در etc/ststemd/resolved.conf/ دارد.

اگر داخل این فایل را نگاه کنیم، می‌بنیم که در قسمت ‌DNS می‌توان NS های بالاتر را وارد کرد، اینکار باعث می‌شود که سیستم شما وقتی یک دامنه را در حافظه کش خود نداشت، از NS های بالاتر که در این فایل تنظیم شده است سوال کند.

1
2
[Resolve]
DNS=1.1.1.1 8.8.8.8

ابته تاکید کنم در صورتی از این NS ها استفاده می‌شود که شما ‌از 127.0.0.53 و 127.0.0.54 در کانفیگ /etc/resolve.conf استفاده کرده باشید.

تفاوت 127.0.0.54 این است که هر کوئری را مستقیم به NS بالاتر ارسال خواهد کرد و از دیتای کش شده استفاده نمی‌کند. ولی 127.0.0.53 از قابلیت کش استفاده می‌کند.


مثال

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 9.9.9.9

options ndots:1
options timeout:2
options attempts:3
options rotate

search server1 server2

سخنی با شما

این را بگم که DNS به صورت recursive(بازگشتی) عمل می‌کنه، این یعنی وقتی شما یک کوئری ارسال می‌کنید، این کوئری هر بار به یک سرور بالاتر ارسال می‌شود تا در نهایت به جواب برسه. و خب این موضوع خودش در نهایت یک جریان خیلی جالب داره که امیدوارم یک روز اون رو هم بنویسم :)

comments powered by Disqus
قدرت گرفته از Hugo
قالب Stack ساخته شده توسط Jimmy