آموزشآموزش شبکه به زبان ساده

درس ۳۶ از ۹۹، شبکه و اینترنت، حدود ۱۸ دقیقه خواندن

DNS چیست؟

جواب کوتاه

DNS دفترچه‌تلفن اینترنت است: نام سایت را، مثل team.sefid.dev، می‌گیرد و نشانی IP سرور آن را، مثل 85.198.11.85، برمی‌گرداند. این کار لازم است، چون آدم‌ها نام را به خاطر می‌سپارند و دستگاه‌ها فقط با عدد همدیگر را پیدا می‌کنند.

دفترچه‌تلفن اینترنت

شماره‌ی تلفن دوستتان را حفظ نیستید. نامش را در گوشی می‌زنید و گوشی شماره را پیدا می‌کند. شما با نام کار دارید، تلفن با شماره.

اینترنت هم همین‌طور است. هر دستگاهی که به اینترنت وصل است، یک نشانی عددی دارد که به آن نشانی IP می‌گویند (درس IP چیست). سرور هر سایت هم یکی از همین دستگاه‌هاست. ولی کسی نشانی 85.198.11.85 را به خاطر نمی‌سپارد؛ همه team.sefid.dev را می‌زنند.

پس کسی باید نام را به عدد تبدیل کند. این کار DNS است. هر بار که نشانی سایتی را می‌زنید، روی پیوندی می‌زنید یا ایمیلی می‌فرستید، اول DNS می‌پرسد «این نام، کدام عدد؟» و بعد کار اصلی شروع می‌شود. در درس شبکه چیست دیدیم که درخواست شما از گوشی تا سرور سایت چه راهی را می‌رود. این درس می‌گوید گوشی پیش از راه افتادن، از کجا می‌فهمد مقصد کجاست.

DNS مخفف چیست و چرا ساخته شد

DNS مخفف Domain Name System است؛ یعنی «سامانه‌ی نام دامنه». دامنه همان نام سایت است، مثل sefid.dev.

پیش از DNS، نام و نشانی همه‌ی کامپیوترهای شبکه در یک فایل بود به نام HOSTS.TXT. یک مرکز، این فایل را نگه می‌داشت و همه‌ی کامپیوترها آن را دانلود می‌کردند. هر کس کامپیوتر تازه‌ای وصل می‌کرد، باید صبر می‌کرد تا آن مرکز فایل را عوض کند.

تا وقتی شبکه کوچک بود، این روش کار می‌کرد. ولی کامپیوترها زیاد شدند. فایل بزرگ و بزرگ‌تر شد، دانلود آن برای همه سنگین شد و صف تغییرها طولانی. مثل اینکه دفترچه‌تلفن یک کشور را فقط یک نفر بنویسد و هر روز برای همه پست کند.

راه‌حل این بود که دفترچه تکه‌تکه شود و هر تکه را صاحبش نگه دارد. پل موکاپتریس این طرح را در نوامبر ۱۹۸۳ نوشت (RFC 882 و RFC 883)، و در نوامبر ۱۹۸۷ نسخه‌ی کامل‌ترش را (RFC 1034 و RFC 1035). DNS امروز هنوز روی همین دو سند ۱۹۸۷ ایستاده است. ماجرای HOSTS.TXT را هم خود RFC 1034 همین‌طور گفته است.

پیش از DNS: یک فایل برای همه.
با DNS: یک درخت، هر شاخه پیش صاحبش.

یک نام را از راست به چپ بخوانید

نام team.sefid.dev سه تکه دارد که با نقطه از هم جدا شده‌اند، و یک تکه‌ی پنهان. DNS آن را از راست می‌خواند، مثل نشانی پستی که از کشور شروع می‌شود و به پلاک می‌رسد:

  1. ریشه. بالای همه‌ی نام‌های دنیا. در نام دیده نمی‌شود، ولی هست: نام کامل در اصل team.sefid.dev. است، با یک نقطه‌ی آخر.
  2. پسوند یا دامنه‌ی سطح بالا (TLD): dev. مثل com، org یا ir.
  3. دامنه: sefid. نامی که صاحب سایت ثبت کرده است.
  4. زیردامنه: team. تکه‌ای که صاحب دامنه خودش می‌سازد، بی ثبت تازه؛ مثل www یا mail.

چرا از راست؟ چون هر تکه، تکه‌ی سمت چپش را می‌شناسد. ریشه پسوندها را می‌شناسد، پسوند دامنه‌ها را، و دامنه زیردامنه‌های خودش را. نمونه‌ای را بزنید یا نامی بنویسید:

۱. ریشه: ریشه، نقطه‌ی پنهان آخر نام است. هر جستجو از اینجا شروع می‌شود. سرورهای ریشه فقط می‌دانند هر پسوند را از چه کسی باید پرسید.

دو قاعده‌ی کوچک هم بدانید. هر تکه‌ی نام حداکثر ۶۳ نویسه است و کل نام حداکثر ۲۵۵ بایت (RFC 1035). و بزرگی و کوچکی حرف فرقی نمی‌کند: SEFID.dev همان sefid.dev است.

دامنه خودش موضوع بزرگی است: چطور ثبت می‌شود، پسوندها چه فرقی دارند و صاحبش کیست. درس بعد، «دامنه چیست»، همین‌ها را می‌گوید. اینجا همین‌قدر کافی است که بدانید نام از تکه‌هایی ساخته شده و هر تکه را کسی جواب می‌دهد.

چه کسانی جواب می‌دهند: resolver و نیم‌سرور

در DNS سه نقش هست. فرض کنید در یک کتابخانه‌ی بزرگ دنبال کتابی می‌گردید:

  1. شما و دستگاهتان. فقط می‌پرسید. گوشی و کامپیوتر خودشان دنبال جواب نمی‌گردند؛ پرسش را به کتابدار می‌دهند.
  2. کتابدار، یعنی resolver. کسی که از طرف شما می‌گردد، از قفسه‌ای به قفسه‌ی دیگر، تا جواب را پیدا کند. resolver شما معمولا مال شرکتی است که به شما اینترنت می‌دهد، و مودم خانه نشانی‌اش را خودکار به گوشی می‌دهد.
  3. قفسه‌ها، یعنی نیم‌سرورها (name server). هر کدام فقط دفتر بخش خودش را دارد: نیم‌سرورهای ریشه، نیم‌سرورهای هر پسوند، و نیم‌سرورهای هر دامنه. نیم‌سرور یک دامنه را «معتبر» می‌گویند، چون جواب آن دامنه دست اوست.

هیچ نیم‌سروری همه‌چیز را نمی‌داند، و همین خوبی DNS است. سایت ما، sefid.dev، نیم‌سرورهای خودش را دارد، به نام maryam.sefid.dev و mirza.sefid.dev. هر تغییری در نام‌های sefid.dev همان‌جا داده می‌شود، و هیچ‌کس دیگری لازم نیست کاری بکند.

DNS چگونه کار می‌کند، قدم به قدم

حالا همه را کنار هم بگذاریم. فرض کنید team.sefid.dev را برای اولین بار باز می‌کنید و هیچ‌کس آن را در حافظه ندارد. «قدم بعد» را بزنید. جواب هر سرور همان جوابی است که سرورهای واقعی امروز می‌دهند؛ ولی این صفحه خودش از هیچ سروری چیزی نمی‌پرسد.

  1. دستگاه شماگوشی یا کامپیوتر
  2. resolverکتابدار؛ معمولا مال شرکت اینترنت
  3. سرور ریشهa.root-servers.net
  4. نیم‌سرور .devns-tld1.charlestonroadregistry.com
  5. نیم‌سرور sefid.devmaryam.sefid.dev

قدم ۱ از ۶: در مرورگر team.sefid.dev را می‌زنید. دستگاه شما نشانی آن را نمی‌داند.

دیدید که ریشه و نیم‌سرور .dev جواب را نمی‌دانستند، ولی می‌دانستند چه کسی می‌داند. به این جواب «ارجاع» می‌گویند: «من نمی‌دانم، از او بپرسید» (RFC 1034). resolver از بالای درخت شروع می‌کند و با هر ارجاع یک پله پایین می‌آید، تا به نیم‌سرور خود دامنه برسد.

همه‌ی این رفت و برگشت معمولا در کسری از ثانیه تمام می‌شود، و شما فقط باز شدن صفحه را می‌بینید. پرسش‌ها از راه پورت ۵۳ می‌روند؛ شماره‌ای که DNS از اول برای خودش دارد (RFC 1035).

کش و TTL: چرا بار دوم سریع‌تر است

اگر resolver برای هر بار باز کردن هر سایت، از ریشه شروع کند، کار همه کند می‌شود. پس جواب‌ها را یادداشت می‌کند. مثل شماره‌ای که یک بار پیدا کرده‌اید و روی کاغذی کنار تلفن نوشته‌اید. به این حافظه «کش» (cache) می‌گویند.

ولی شماره‌ها عوض می‌شوند. پس هر جواب یک تاریخ انقضا دارد که صاحب دامنه تعیین می‌کند: TTL (Time To Live، «مدت زنده بودن»)، به ثانیه. TTL برابر ۳۶۰۰ یعنی «این جواب را تا یک ساعت نگه دارید؛ بعد دوباره بپرسید». رکوردهای sefid.dev همین TTL یک‌ساعته را دارند. ریشه هم ارجاع به .dev را با TTL دو روزه می‌دهد.

دفترچه‌ی resolver (اول کار)

  • .devخالیTTL: ۲ روز
  • sefid.devخالیTTL: ۳ ساعت
  • team.sefid.devخالیTTL: ۱ ساعت

دفترچه خالی است. «باز کردن team.sefid.dev» را بزنید.

حالا دلیل جمله‌ای را می‌دانید که برنامه‌نویس‌ها زیاد می‌گویند: «رکورد را عوض کردم، چند ساعت صبر کنید.» تغییر در نیم‌سرور فوری است، ولی resolverهای دنیا تا TTL قبلی تمام نشود، جواب قدیمی را از کش می‌دهند. به همین دلیل، پیش از جابه‌جا کردن سرور، TTL را چند ساعت زودتر کوتاه می‌کنند.

کش فقط در resolver نیست. مرورگر و سیستم‌عامل گوشی و کامپیوتر هم کش کوچک خودشان را دارند. TTL صفر یعنی «هیچ‌جا نگه ندار»، و بیشترین TTL مجاز حدود ۶۸ سال است، که کسی به کار نمی‌برد (RFC 2181).

رکوردهای DNS: A، AAAA، CNAME، MX، TXT، NS

دفتر هر دامنه سطرهایی دارد که به هر کدام «رکورد» می‌گویند. هر رکورد نوعی دارد، چون پرسش‌ها فرق دارند: یکی نشانی سایت را می‌خواهد، دیگری سرور ایمیل را. شش نوعی که بیشتر می‌بینید:

A
نشانی IP نسل چهارم (IPv4). همان جوابی که در قدم‌ها دیدید.team.sefid.dev → 85.198.11.85
AAAA
نشانی IP نسل ششم (IPv6)، که بلندتر است (RFC 3596). نشانی آن ۱۲۸ بیت است، چهار برابر نشانی ۳۲ بیتی IPv4.example.com → 2001:db8::1
CNAME
نام مستعار: «این نام، همان آن نام است؛ جوابش را از آنجا بگیرید». مثل کسی که می‌گوید «شماره‌ی من همان شماره‌ی دفتر است».www.example.com → example.com
MX
ایمیل‌های این دامنه را به کدام سرور بدهند. با یک عدد اولویت، تا اگر سرور اول جواب نداد، نامه به دومی برود.example.com → 10 mail.example.com
TXT
متن آزاد. امروز بیشتر برای این است که نشان دهید دامنه مال شماست (مثلا به گوگل)، و برای تنظیم‌هایی که جلوی ایمیل جعلی با نام دامنه‌ی شما را می‌گیرند. دامنه‌ی ما هم یکی از همین‌ها را برای گوگل دارد.
NS
نیم‌سرورهای معتبر دامنه؛ همان که در قدم‌ها گفت «از او بپرسید».sefid.dev → maryam.sefid.dev

چند نوع دیگر هم هست. SOA سربرگ دفتر دامنه است، PTR برعکس کار می‌کند و از عدد به نام می‌رسد، و CAA می‌گوید کدام مرکز حق دارد برای این دامنه گواهی HTTPS بدهد؛ sefid.dev با آن فقط به Let's Encrypt اجازه داده است (RFC 8659).

سرورهای ریشه: چه کسی بالای همه است

هر جستجوی تازه از ریشه شروع می‌شود. پس ریشه باید همیشه در دسترس باشد. برای همین یک سرور نیست. ریشه ۱۳ نام دارد، از a.root-servers.net تا m.root-servers.net، که ۱۲ سازمان آن‌ها را می‌گردانند (فهرست IANA).

ولی ۱۳ نام، ۱۳ دستگاه نیست. هر نام نسخه‌های زیادی در شهرهای مختلف دنیا دارد که همه با یک نشانی جواب می‌دهند، و پرسش شما به نزدیک‌ترین نسخه می‌رسد. روز ۱۵ مهر ۱۴۰۵، ۲۰۳۱ نسخه در ۱۵۷۵ جا و ۱۷۹ کشور کار می‌کرد؛ چند تا هم در تهران، اصفهان، مشهد، تبریز و شیراز (root-servers.org). اگر یکی خاموش شود، بقیه جواب می‌دهند.

ریشه کار کمی دارد، ولی مهم: فقط پسوندها را می‌شناسد. همان روز، فهرست پسوندهای ریشه ۱۴۳۷ پسوند داشت، از com و dev تا ir و پسوند فارسی .ایران (IANA). جواب ریشه همیشه یک ارجاع است، و چون resolverها آن را دو روز نگه می‌دارند، بیشتر پرسش‌ها اصلا به ریشه نمی‌رسند.

DNSSEC: امضایی که جواب جعلی را لو می‌دهد

در طرح اول DNS، راهی نبود که resolver بفهمد جوابی که رسیده واقعا از صاحب دامنه آمده است. یعنی اگر کسی وسط راه جواب ساختگی می‌فرستاد، ممکن بود شما به سرور اشتباهی بروید (RFC 3833).

DNSSEC برای همین ساخته شد (RFC 4033، ۲۰۰۵). مثل نامه‌ی اداری که مهر و امضا دارد: صاحب هر دامنه جواب‌هایش را با کلید خودش امضا می‌کند، و resolver امضا را می‌سنجد. جوابی که امضایش نخواند، پذیرفته نمی‌شود.

ولی resolver از کجا بداند امضای sefid.dev واقعی است؟ از پله‌ی بالاتر. پسوند .dev کلید sefid.dev را تأیید می‌کند، ریشه کلید .dev را، و کلید ریشه را همه از پیش دارند. یک زنجیر، از ریشه تا دامنه. ریشه از ژوئیه‌ی ۲۰۱۰ امضا می‌شود (IANA). نیم‌سرورهای sefid.dev هم دفتر این دامنه را با DNSSEC امضا می‌کنند.

یک نکته‌ی مهم: DNSSEC پنهان نمی‌کند. پرسش و جواب همچنان خوانا از راه می‌روند؛ فقط نمی‌شود عوضشان کرد. برای پنهان کردن پرسش، دو روش جدا ساخته شده است: DNS over TLS (RFC 7858) و DNS over HTTPS (RFC 8484). هر دو راه میان شما و resolver را رمز می‌کنند؛ مثل نامه‌ای که در پاکت بسته می‌رود.

DNS در تنظیمات گوشی و کامپیوتر

شاید کلمه‌ی DNS را اولین بار در تنظیمات وای‌فای گوشی یا صفحه‌ی مودم دیده باشید، کنار دو خانه به نام Primary و Secondary (یا Preferred و Alternate). حالا معنایش را می‌دانید: «از کدام resolver بپرسم؟»

اولی resolver اصلی است و دومی جایگزین، برای وقتی که اولی جواب نداد. معمولا این خانه‌ها روی «خودکار» است: مودم نشانی resolver شرکت اینترنت را به گوشی می‌دهد و لازم نیست به آن دست بزنید.

در اندروید گزینه‌ای هم به نام «DNS خصوصی» (Private DNS) هست. این همان DNS روی TLS است که در بخش قبل گفتیم: پرسش‌های DNS گوشی رمزشده به resolver می‌رود (وبلاگ توسعه‌دهندگان اندروید).

اشتباه‌ها و خطاهای رایج

«DNS همان دامنه است.»
دامنه نام است، مثل نام یک آدم. DNS سامانه‌ای است که آن نام را به نشانی وصل می‌کند، مثل دفترچه‌تلفن. دامنه بی DNS به جایی نمی‌رسد.
«سایت در DNS است.»
نه. DNS فقط می‌گوید سرور سایت کجاست. خود سایت، یعنی صفحه‌ها و عکس‌ها، روی سرور است. اگر سرور خاموش باشد، DNS نشانی درست را می‌دهد ولی صفحه باز نمی‌شود.
«تغییر DNS فوری همه‌جا دیده می‌شود.»
تغییر در نیم‌سرور فوری است، ولی هر resolver تا TTL جواب قبلی تمام نشود، همان جواب قبلی را می‌دهد. برای همین بعضی کاربرها نشانی تازه را زودتر می‌بینند و بعضی دیرتر.
«دنیا فقط ۱۳ سرور ریشه دارد.»
۱۳ نام دارد، نه ۱۳ دستگاه. هر نام چند نسخه تا چند صد نسخه در شهرهای مختلف دارد؛ روی هم بیش از دو هزار.
«DNSSEC پرسش‌ها را رمز می‌کند.»
DNSSEC امضا می‌کند، پنهان نمی‌کند. رمز کردن کار DNS روی TLS یا HTTPS است.
خطای DNS_PROBE_FINISHED_NXDOMAIN در مرورگر
NXDOMAIN یعنی جواب DNS این بود: «چنین نامی وجود ندارد» (RFC 8499). بیشتر وقت‌ها نام اشتباه نوشته شده است؛ اول املای نشانی را ببینید. اگر نام درست است، شاید دامنه تمدید نشده یا رکوردهایش هنوز ساخته نشده‌اند.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • DNS نام سایت را به نشانی IP سرورش تبدیل می‌کند؛ مثل دفترچه‌تلفن، که نام را می‌گیرد و شماره را می‌دهد.
  • نام از راست خوانده می‌شود: ریشه، پسوند، دامنه، زیردامنه. هر تکه را کسی جدا نگه می‌دارد.
  • دستگاه شما از resolver می‌پرسد؛ resolver از ریشه شروع می‌کند و پله‌پله پایین می‌آید تا به نیم‌سرور خود دامنه برسد.
  • هر جواب یک TTL دارد. تا تمام نشده، جواب از کش می‌آید؛ برای همین بار دوم سریع‌تر است و تغییر DNS زمان می‌برد.
  • رکوردها نوع جواب‌اند: A و AAAA نشانی، CNAME نام دیگر، MX ایمیل، TXT متن، NS نیم‌سرور.
  • ریشه ۱۳ نام دارد و بیش از دو هزار نسخه؛ DNSSEC جواب‌ها را امضا می‌کند تا جعلی پذیرفته نشود، ولی پنهانشان نمی‌کند.

خودتان را بسنجید ۸ پرسش، اختیاری؛ نتیجه فقط برای خود شماست.