ماژول DNS در Node.js: نام‌گذاری و شبکه

ماژول node:dns در Node.js قابلیت‌های مربوط به نام‌گذاری (Name Resolution) را فراهم می‌کند. این ماژول به توسعه‌دهندگان اجازه می‌دهد آدرس‌های IP مربوط به نام‌های دامنه را پیدا کنند و درخواست‌های DNS را اجرا نمایند. در حالی که تابع dns.lookup() از امکانات سیستم‌عامل برای نام‌گذاری استفاده می‌کند (و ممکن است ارتباط شبکه‌ای واقعی برقرار نکند)، سایر توابع مانند dns.resolve4() یا dns.reverse() مستقیماً به سرورهای DNS متصل می‌شوند. همچنین کلاس dns.Resolver امکان ایجاد Resolverهای مستقل با تنظیمات سفارشی را فراهم می‌کند.

dns.lookup()dns.resolve()dns.Resolver classgetServers / setServersreverse DNS lookups

~8 دقیقه مطالعه · آخرین به‌روزرسانی ۶ دی ۱۴۰۴

1. مقدمه


ماژول node:dns برای نام‌گذاری دامنه‌ها استفاده می‌شود. این ماژول می‌تواند آدرس‌های IP را برای نام‌های میزبان پیدا کند و درخواست‌های DNS را اجرا نماید. در حالی که dns.lookup() از Resolver سیستم‌عامل استفاده می‌کند، سایر توابع مستقیماً به سرورهای DNS متصل می‌شوند.


2. dns.lookup()


dns.lookup() یک نام میزبان را به آدرس IPv4 یا IPv6 تبدیل می‌کند.


const dns = require('node:dns');
dns.lookup('example.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family);
});

  • گزینه‌ها شامل family، hints، all و order هستند.
  • وقتی all برابر true باشد، نتیجه یک آرایه از آدرس‌ها خواهد بود.
  • خطاها شامل ENOTFOUND در صورت شکست نام‌گذاری هستند.

3. درخواست‌های DNS


توابع دیگر ماژول درخواست‌های واقعی DNS را اجرا می‌کنند:


  • dns.resolve4(): دریافت رکوردهای A (IPv4).
  • dns.resolve6(): دریافت رکوردهای AAAA (IPv6).
  • dns.resolveMx(): دریافت رکوردهای Mail Exchange.
  • dns.reverse(): تبدیل آدرس IP به نام میزبان.

dns.resolve4('archive.org', (err, addresses) => {
  addresses.forEach((a) => {
    dns.reverse(a, (err, hostnames) => {
      console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`);
    });
  });
});

4. کلاس dns.Resolver


کلاس dns.Resolver امکان ایجاد Resolverهای مستقل با تنظیمات سفارشی را فراهم می‌کند.


const { Resolver } = require('node:dns');
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);
resolver.resolve4('example.org', (err, addresses) => {
  console.log(addresses);
});

  • resolver.getServers(): نمایش سرورهای DNS فعلی.
  • resolver.setServers(): تنظیم سرورهای DNS سفارشی.
  • resolver.cancel(): لغو درخواست‌های در حال اجرا.
  • resolver.setLocalAddress(): مشخص کردن آدرس‌های خروجی IPv4 یا IPv6.

5. dns.getServers()


لیست آدرس‌های IP سرورهای DNS فعلی را نمایش می‌دهد:


console.log(dns.getServers());
// ['8.8.8.8', '2001:4860:4860::8888']

6. مثال با گزینه‌ها


const options = { family: 6, hints: dns.ADDRCONFIG | dns.V4MAPPED };
dns.lookup('example.org', options, (err, address, family) =>
  console.log('address: %j family: IPv%s', address, family)
);

نتیجه‌گیری


ماژول node:dns هم نام‌گذاری سطح سیستم‌عامل و هم درخواست‌های مستقیم DNS را فراهم می‌کند. با dns.lookup() می‌توان نام‌ها را مشابه سیستم‌عامل تبدیل کرد، در حالی که توابعی مانند resolve4() و reverse() امکان اجرای درخواست‌های مستقیم DNS را می‌دهند. کلاس dns.Resolver نیز انعطاف‌پذیری بیشتری با تنظیمات سفارشی فراهم می‌کند و این ماژول را به ابزاری قدرتمند برای برنامه‌های شبکه‌ای در Node.js تبدیل می‌سازد.


1. فلگ‌های getaddrinfo


فلگ‌ها را می‌توان به‌عنوان hints به dns.lookup() پاس داد:


  • dns.ADDRCONFIG: محدود کردن نوع آدرس‌ها به آدرس‌های غیر-loopback موجود در سیستم.
  • dns.V4MAPPED: در صورت نبود IPv6، آدرس‌های IPv4 به‌صورت IPv6 mapped بازگردانده می‌شوند.
  • dns.ALL: همراه با V4MAPPED، هم آدرس‌های IPv6 و هم IPv4 mapped بازگردانده می‌شوند.

2. dns.lookupService()


این متد یک آدرس و پورت را به نام میزبان و سرویس تبدیل می‌کند:


dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service);
  // خروجی: localhost ssh
});

3. dns.resolve()


این متد رکوردهای مختلف DNS را بر اساس نوع رکورد (rrtype) بازمی‌گرداند:


  • A: آدرس‌های IPv4 → dns.resolve4()
  • AAAA: آدرس‌های IPv6 → dns.resolve6()
  • CNAME: نام‌های canonical → dns.resolveCname()
  • MX: رکوردهای Mail Exchange → dns.resolveMx()
  • NS: رکوردهای Name Server → dns.resolveNs()
  • TXT: رکوردهای متنی → dns.resolveTxt()
  • SOA: رکوردهای Start of Authority → dns.resolveSoa()
  • SRV: رکوردهای سرویس → dns.resolveSrv()
  • TLSA: رکوردهای Certificate Association → dns.resolveTlsa()

4. مثال resolveAny()


برای دریافت همهٔ رکوردها:


dns.resolveAny('example.com', (err, records) => {
  console.log(records);
});

5. dns.reverse()


برای تبدیل آدرس IP به نام میزبان:


dns.reverse('8.8.8.8', (err, hostnames) => {
  console.log(hostnames);
});

6. مدیریت ترتیب نتایج


  • dns.setDefaultResultOrder(order): تنظیم ترتیب پیش‌فرض (ipv4first، ipv6first، verbatim).
  • dns.getDefaultResultOrder(): دریافت ترتیب پیش‌فرض فعلی.

7. dnsPromises API


نسخهٔ Promise از متدهای DNS برای استفادهٔ مدرن:


const dnsPromises = require('node:dns').promises;
(async function() {
  const result = await dnsPromises.lookup('example.org', { family: 6 });
  console.log(result);
})();

  • dnsPromises.lookup(): مشابه dns.lookup() اما با Promise.
  • dnsPromises.resolve4(): دریافت رکوردهای A.
  • dnsPromises.resolveMx(): دریافت رکوردهای MX.
  • dnsPromises.reverse(): تبدیل IP به نام میزبان.

نتیجه‌گیری


ماژول node:dns در Node.js امکانات پیشرفته‌ای برای مدیریت رکوردهای DNS، کنترل ترتیب نتایج، و استفاده از API مبتنی بر Promise فراهم می‌کند. این قابلیت‌ها توسعه‌دهندگان را قادر می‌سازد تا برنامه‌های شبکه‌ای دقیق‌تر و انعطاف‌پذیرتری بسازند.


1. dnsPromises.resolve()


این متد یک نام میزبان را به رکوردهای DNS تبدیل می‌کند. نوع رکورد با پارامتر rrtype مشخص می‌شود.


  • A: آدرس‌های IPv4 → dnsPromises.resolve4()
  • AAAA: آدرس‌های IPv6 → dnsPromises.resolve6()
  • ANY: همهٔ رکوردها → dnsPromises.resolveAny()
  • CNAME: نام‌های canonical → dnsPromises.resolveCname()
  • MX: رکوردهای Mail Exchange → dnsPromises.resolveMx()
  • NS: رکوردهای Name Server → dnsPromises.resolveNs()
  • PTR: رکوردهای Pointer → dnsPromises.resolvePtr()
  • SOA: رکوردهای Start of Authority → dnsPromises.resolveSoa()
  • SRV: رکوردهای سرویس → dnsPromises.resolveSrv()
  • TLSA: رکوردهای Certificate Association → dnsPromises.resolveTlsa()
  • TXT: رکوردهای متنی → dnsPromises.resolveTxt()

در صورت موفقیت، Promise با آرایه‌ای از رکوردها resolve می‌شود. در صورت خطا، Promise reject شده و خطا شامل err.code خواهد بود.


2. dnsPromises.resolve4()


این متد برای دریافت رکوردهای A (آدرس‌های IPv4) استفاده می‌شود.


  • hostname: نام میزبان.
  • options.ttl: اگر true باشد، مقدار TTL هر رکورد نیز بازگردانده می‌شود.

const dnsPromises = require('node:dns').promises;

(async function() {
  const addresses = await dnsPromises.resolve4('example.org');
  console.log(addresses);
  // خروجی: ['74.125.79.104', '74.125.79.105', '74.125.79.106']
})();

اگر گزینهٔ ttl فعال باشد:


const addresses = await dnsPromises.resolve4('example.org', { ttl: true });
console.log(addresses);
// خروجی: [{ address: '74.125.79.104', ttl: 60 }, ...]

3. کاربردها


  • دریافت آدرس‌های IPv4 و IPv6 برای اتصال شبکه.
  • مدیریت رکوردهای MX برای سرورهای ایمیل.
  • بررسی رکوردهای TXT برای تنظیمات SPF یا DKIM.
  • مدیریت رکوردهای SOA و SRV برای سرویس‌های خاص.

نتیجه‌گیری


متدهای dnsPromises.resolve() و dnsPromises.resolve4() ابزارهای قدرتمندی برای کار با رکوردهای DNS در Node.js هستند. این متدها با استفاده از Promiseها امکان مدیریت مدرن و غیرهمزمان رکوردهای DNS را فراهم می‌کنند و برای برنامه‌های شبکه‌ای و امنیتی بسیار کاربردی‌اند.


1. dnsPromises.resolve6()


این متد رکوردهای AAAA (آدرس‌های IPv6) را برای یک hostname بازمی‌گرداند.


  • options.ttl: در صورت true بودن، مقدار TTL هر رکورد نیز بازگردانده می‌شود.

2. dnsPromises.resolveAny()


این متد همهٔ رکوردهای DNS را بازمی‌گرداند. نتیجه شامل انواع مختلف رکوردها مانند A، AAAA، MX، NS، TXT، SOA و غیره خواهد بود.


3. سایر متدهای resolve


  • dnsPromises.resolveCaa(): دریافت رکوردهای CA Authorization.
  • dnsPromises.resolveCname(): دریافت رکوردهای Canonical Name.
  • dnsPromises.resolveMx(): دریافت رکوردهای Mail Exchange.
  • dnsPromises.resolveNaptr(): دریافت رکوردهای مبتنی بر Regular Expression.
  • dnsPromises.resolveNs(): دریافت رکوردهای Name Server.
  • dnsPromises.resolvePtr(): دریافت رکوردهای Pointer.
  • dnsPromises.resolveSoa(): دریافت رکوردهای Start of Authority.
  • dnsPromises.resolveSrv(): دریافت رکوردهای سرویس.
  • dnsPromises.resolveTlsa(): دریافت رکوردهای Certificate Association.
  • dnsPromises.resolveTxt(): دریافت رکوردهای متنی.

4. dnsPromises.reverse()


این متد یک آدرس IPv4 یا IPv6 را به نام میزبان تبدیل می‌کند.


5. مدیریت ترتیب نتایج


  • dnsPromises.setDefaultResultOrder(order): تنظیم ترتیب پیش‌فرض (ipv4first، ipv6first، verbatim).
  • dnsPromises.getDefaultResultOrder(): دریافت ترتیب پیش‌فرض فعلی.

1. dnsPromises.resolve6()


این متد رکوردهای AAAA (آدرس‌های IPv6) را برای یک hostname بازمی‌گرداند.


  • options.ttl: در صورت true بودن، مقدار TTL هر رکورد نیز بازگردانده می‌شود.

2. dnsPromises.resolveAny()


این متد همهٔ رکوردهای DNS را برای یک hostname بازمی‌گرداند. نتیجه شامل انواع مختلف رکوردها مانند A، AAAA، MX، NS، TXT، SOA و غیره خواهد بود.


3. سایر متدهای resolve


  • dnsPromises.resolveCaa(): رکوردهای CA Authorization.
  • dnsPromises.resolveCname(): رکوردهای Canonical Name.
  • dnsPromises.resolveMx(): رکوردهای Mail Exchange.
  • dnsPromises.resolveNaptr(): رکوردهای مبتنی بر Regular Expression.
  • dnsPromises.resolveNs(): رکوردهای Name Server.
  • dnsPromises.resolvePtr(): رکوردهای Pointer.
  • dnsPromises.resolveSoa(): رکوردهای Start of Authority.
  • dnsPromises.resolveSrv(): رکوردهای سرویس.
  • dnsPromises.resolveTlsa(): رکوردهای Certificate Association.
  • dnsPromises.resolveTxt(): رکوردهای متنی.

4. dnsPromises.reverse()


این متد یک آدرس IPv4 یا IPv6 را به نام میزبان تبدیل می‌کند.


5. مدیریت ترتیب نتایج


  • dnsPromises.setDefaultResultOrder(order): تنظیم ترتیب پیش‌فرض (ipv4first، ipv6first، verbatim).
  • dnsPromises.getDefaultResultOrder(): دریافت ترتیب پیش‌فرض فعلی.

6. تنظیم سرورهای DNS


با استفاده از dnsPromises.setServers() می‌توان سرورهای DNS سفارشی را مشخص کرد:


dnsPromises.setServers([
  '8.8.8.8',
  '[2001:4860:4860::8888]',
  '8.8.8.8:1053',
  '[2001:4860:4860::8888]:1053',
]);

نتیجه‌گیری


ماژول dns.promises مجموعه‌ای کامل از متدهای Promise-based برای کار با رکوردهای DNS در Node.js ارائه می‌دهد. این متدها امکان مدیریت رکوردهای مختلف، انجام reverse lookup، کنترل ترتیب نتایج و تنظیم سرورهای سفارشی را فراهم می‌کنند و برای توسعهٔ برنامه‌های شبکه‌ای مدرن بسیار کاربردی‌اند.


6. تنظیم سرورهای DNS


با استفاده از dnsPromises.setServers() می‌توان سرورهای DNS سفارشی را مشخص کرد:


dnsPromises.setServers([
  '8.8.8.8',
  '[2001:4860:4860::8888]',
  '8.8.8.8:1053',
  '[2001:4860:4860::8888]:1053',
]);

نتیجه‌گیری


ماژول dns.promises مجموعه‌ای کامل از متدهای Promise-based برای کار با رکوردهای DNS در Node.js ارائه می‌دهد. این متدها امکان مدیریت رکوردهای مختلف، انجام reverse lookup، کنترل ترتیب نتایج و تنظیم سرورهای سفارشی را فراهم می‌کنند و برای توسعهٔ برنامه‌های شبکه‌ای مدرن بسیار کاربردی‌اند.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

آشنایی کامل با ماژول Cluster در Node.js و نحوه افزایش مقیاس‌پذیری سرور

ماژول Cluster در Node.js به توسعه‌دهندگان اجازه می‌دهد چندین پردازش همزمان ایجاد کنند که یک پورت سرور را به اشتراک می‌گذارند. این کار باعث استفاده بهتر از هسته‌های CPU و افزایش توان پردازش برنامه می‌شود. در این مقاله نحوه کار Cluster، مدیریت Workerها، تنظیمات مهم و مثال عملی را بررسی می‌کنیم.

ادامه

راهنمای جامع ماژول VM در Node.js (ماژول node:vm)

ماژول node:vm امکان کامپایل و اجرای کد جاوااسکریپت در کانتکست‌های ایزولهٔ V8 را فراهم می‌کند. این کانتکست‌ها مانند یک «سندباکس سبک» داخل برنامهٔ Node.js عمل می‌کنند و هرکدام globalThis مخصوص خود را دارند. این ماژول برای اجرای پویا، موتورهای قالب (Template Engines)، سیستم‌های افزونه (Plugin Systems)، REPLها و تست ایزولهٔ منطق بسیار مناسب است. اما نکتهٔ بسیار مهم: vm یک ابزار امنیتی نیست و نباید برای اجرای کدهای غیرقابل‌اعتماد استفاده شود.

ادامه

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

ادامه

راهنمای جامع Worker Threads در Node.js (ماژول node:worker_threads)

ماژول node:worker_threads امکان اجرای واقعی چندریسمانی (Multithreading) را در Node.js فراهم می‌کند. برخلاف مدل تک‌ریسمانی سنتی Node.js، Worker Threads اجازه می‌دهند کارهای سنگین CPU در ریسه‌های جداگانه اجرا شوند بدون اینکه حلقهٔ رویداد (Event Loop) مسدود شود. این ماژول از حافظهٔ اشتراکی، انتقال بدون کپی (Zero‑Copy)، کانال‌های پیام، Worker Pool، محدودیت منابع و ابزارهای همگام‌سازی پیشرفته پشتیبانی می‌کند. Worker Threads برای پردازش‌های محاسباتی سنگین ایده‌آل هستند، در حالی که I/O همچنان باید توسط ریسهٔ اصلی مدیریت شود.

ادامه

راهنمای جامع ماژول util در Node.js

ماژول node:util مجموعه‌ای از توابع کمکی قدرتمند برای استفاده در هستهٔ Node.js و همچنین توسعهٔ برنامه‌ها ارائه می‌دهد. این ماژول ابزارهایی برای دیباگ، بازرسی اشیا، تبدیل Callback ↔ Promise، قالب‌بندی رشته‌ها، بررسی انواع، مدیریت خطاها، رمزگذاری متن، پردازش MIME، پارس آرگومان‌های CLI، سیگنال‌های Abort، و ابزارهای متفرقه فراهم می‌کند. این ماژول یکی از جعبه‌ابزارهای اصلی و ضروری برای توسعه‌دهندگان Node.js است.

ادامه

راهنمای جامع ماژول URL در Node.js

ماژول node:url ابزارهایی برای تحلیل، ساخت، و دست‌کاری URLها در Node.js فراهم می‌کند. Node.js دو API برای کار با URL دارد: WHATWG URL API — استاندارد مدرن و سازگار با مرورگرها (توصیه‌شده). Legacy API — API قدیمی Node.js (غیرتوصیه‌شده). WHATWG URL API یک رابط تمیز، سازگار و قدرتمند برای کار با اجزای URL، پارامترهای query، الگوهای URL و حتی Blob URLها ارائه می‌دهد.

ادامه