آرش حقیقت
آرش حقیقت
خواندن ۲ دقیقه·۸ سال پیش

مهاجرت سرویس DNS از ویندوز

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

طبیعتا من از نگاه کردن به ویندوز خودداری می‌کنم و شنیدن اسمش هم باعث میشه کهیر بزنم اما… خلاص شدن از شر یه سرور ویندوزی همیشه عالیه (;

روی این سرور یک سری وبسایت داشتیم که نیاز به DNS و دیتابیس و وب‌سرور داره.
تصمیم گرفتم بعد از کپی کردن فایل‌ها و بکاپ دیتابیس‌ها سرویس DNS رو (نمی‌دونم چرا قبلا تصمیم گرفته بودن Self Host کنن اونم روی ویندوز؟!!) به سرور جدید لینوکسی منتقل کنم. اینجا بود که به دلیل نداشتن اطلاعات کافی، گوگل کردم. یک سری لینک پیدا کردم که هیچ کدوم درست توضیح نداده بودن باید چکار کرد.
یکم دیگه گشتم و دیدم میشه zoneها رو با دستور زیر اکسپورت کرد توی فایل تکست:

dnscmd DNSSERVERNAME /ZoneExport domain.com dns.txt

این دستور باعث میشه زون DNS شما توی فایل dns.txt و داخل دایرکتوریC:\Windows\System32\dns  ذخیره بشه.
تا اینجا اوضاع زیاد بد به نظر نمیاد اما وقتی متوجه میشید تعداد دامنه‌ها بیشتر از ۱۰ تا هست باید به فکر بی‌افتید برای نوشتن batch script یا اتوماتیک کردن کار.

خوشبختانه وقتی اولین دامنه رو اکسپورت کردم و به اون آدرس کذایی رفتم تا ببینم چی ذخیره شده، ۲ مورد خوشحال کننده دیدم (:
۱. تمام زون‌ها خودشون یه فایل هستن تو این آدرس و در واقع نیازی نیست شما دونه دونه اونها رو اکسپورت کنید.
۲. این فایل‌ها فرمت مشابه فایل‌های bind رو دارن که باعث شد امیدوار بشم توی لینوکس بدون نیاز به تغییر کار می‌کنن.

خوشحال از کشف این دو مورد، رفتم تا مورد دوم رو امتحان کنم.
اول bind رو نصب کردم و سعی کردم دستی یکی از دامنه‌ها رو با همون فایل اکسپورت شده از ویندوز، کانفیگ کنم و دیدم کار می‌کنه.
با خوشحالی از این که کارم به کمتر از نصف رسیده، رفتم تا کل دامنه‌ها را که بیشتر از ۸۰ تا بود، به ماشین لینوکسی جدید منتقل کنم.
تا این مرحله من یک بخش از کانفیگ bind که در واقع کانفیگوریشن زون‌ها هست رو دارم. مساله فعلی اینه که باید خود زون‌ها توی بایند تعریف بشن و به دلیل تعداد زیادشون و این که همیشه یه سیس‌ادمین کار‌ها رو اتوماتیک (اسکریپت) می‌کنه، رفتم تا اسکریپت بنویسم که کانفیگ‌های مورد نظر، اتوماتیک ساخته بشن.

خوشبختانه، تمام فایل‌های زون که از ویندوز کپی کرده بودم، اسمی با فرمت domain.tld.dns داشتند که خیلی کمک کرد.

توی بایند بخشی که مربوط به تعریف زون‌ها هست کانفیگ مشابه زیر داره:

zone "example.com" { type master; file "/etc/bind/zones/example.com"; # zone file path };

بخش‌هایی از این کانفیگ که تغییر می‌کنه، مربوط به اسم دامنه هست که بخشی از اسم فایل‌های زون هم هست پس با اسکریپت bash زیر، این کانفیگ رو ساختم.

for domain in * do cat <<EOF zone "${domain::-4}" { type master; file "/etc/bind/zones/$domain; }; EOF done

اگر این اسکریپت رو توی دایکتوری که فایل‌های زون وجود داره، اجرا کنید، با اسم فایل‌ها که.dns از آخر اون‌ها حذف شده، سینتکس تعریف دامنه برای بایند رو می‌سازه. حالا که مطمعن شدیم درست کار می‌کنه، میشه خیلی ساده، خروجی‌اش را به /etc/bind/named.conf.local  کپی کنیم یا با <<  به آخر همون فایل ریدایرکت کنیم.

حالا تنها کاری که نیاز هست انجام بدیم اینه که زون فایل‌ها رو توی دایرکتوری /etc/bind/zones/ کپی کنیم و سرویس bind رو ری‌استارت کنیم.

برای این که مطمعن بشیم درست کار می‌کنه، می‌تونیم از dig با فرمت زیر استفاده کنیم:

dig linja.ir @DNSipAddress

و بعد از @ آدرس IP سرور خودتون رو جایگزین کنید تا IP دامنه را از سرور شما بپرسه.
خیلی طبیعیه که اگر ۵ دامنه رندوم را از سرور جدید بپرسید و جواب درست بگیرید، نشون میده کار درست انجام شده و مشکلی وجود نداره اما برای اطمینان بیشتر می‌تونید با یک حلقه for شبیه مثال بالا که کمک کرد کانفیگ بایند را بسازیم، تمام دامنه‌ها را امتحان کنید تا اطمینان پیدا کنید.

چون این مطلب با فرض بلد بودن بایند توسط شما نوشته شده، پس می‌تونید در صورت نیاز troubleshoot کنید و مشکل احتمالی را برطرف کنید (:

migrationdnsbindسیستم‌عامللینوکس
شاید از این پست‌ها خوشتان بیاید