نقطه شکست تکین در ارائه دهندگان DNS

این نوشته شامل توضیحاتی در زمینه ماهیت DNS یا نحوه کارکرد ارائه دهندگان DNS *نمی باشد* و در صورتی که با این مباحث آشنایی کافی ندارید، خواندن این نوشته برای شما پیشنهاد نمی شود :)
در این نوشته میخواهیم درباره ایجاد Single Point of Failure در استفاده از ارائه دهندگان DNS صحبت کنیم. با توجه به اینکه در روز های اخیر، با فاصله زمانی چند روز، با قطعی سرویس DNS شرکت ابرآروان روبرو شدیم و بسیاری از وبسایت های ایرانی که از خدمات این شرکت استفاده می کردند، از دسترس خارج شدند، به این فکر افتادم که نوشته ای درباره مقاوم سازی در برابر چنین مشکلاتی بنویسم. اشاره به این نکته هم خالی از لطف نیست که بنده دانش تخصصی در این زمینه ندارم و پیشاپیش از روبرو شدن شما متخصص عزیز با اشتباهات احتمالی پوزش میطلبم :)

موضوع از دسترس خارج شدن سرویس های ارائه دهنده DNS، موضوع جدیدی نیست. جدا از مشکلات فنی ای که می توانند باعث بوجود آمدن چنین مسأله ای بشوند، حملات DDoS به این سرویس ها، یکی از اصلی ترین و شایع ترین دلایل چنین اختلالاتی می باشند. برای مثال می توانید اینجا درباره یکی از بزرگترین حملات از این نوع، که با هدف از دسترس خارج کردن سرویس Dyn در سال ۲۰۱۶ اتفاق افتاده بود، مطالعه کنید. مشکلات فنی هم همونطور که اشاره کردیم، در خیلی از موارد باعث چنین مشکلاتی شده اند که برای مثال میتونیم به اختلالی که در سرویس cloudflare در ماه جولای سال میلادی جاری اشاره کنیم که به دلیل دیپلوی شدن کد مشکل دار اتفاق افتاده بود.

اما مسأله اصلی، مقاوم سازی سرویس ها در برابر چنین اختلالاتی هست. چون بهرحال، اعتماد کردن به uptime یک سرویس ثالث (Third-Party) برای uptime سرویس خودتان، اصولا کار درستی نیست و در واقع در چنین حالتی، کیفیت سرویس شما کاملا وابسته به سرویس Third-Party خواهد بود. اما خیلی اوقات با توجه به دردسر راه اندازی و نگهداری چنین سرویس هایی (DNS Server)، بیزینس های مختلف ترجیح می دهند که حتی با پرداخت هزینه، این وظیفه را به شرکت های دیگر برونسپاری کنند و از خدمات آنها استفاده کنند.

همونطور که احتمالا خوانندگان این نوشته در جریان هستند، برای اینکه DNS های دامنه مورد نظر شما از سرویسی مثل cloudflare یا ابرآروان یا سرویس های مشابه، ارائه بشوند، شما باید ابتدا رکورد های NameServer مربوطه را به درستی تنظیم کنید. معمولا تمامی Domain Registrar های مختلف، کمترین خدمتی که به شما ارائه می دهند، قابلیت اضافه کردن رکورد های NS برای دامنه شماست. در خیلی از موارد، رجیسترر شما، قابلیت اضافه کردن انواع مختلف DNS Record ها را می دهد، اما در مواردی مثل nic دوست داشتنی(!) خودمون، فقط قابلیت اضافه کردن رکورد NS را به کاربر می دهند.

چیزی که در انتهای این نوشته میخوایم بهش برسیم، این هست که بتوانیم رکورد های DNS دامنه مورد نظرمون رو از دو - و بیشتر - سرویس ارائه کنیم؛ چون با توجه به اینکه شاید یکی از این سرویس ها، از دسترس خارج بشوند، کاربران سرویس ما، باید بتوانند از جای دیگری DNS های مربوط به دامنه ما را دریافت کنند و در واقع یک استراتژی Fallback برای چنین سناریو هایی تعریف کنیم.

نکته اول و بسیار مهم، این هست که باید تمامی رکورد هایی که روی هریک از این ارائه دهنده ها تنظیم می کنید، روی ارائه دهنده دیگر هم موجود باشند. در صورتی که بین این تنظیمات ناهماهنگی وجود داشته باشد، امکان دارد که کاربران مختلف، با وارد کردن یکی از آدرس های دامنه شما، نتایج مختلفی دریافت کنند. [اگر درخواست resolve به ارائه دهنده A ارسال شود و این ارائه دهنده تنظیمات مربوط به آن درخواست را نداشته باشد (روی ارائه دهنده B موجود باشد)، خطا ایجاد می شود - در صورتی که اگر این درخواست به ارائه دهنده B ارسال می شد، بدون مشکل درخواست حل می شد.]

نکته دوم، هماهنگی رکورد های NS روی ارائه دهنده های مختلف هست. این نکته، در واقع بخشی از نکته قبلی هست، اما به خاطر اهمیت آن، بصورت جدا به بررسی اش می پردازیم :دی

بعضی از شرکت هایی که خدمات DNS ارائه می دهند، قابلیت تغییر و ثبت رکورد های NS جدید را به کاربران خود نمی دهند. اما این قابلیت، مهم ترین پیش نیاز انجام این تنظیمات است! پس قبل از هرچیز، مطمئن شوید که ارائه دهنده DNSی که انتخاب میکنید، این قابلیت را به شما می دهد. [معمولا، این ارائه دهندگان، این قابلیت را به شما می دهند اما چیزی که نمی توانید تغییر بدهید، رکورد های NS مربوط به خود آن شرکت است - که معمولا هم نیاز نیست]

فرض کنیم که ما میخواهیم رکورد های DNS دامنه مان را جوری تنظیم کنیم که از هر دو سرویس Cloudflare و ابرآروان [اصطلاحا] propagate بشوند و در صورتی که هر یک از این دو سرویس با اختلال روبرو شد، کاربران سرویس ما، همچنان بتوانند به دامنه های ما دسترسی داشته باشند و ما با مشکل روبرو نشویم. یکی دیگر از خوبی های چنین تنظیمی، میتواند بالا رفتن سرعت resolve شدن DNS های دامنه شما از نقاط مختلف دنیا باشد. با توجه به اینکه افراد مختلف، از DNS Server های مختلفی روی ماشین هایشان استفاده میکنند، در نتیجه امکان اینکه DNS شما از یکی از سرویس های Cloudflare یا ابرآروان (در مثال ما) سریعتر از دیگری resolve شود، وجود دارد. [اگر فردی از 1.1.1.1 استفاده بکند، Cloudflare را زودتر پیدا خواهد کرد نسبت به ابرآروان]

سرویس Cloudflare از شما میخواهد که این NS ها را تنظیم کنید
سرویس Cloudflare از شما میخواهد که این NS ها را تنظیم کنید
سرویس ابرآروان از شما میخواهد که این NS ها را تنظیم کنید
سرویس ابرآروان از شما میخواهد که این NS ها را تنظیم کنید

تنظیماتی که شما باید روی دامنه خود انجام بدهید هم باید چیزی شبیه به تصویر زیر باشد:

معمولا به NS اول، به عنوان Primary Record و به باقی رکورد ها بعنوان Secondary Record نگاه می شود - پس رعایت اولویت در انتخاب شما می تواند مؤثر باشد. *اما بصورت عمومی، نمی توان اطمینان داشت که به همین ترتیب اولویت ها اتفاق می افتد*

پس از اینکه این تنظیمات را انجام دادید، باید بصورت «ضربدری» رکورد های هر سرویس را در سرویس دیگر نیز وارد کنید. به تصویر زیر دقت کنید:

رکورد های NS مربوط به ابرآروان را در Cloudflare وارد میکنیم
رکورد های NS مربوط به ابرآروان را در Cloudflare وارد میکنیم
رکورد های NS مربوط به Cloudflare را در ابرآروان وارد میکنیم
رکورد های NS مربوط به Cloudflare را در ابرآروان وارد میکنیم

در حال حاضر، تنظیمات مورد نیاز بصورت کامل انجام شده اند. اما همچنان تأکید به این نکته لازم است که همیشه سعی کنید رکورد هایی که روی هر یک از این سرویس ها اضافه میکنید، روی دیگری نیز بصورت یکسان اضافه شوند. برای automate کردن این فرایند و جلوگیری از خطای انسانی، میتوانید اسکریپتی بنویسید که با استفاده از API هایی که هر یک از این سرویس ها در اختیارتون قرار می دهند، رکورد ها را از یکی از این سرویس ها دریافت و در سرویس دیگر تنظیم کند.

در نهایت خواندن این مقاله رو هم بهتون پیشنهاد میکنم که بخش زیادی از نوشته بنده نیز برگرفته از آن مقاله است.