تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

چگونه سرور DNS اختصاصی خود با استفاده از Node.js بسازیم؟


۱۳ مرداد ۱۴۰۴

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

در این مقاله، ضمن آشنایی با مفاهیم پایه‌ای DNS و عملکرد سرورهای آن، گام‌به‌گام نحوه ساخت یک سرور DNS ساده و کاربردی با استفاده از محیط برنامه‌نویسی Node.js را آموزش خواهیم داد. این راهنما برای علاقه‌مندان و توسعه‌دهندگانی که قصد دارند دانش علمی در زمینه شبکه و سیستم‌های نام دامنه را گسترش دهند، مفید و کاربردی خواهد بود.

در ادامه خواهید خواند:

  • سرور DNS چیست؟
  • آشنایی با نحوه‌ی تبدیل نام دامنه به آدرس IP (رزولوشن DNS)
  • عوامل اصلی و مهم در حوزه DNS
  • انواع رکوردهای DNS
  • ساخت سرور DNS با استفاده از Node.js
  • تست سرور DNS
  • جمع بندی
 سرور DNS اختصاصی

سرور DNS چیست؟

سرور DNS در واقع یک سرور کامپیوتری است که پایگاه داده‌ای از آدرس‌های IP عمومی و نام‌‌های دامنه مرتبط با آن‌ها را نگهداری می‌کند. وظیفه اصلی سرور DNS این است که نام‌‌های دامنه‌ای که برای انسان‌ها قابل فهم و به خاطر سپردن هستند، به آدرس‌های IP عددی ترجمه کند؛ آدرس‌هایی که کامپیوترها برای برقراری ارتباط با یکدیگر در شبکه از آن‌ها استفاده می‌کنند.

برای درک بهتر، تصور کنید کاربری در مرورگر خود آدرس www.example.com را وارد می‌کند. در این لحظه، مرورگر از یک سرور DNS می‌خواهد تا این نام دامنه را به آدرس IP متناظر آن تبدیل کند، مثلا 192.0.2.1 با دریافت این آدرس IP، مرورگر می‌تواند به سروری که محتوای سایت روی آن میزبانی می‌شود، متصل شود.

فرآیند عملکرد DNS چگونه است؟

هنگامی که یک نام دامنه در نوار آدرس مرورگر وارد می‌شود، فرآیندی به نام DNS Lookup آغاز می‌گردد. در این فرآیند، مرورگر درخواستی به سمت یک سرور DNS ارسال می‌کند تا آدرس IP مرتبط با آن دامنه را بیابد. پس از دریافت پاسخ و دستیابی به IP صحیح، مرورگر می‌تواند ارتباط لازم را برقرار کرده و محتوای سایت را بارگذاری کند.

با سرویس DNS لیارا، رکوردهای دامنه‌ات رو سریع، دقیق و بدون قطعی مدیریت کن.
✅ تغییرات آنی ✅ رابط کاربری ساده ✅ پایداری بالا
‌راه‌اندازی رایگان DNS

آشنایی با نحوه‌ی تبدیل نام دامنه به آدرس IP (رزولوشن DNS)

رزولوشن DNS یا تبدیل نام دامنه به آدرس IP، یکی از مراحل کلیدی در ارتباط بین مرورگر کاربر و سرورهای میزبان وب‌سایت است. این فرآیند به صورت خودکار در چند مرحله انجام می‌شود و شامل تعامل با چندین نوع سرور مختلف در ساختار سلسله مراتبی DNS است.

ساختار سلسله‌مراتبی DNS و سرورهای ریشه

سیستم DNS به‌صورت سلسله مراتبی طراحی شده است. در بالاترین سطح این ساختار، سرورهای ریشه (Root Servers) قرار دارند. در حال حاضر، 13 مجموعه از این سرورها در سراسر جهان فعال هستند. نقش اصلی آن‌ها، مدیریت پایگاه داده دامنه‌های سطح بالا (TLD) مانند .com، .net، .org و دامنه‌های جدیدتر مانند .app و .dev است.

چرا فقط 13 آدرس برای سرورهای ریشه وجود دارد؟

یکی از تصورات رایج این است که تنها 13 سرور ریشه در جهان وجود دارد. در واقع، تعداد سرورهای فیزیکی بسیار بیشتر است، اما به دلایل فنی و محدودیت‌های موجود در معماری اولیه DNS، فقط 13 آدرس IP در ناحیه ریشه تعریف شده‌اند. در گذشته، برای هر یک از این آدرس‌ها فقط یک سرور اختصاصی وجود داشت که اغلب در ایالات متحده قرار داشتند.

امروزه، هر یک از این 13 آدرس IP به مجموعه‌ای از سرورها اختصاص داده شده‌اند که با استفاده از مسیریابی Anycast، درخواست‌ها را بر اساس موقعیت جغرافیایی و ترافیک شبکه به نزدیک‌ترین سرور پاسخگو هدایت می‌کنند. در حال حاضر بیش از 600 سرور ریشه DNS در تمام قاره‌های مسکونی جهان توزیع شده‌اند.

همه آنچه باید درباره DNS بدانید
DNS چیست؟

نمونه‌ای از فرآیند رزولوشن DNS

بیاید یک نمونه از فرآیند تبدیل دامنه به IP را به مرحله‌به‌مرحله بررسی کنیم.

  • شروع درخواست: کاربر آدرس example.com را در مرورگر خود وارد می‌کند.
  • درخواست به سرور ریشه: این درخواست ابتدا به یک سرور ریشه DNS ارسال می‌شود. سرور ریشه آدرس IP دقیق را نمی‌داند، اما باید درخواست را به کجا برای دامنه‌های .com هدایت کند.
  • درخواست به سرور دامنه سطح بالا (TLD): سرور ریشه، درخواست را به سرور دامنه سطح بالای .com می‌فرستد. این سرور، نام سرور (Nameserver) مربوط به example.com را شناسایی می‌کند.
  • درخواست به نام سرور دامنه: درخواست اکنون به نام سروری ارسال می‌شود که اطلاعات دقیق دامنه را دارد. این نام سرور ممکن است توسط سرویس‌هایی مانند Google DNS یا Cloudflare مدیریت شود.
  • بازگشت آدرس IP: در نهایت، نام سرور آدرس IP مربوط به example.com را به مرورگر بازمی‌گرداند و مرورگر می‌تواند به سرور مقصد متصل شده و وب‌سایت را بارگذاری کند.

عوامل اصلی و مهم در حوزه DNS

در ساختار سیستم DNS؛ نقش برخی سرویس‌ها و نهادها نسبت به دیگران پررنگ‌تر است. این بازیگران کلیدی وظیفه دارند عملکرد کلی سیستم نام دامنه را پایدار، سریع و ایمن نگه‌ دارند. برخی از آن‌ها مسئول مدیریت دامنه‌های سطح بالا هستند، برخی وظیفه ارائه پاسخ‌های سریع به درخواست‌‎های کاربرام را دارند و برخی دیگر خدمات عمومی بهینه‌شده DNS را برای استفاده کاربران در سراسر جهان فراهم می‌کنند.

ارائه‌دهندگان اصلی خدمات DNS

در اکوسیستم DNS، برخی شرکت‌ها نقش بسیار مهمی در ارائه خدمات سریع، ایمن و پایدار ایفا می‌کنند. از جمله شناخته‌شده‌ترین این ارائه‌دهندگان می‌توان به Google DNS با آدرس IP معروف 8.8.8.8 و Cloudflare DNS با آدرس 1.1.1.1 اشاره کرد. این سرویس‌ها به‌عنوان جایگزین‌های حرفه‌ای برای DNS های پیش‌فرض ارائه شده توسط شرکت‌های ارائه‌دهنده اینترنت عمل می‌کنند.

سرعت بالای پاسخ‌گویی، پایداری بیشتر و همچنین قابلیت‌هایی مانند حفاظت از حریم خصوصی کاربران و رمزنگاری درخواست‌های DNS، از جمله مزایای این سرویس‌ها هستند. در بسیاری از موارد، کاربران با استفاده از این سرویس‌های عمومی، تجربه‌ای سریع‌تر و امن‌تر از مرور وب خواهند داشت. به همین دلیل، بسیاری از توسعه‎‌دهندگان و کاربران حرفه‌ای ترجیح می‌دهند به جای DNS های پیش‌فرش ISP ها، از DNS هایی مانند Google یا Cloudflare استفاده کنند.

افزون بر این، این ارائه‌دهندگان با زیرساخت توزیع‌شده جهانی خود، پاسخ‌ها را از نزدیک‌ترین سرور ممکن به کاربر ارارئه می‌دهند. این ویژگی نه‌تنها زمان پاسخ‌دهی را کاهش می‌دهد، بلکه به بالاتر رفتن کیفیت اتصال نیز کمک می‌کند. استفاده از چنین سرویس‌هایی، در محیط‌های کاری یا اپلیکیشن‌هایی که به ارتباط سریع و پایدار نیاز دارند، توصیه می‌شود.

DNS اختصاصی چیست؟ کلیدی برای افزایش سرعت و امنیت سایت
DNS اختصاصی 

انواع رکوردهای DNS

در سیستم نام دامنه (DNS)، اطلاعات مرتبط با هر دامنه از طریق رکوردهایی خاص در قالب فایل‌های منطقه‌ای (Zone Files) ذخیره و مدیریت می‌شوند. این رکوردها به سرورهای DNS امکان می‌دهند بدانند هنگام دریافت یک درخواست، چه پاسخی باید ارائه شود. هر رکورد هدف خاصی دارد و ترکیب این رکوردها باعث می‌شود فرآیند هدایت دامنه‌ها به آدرس‌ها IP، تعیین زیر دامنه‌ها و مدیریت خدمات متنوع دامنه به درستی انجام شود.

1. رکورد A (Address Record)

توضیح کاربرد: رکورد A، یک نام دامنه را به یک آدرس IPv4 مشخص متصل می‌کند. این نوع رکورد زمانی استفاده می‌شود که بخواهیم مستقیماً آدرس IP یک سرور را به دامنه متصل کنیم.
تشبیه تصویری: مانند پلاک خانه‌ای است که دقیقاً مکان سکونت را مشخص می‌کند.

مثال:

  • دامنه: example.com
  • رکورد A: اشاره به 192.0.2.1
    در این حالت، هر زمان کاربری example.com را وارد کند، مستقیماً به سروری با آدرس 192.0.2.1 هدایت می‌شود.

2. رکورد NS (Name Server Record)

توضیح کاربرد: این رکورد مشخص می‌کند که کدام سرور DNS مسئول پاسخ‌گویی به درخواست‌های مربوط به یک دامنه یا زیر دامنه است.
تشبیه تصویری: مانند مراجعه به یک میز اطلاعات در یک سازمان است که شما را به بخش مربوطه راهنمایی می‌کند.

مثال:

  • دامنه: subdomain.example.com
  • رکورد NS: اشاره به ns1.exampledns.com
    این بدان معناست که سرور ns1.exampledns.com مسئول رسیدگی به درخواست‌های مربوط به subdomain.example.com خواهد بود.

3. رکورد CNAME (Canonical Name Record)

توضیح کاربرد: رکورد CNAME زمانی استفاده می‌شود که بخواهیم یک دامنه یا زیر دامنه را به دامنه‌ای دیگر ارجاع دهیم. این کار مدیریت چندین دامنه یا زیر دامنه را ساده‌تر می‌کند.
تشبیه تصویری: مانند استفاده از نام مستعار به‌جای نام اصلی یک شخص است. وقتی کسی را “باب” صدا می‌زنید، همه می‌دانند منظور “رابرت” است.

مثال:

  • دامنه اصلی: realname.com با آدرس IP: 203.0.113.5
  • دامنه مستعار: nickname.com
  • رکورد CNAME: nickname.com به realname.com اشاره می‌کند
    در این صورت، درخواست برای nickname.com به‌صورت غیرمستقیم به realname.com هدایت شده و سپس به آدرس IP نهایی می‌رسد.

نمونه‌های کاربردی از رکوردهای DNS

با استفاده از دامنه‌ی فرضی saquib.dev، می‌توان مثال‌هایی کاربردی برای هر نوع رکورد ارائه داد:

  • رکورد A برای saquib.dev ممکن است به آدرس 76.76.1.2 اشاره داشته باشد.
  • رکورد CNAME برای app.spotify.com می‌تواند به saquib.dev ارجاع داده شده باشد، به این معنا که app.spotify.com در واقع یک نام مستعار برای saquib.dev است.
  • رکورد NS برای app.saquib.dev می‌تواند به ns.myserver.com اشاره کند که نشان می‌دهد مدیریت DNS این زیر دامنه به سروری دیگر سپرده شده است.
مقایسه DNS و سرور اختصاصی: چه تفاوت‌هایی دارند؟
مقایسه DNS و سرور اختصاصی

ساخت سرور DNS با استفاده از Node.js

اولین قدم برای ساخت یک DNS سرور، راه‌اندازی یک سرور UDP است. DNS از پروتکل UDP برای ارسال و دریافت داده‌ها استفاده می‌کند (البته در برخی موارد از TCP هم استفاده می‌شود، اما UDP معمول‌ترین است).

در کد زیر، با استفاده از ماژول داخلی dgram در Node.js یک سرور UDP ایجاد می‌کنیم که به پورت 53 (پورت استاندارد DNS) گوش می‌دهد. هر وقت درخواستی به این سرور ارسال شود، محتوا و اطلاعات فرستنده در کنسول چاپ می‌شود.

const dgram = require("node:dgram");
const server = dgram.createSocket("udp4");

server.on("message", (msg, rinfo) => {
  console.log({ msg: msg.toString(), rinfo });
});

server.bind(53, () => console.log("DNS Server is running on port 53"));

این کد هنوز پاسخ خاصی به درخواست‌ها نمی‌دهد، اما مرحله‌ای مهم است چون نشان می‌دهد که سرور شما آماده دریافت پیام‌ها روی پورت DNS است

مدیریت درخواست‌های DNS با استفاده از کتابخانه dns-packet

حالا که یک سرور UDP در اختیار داریم، باید بتوانیم داده‌هایی که به سرور می‌رسند را به شکل یک درخواست DNS تحلیل کنیم. بسته‌های DNS دارای ساختار خاصی هستند و نمی‌توان آن‌ها را فقط با toString() خواند یا پاسخ داد. برای همین، از کتابخانه‌ای به‌نام dns-packet استفاده می‌کنیم.

این کتابخانه به ما کمک می‌کند که درخواست‌های دریافتی را رمزگشایی (decode) کنیم و همچنین پاسخ‌های معتبر به صورت بسته‌های DNS بسازیم (encode).

در قطعه‌کد زیر:

  • یک پایگاه‌داده ساده (آبجکت db) داریم که دامنه‌ها را به آدرس IP یا CNAME نگاشت می‌کند.
  • وقتی درخواست دریافت می‌شود، با استفاده از dnsPacket.decode آن را تجزیه می‌کنیم.
  • سپس یک پاسخ ایجاد کرده و با استفاده از server.send آن را برای کاربر ارسال می‌کنیم.
const dnsPacket = require("dns-packet");
const server = dgram.createSocket("udp4");

const db = {
  "ksaquib.surge.sh": {
    type: 'A', 
    data: '1.2.3.4'
  },
  "blog.ksaquib.dev": {
    type: 'CNAME', 
    data: 'saquib.com'
  },
};

server.on("message", (msg, rinfo) => {
  const incomingReq = dnsPacket.decode(msg);
  const ipFromDb = db[incomingReq.questions[0].name];

  const ans = dnsPacket.encode({
    type: "response",
    id: incomingReq.id,
    flags: dnsPacket.AUTHORITATIVE_ANSWER,
    questions: incomingReq.questions,
    answers: [
      {
        type: ipFromDb.type,
        class: "IN",
        name: incomingReq.questions[0].name,
        data: ipFromDb.data,
      },
    ],
  });
  server.send(ans, rinfo.port, rinfo.address);
});

server.bind(53, () => console.log("DNS Server is running on port 53"));

با این کد، سرور شما نه‌تنها پیام‌ها را دریافت می‌کند، بلکه اگر نام دامنه در پایگاه‌داده‌ی داخلی وجود داشته باشد، یک پاسخ معتبر DNS هم به آن می‌فرستد.

تست سرور DNS

یکی از ساده‌ترین و قدرتمندترین ابزارها برای تست سرور DNS، استفاده از دستور خط فرمان dig است. این ابزار در بسیاری از سیستم‌های لینوکسی و مک به صورت پیش‌فرض نصب شده و به شما این امکان را می‌دهد که مستقیماً یک درخواست DNS ارسال کرده و پاسخ آن را مشاهده کنید.

برای تست سروری که روی لوکال‌هاست و پورت 53 اجرا می‌شود، می‌توانید از دستور زیر استفاده کنید:

dig @localhost ksaquib.surge.sh

در این دستور:

  • @localhost به این معناست که درخواست باید به سروری که روی سیستم خودتان اجرا شده فرستاده شود.
  • ksaquib.surge.sh نام دامنه‌ای است که در پایگاه‌داده تعریف کرده‌اید.

اگر همه‌چیز درست پیکربندی شده باشد، این دستور باید آدرس IP مشخص‌شده در پایگاه‌داده‌ی شما (مثلاً 1.2.3.4) را به عنوان پاسخ برگرداند. این یعنی سرور DNS شما به‌درستی درخواست را دریافت، پردازش و پاسخ داده است.

آشنایی با ویژگی‌ها و امکانات کامل Cloud DNS
Cloud DNS

جمع بندی

در این مقاله با اصول اولیه راه‌اندازی یک سرور DNS در Node.js آشنا شدیم. ابتدا یاد گرفتیم چگونه با استفاده از ماژول‌های داخلی Node یک سرور UDP ایجاد کنیم که روی پورت 53 گوش می‌دهد. سپس با کمک کتابخانه‌ی dns-packet، نحوه‌ی رمزگشایی درخواست‌های DNS و ساختن پاسخ مناسب را بررسی کردیم.

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

به اشتراک بگذارید