DNS
DNS چه مشکلی را حل میکند؟
انسانها با نام راحتتر کار میکنند (example.com)؛ شبکه اما فقط آدرس IP میفهمد. DNS همین شکاف را پر میکند و نامها را به IP ترجمه میکند. نکتهی آزاردهنده این است که وقتی DNS خراب میشود، هیچ پیغام روشنی نمیگیرید — فقط «سایت باز نمیشود»، در حالی که سرور خودش کاملاً سالم و سرحال است. به همین دلیل اولین پرسشی که در عیبیابی باید بپرسید این است: «این مشکل از DNS است، از شبکه است یا از خود برنامه؟» خوشبختانه با یک ابزار ساده به اسم dig میتوانید خودتان جواب این پرسش را پیدا کنید، بدون اینکه به کسی زنگ بزنید (!)
رکوردهای پرکاربرد
DNS در واقع یک پایگاه دادهی توزیعشدهی بزرگ است و هر نام میتواند چند نوع رکورد داشته باشد، هر کدام با کاربرد خودش:
| رکورد | نگاشت | مثال کاربرد |
|---|---|---|
| A | نام → IPv4 | سایت روی سرور مشخص |
| AAAA | نام → IPv6 | همان A برای IPv6 |
| CNAME | نام → نام دیگر | www بهعنوان نام مستعار example.com |
| MX | سرور ایمیل دامنه | دریافت ایمیل |
| TXT | متن دلخواه | تأیید مالکیت دامنه، سیاستهای SPF |
در استقرار یک سرویس، یک راه رایج این است که رکورد A یک نام را مستقیماً به IP سرور خودتان اشاره دهید. CNAME به یک نام دیگر اشاره میکند، نه به IP؛ همین یک لایهی اضافه میتواند زنجیرهی Resolve را کمی طولانیتر کند.
نکته
فرایند Resolve و TTL
وقتی شما آدرس example.com را در مرورگر میزنید، این اتفاقها پشت پرده رخ میدهد:
- سیستم شما از یک Resolver (سرور DNS تنظیمشده، معمولاً روتر خانه یا یک سرور DNS عمومی) سؤال میپرسد.
- اگر آن Resolver پاسخ را از قبل در Cache داشته باشد، همان را برمیگرداند؛ در غیر این صورت زنجیرهای از سرورهای DNS را طی میکند تا به سرور Authoritative همان دامنه برسد.
- پاسخ نهایی با یک عدد به نام TTL (Time To Live، به ثانیه) همراه میشود که میگوید این پاسخ چه مدت قابل Cacheشدن است.
TTL برای کار DevOps اهمیت واقعی دارد: وقتی سرویسی را به IP جدید منتقل میکنید و رکورد DNS را عوض میکنید، هر کسی که پاسخ قدیمی را Cache کرده، تا پایان همان TTL همچنان به آدرس قبلی میرود. TTL کوتاهتر یعنی تغییرات سریعتر منتشر میشوند، اما قیمتش این است که تعداد Queryهای واقعی هم بیشتر میشود.
کار با dig و nslookup
ابزار اصلی این درس dig است. nslookup سادهتر و قدیمیتر است و روی ویندوز هم معمولاً از قبل نصب است؛ خوب است هر دو را بشناسید، اما در Linux عملاً همیشه سراغ dig میروید.
+shortفقط پاسخ نهایی را میدهد — گزینهی خوب برای اسکریپتنویسی.- در خروجی کامل، ستونی به نام TTL برحسب ثانیه میبینید؛ اگر دستور را دوباره اجرا کنید و پاسخ از Cache بیاید، همین عدد کمکم پایین میرود.
- با دستور
dig @1.1.1.1 example.com +shortمیتوانید مستقیماً از یک Resolver مشخص بپرسید — راه سریعی برای مقایسهی دو Resolver با هم.
همان Queryها این بار با nslookup:
تمرین
در VM اینها را اجرا کنید و نتیجهها را با هم مقایسه کنید:
بعد یک نام ساختگی را هم Query کنید (dig does-not-exist.example) تا پیام NXDOMAIN را با چشم خودتان ببینید؛ شناختن این پاسخ بعداً در عیبیابی خیلی به کارتان میآید — تفاوت «این نام واقعاً وجود ندارد» با «DNS جواب نمیدهد».
حالا یک سناریوی واقعی را در ذهن مجسم کنید: فرض کنید میخواهید یک سرویس را از سرور قدیمی به سرور جدید منتقل کنید و TTL رکورد A آن 3600 (یک ساعت) است. اگر همین الان رکورد را به IP جدید تغییر دهید، چه کسانی هنوز تا یک ساعت به سرور قدیمی میروند؟ اگر بخواهید این ریسک را کم کنید، چند ساعت قبل از مهاجرت باید TTL را کوتاه کنید؟ همین سؤال، دلیل واقعی است که چرا تیمهای DevOps پیش از تغییرات مهم DNS، TTL را از قبل پایین میآورند.
منابع یادگیری
مستندات و مقالات
- Cloudflare — What is DNS? — توضیح DNS و مراحل Resolve
ویدیو
- What is DNS? (and how it makes the Internet work) - NetworkChuck — مرور عملی DNS