Node.js DNS 模組:網域名稱解析與紀錄查詢

在進行任何網路傳輸之前,電腦必須先將人類可讀的網域名稱(如 google.com)轉換為機器識別的 IP 地址。Node.js 的 dns 模組提供了與作業系統及網路 DNS 伺服器互動的能力。

兩個層次的解析方式

理解 DNS 模組的關鍵在於區分 lookupresolve

1. dns.lookup():系統層級解析

它使用作業系統底層的設定(例如 /etc/hosts 檔案)。如果你想知道「這台電腦會把這個網址指向哪裡」,就用它。

  • 特性:它在執行緒池 (Thread Pool) 中同步呼叫 getaddrinfo(3)。
const dns = require('dns');

dns.lookup('google.com', (err, address, family) => {
  console.log('IP 地址:', address); // 142.251...
  console.log('IP 類型: IPv', family);
});

2. dns.resolve():網路層級查詢

它直接向網路上的 DNS 伺服器發送查詢請求,完全繞過本地的主機設定檔。

// 使用推薦的 Promises 版本
const dns = require('dns/promises');

async function getRecords(domain) {
  try {
    const addresses = await dns.resolve4(domain); // 查詢 IPv4 (A 紀錄)
    console.log(`${domain} 的所有 A 紀錄:`, addresses);
  } catch (err) {
    console.error('查詢失敗');
  }
}

實戰:查詢特定的 DNS 紀錄

除了查 IP 地址,dns.resolve 還能獲取更豐富的網域資訊:

  • MX 紀錄 (郵件伺服器):驗證網域是否具備收信能力。
  • TXT 紀錄:常用於 Google、Facebook 的網域所有權驗證。
  • NS 紀錄:查詢該網域的名稱伺服器。
async function checkMailServer() {
  const mxRecords = await dns.resolveMx('gmail.com');
  console.log('Gmail 的郵件交換伺服器:', mxRecords);
}

async function checkTxtRecords() {
  const txt = await dns.resolveTxt('google.com');
  console.log('TXT 紀錄內容:', txt);
}

反向 DNS 查詢 (Reverse DNS)

如果你拿到一個 IP 位址,想知道它背後對應的網域名稱是什麼,可以使用 reverse()

const hostnames = await dns.reverse('8.8.8.8');
console.log('該 IP 的主機名稱為:', hostnames); // [ 'dns.google' ]

Lookup vs Resolve 比較表

特性dns.lookup()dns.resolve()
資料來源本地 hosts 檔案 + 解析器直接發送到 DNS 伺服器
運作機制佔用 Thread Pool (同步轉換)純非同步網路呼叫
主要功能取得實際連線用的 IP取得各種 DNS 詳細紀錄
推薦場景應用程式發送 HTTP 請求時開發偵錯工具、網域驗證系統

總結

  1. 絕大多數的網路連線建議直接使用 dns.lookup() 或交由 http 模組自動處理。
  2. 當你需要精確的 DNS 紀錄(如 MX, TXT)時,dns.resolve 是唯一的選擇。
  3. 全面採用 dns/promises 能讓你的網路檢測腳本變得更簡潔好讀。