Skip to content

Node.js 的 dns 模块提供了域名系统(DNS)的接口,用于执行 DNS 查询。

它可以用于解析域名、查询 DNS 记录类型等操作。

主要功能

  • 解析域名:将域名解析为 IP 地址。
  • 查询 DNS 记录:可以查询特定类型的 DNS 记录,如 AAAAAMXTXT 等。
  • 反向解析:将 IP 地址反向解析为域名。
js
{
  lookup: [Function: lookup],
  lookupService: [Function: lookupService],
  Resolver: [class Resolver extends ResolverBase],
  setDefaultResultOrder: [Function: setDefaultResultOrder],
  setServers: [Function: defaultResolverSetServers],
  ADDRCONFIG: 1024,
  ALL: 256,
  V4MAPPED: 2048,
  NODATA: 'ENODATA',
  FORMERR: 'EFORMERR',
  SERVFAIL: 'ESERVFAIL',
  NOTFOUND: 'ENOTFOUND',
  NOTIMP: 'ENOTIMP',
  REFUSED: 'EREFUSED',
  BADQUERY: 'EBADQUERY',
  BADNAME: 'EBADNAME',
  BADFAMILY: 'EBADFAMILY',
  BADRESP: 'EBADRESP',
  CONNREFUSED: 'ECONNREFUSED',
  TIMEOUT: 'ETIMEOUT',
  EOF: 'EOF',
  FILE: 'EFILE',
  NOMEM: 'ENOMEM',
  DESTRUCTION: 'EDESTRUCTION',
  BADSTR: 'EBADSTR',
  BADFLAGS: 'EBADFLAGS',
  NONAME: 'ENONAME',
  BADHINTS: 'EBADHINTS',
  NOTINITIALIZED: 'ENOTINITIALIZED',
  LOADIPHLPAPI: 'ELOADIPHLPAPI',
  ADDRGETNETWORKPARAMS: 'EADDRGETNETWORKPARAMS',
  CANCELLED: 'ECANCELLED',
  getServers: [Function: bound getServers],
  resolve: [Function: bound resolve],
  resolve4: [Function: bound queryA],
  resolve6: [Function: bound queryAaaa],
  resolveAny: [Function: bound queryAny],
  resolveCaa: [Function: bound queryCaa],
  resolveCname: [Function: bound queryCname],
  resolveMx: [Function: bound queryMx],
  resolveNaptr: [Function: bound queryNaptr],
  resolveNs: [Function: bound queryNs],
  resolvePtr: [Function: bound queryPtr],
  resolveSoa: [Function: bound querySoa],
  resolveSrv: [Function: bound querySrv],
  resolveTxt: [Function: bound queryTxt],
  reverse: [Function: bound getHostByAddr],
  promises: [Getter]
}

1.lookup

dns.lookup 用于将主机名(通常是域名)解析为对应的 IP 地址。

dns.lookup(hostname, [options], callback)

  • hostname: 要解析的域名或主机名,类型为 string
  • options: 可选的配置对象或数字,可以包含以下属性:
    • family: 数字,指定 IP 地址的类型,4 表示 IPv4,6 表示 IPv6。默认为 0,表示可以返回 IPv4 或 IPv6 地址,具体取决于系统的 DNS 解析器
    • all: 布尔值,如果设置为 true,返回一个包含所有解析地址的数组。默认为 false
    • hints: 数字,指定地址查找的选项,如 dns.ADDRCONFIGdns.V4MAPPED
    • verbatim: 布尔值,当设置为 true 时,以字面上的顺序返回记录。默认为 false,这意味着 dns.lookup() 将以最优顺序返回记录。
  • callback: 回调函数,形式为 function(err, address, family),如果 all 设置为 true,则形式为 function(err, addresses)

dns.lookup 方法的 all 选项设置为 true 时,它会返回主机名对应的所有 IP 地址。原因如下:

  1. DNS 记录的多样性 域名系统(DNS)可以为一个域名配置多个 IP 地址。这些地址可能是为了负载均衡、故障转移或者是不同的服务部署在不同的服务器上。例如,一个大型网站可能有多个服务器处理请求,从而提供多个 IP 地址。这些地址可以是 IPv4 和 IPv6。

  2. 负载均衡 为了提高网站的可靠性和性能,通常会将流量分配到多个服务器上。这意味着单个域名可以映射到多个 IP 地址,这些 IP 地址通常在 DNS 记录中被返回。

  3. DNS 记录的类型 某些域名配置有多种类型的记录,如 A 记录和 AAAA 记录。A 记录用于返回 IPv4 地址,而 AAAA 记录用于返回 IPv6 地址。当 all 设置为 truedns.lookup 会返回所有匹配的记录,包括不同类型的 IP 地址。

js
const dns = require('node:dns')

dns.lookup('www.baidu.com', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family)
})

dns.lookup('www.baidu.com', {all: true}, (err, addresses) => {
  console.log('addresses: %j', addresses)
})

2.lookupService

在 Node.js 中,dns.lookupService 是一个用于将 IP 地址和端口号解析为主机名和服务名的方法。

它是 DNS 模块的一部分,与 dns.lookup 不同,它的主要功能是反向 DNS 查询。

dns.lookupService(address, port, callback)

  • address:一个字符串,表示要解析的 IP 地址。
  • port:一个数字,表示与地址关联的端口号。
  • callback:回调函数,接收三个参数 (err, hostname, service)
    • err: 如果发生错误,将包含错误对象,否则为 null
    • hostname: 解析后的主机名。
    • service: 解析后的服务名。

dns.lookupService 方法中,服务名(service)是与指定端口号相关联的网络服务的名称。

服务名通常基于互联网分配的端口号标准,即 "知名端口"。

这些服务名在许多操作系统和网络工具中都有标准化定义,常见的例子包括 httphttpsftpssh 等。

常见的服务名示例

  • http: 对应端口号 80,用于 Web 服务的超文本传输协议 (HTTP)。
  • https: 对应端口号 443,用于安全的 HTTP (HTTPS)。
  • ftp: 对应端口号 21,用于文件传输协议 (FTP)。
  • ssh: 对应端口号 22,用于安全外壳协议 (SSH)。
  • domain: 对应端口号 53,用于域名系统 (DNS)。
js
const dns = require('dns')

dns.lookupService('8.8.8.8', 53, (err, hostname, service) => {
  if (err) {
    console.log('Error:', err)
  } else {
    console.log('Hostname:', hostname)
    console.log('Service:', service)
  }
})

3.Resolver

在 Node.js 的 DNS 模块中,Resolver 是一个类,用于执行自定义的 DNS 查询。

通过使用 Resolver,可以创建自己的 DNS 解析实例,而不是依赖于 Node.js 全局的 DNS 解析器。

这在需要使用特定的 DNS 服务器或者进行定制化 DNS 查询时非常有用。

Resolver 提供了一些常用的 DNS 查询方法,这些方法与 dns 模块中的全局方法类似,但它们只对该实例生效。

  • resolver.resolve(hostname, [rrtype], callback):解析主机名到 IP 地址,rrtype 可以是 'A''AAAA''MX' 等记录类型。
  • resolver.reverse(ip, callback):执行反向 DNS 查询,将 IP 地址解析为主机名。
  • resolver.getServers():返回该解析器实例的 DNS 服务器列表。
  • resolver.setServers(servers):设置该解析器实例使用的 DNS 服务器列表。
js
const { Resolver } = require('dns')
const resolver = new Resolver()

// 设置自定义 DNS 服务器
resolver.setServers(['8.8.8.8', '8.8.4.4'])

// 使用自定义 DNS 服务器进行解析
resolver.resolve('www.example.com', (err, addresses) => {
  if (err) {
    console.log('Error:', err)
  } else {
    console.log('Addresses:', addresses)
  }
})

// 执行反向 DNS 查询
resolver.reverse('8.8.8.8', (err, hostnames) => {
  if (err) {
    console.log('Error:', err)
  } else {
    console.log('Hostnames:', hostnames)
  }
})

4.resolve

dns.lookup 用于将域名解析为 IP 地址。它类似于操作系统级别的 DNS 解析函数,通常会同时查找 A(IPv4)和 AAAA(IPv6)记录。 dns.resolve 用于查询特定类型的 DNS 记录,如 AAAAAMXTXT 等。它是直接与 DNS 服务器通信进行查询。

  1. dns.resolve(hostname[, rrtype], callback)

  2. dns.resolve4(hostname, callback)

  3. dns.resolve6(hostname, callback)

  4. dns.resolveMx(hostname, callback)

  5. dns.resolveTxt(hostname, callback)

  6. dns.resolveSrv(hostname, callback)

  7. dns.resolvePtr(hostname, callback)

  8. dns.resolveNs(hostname, callback)

  9. dns.resolveCname(hostname, callback)

  10. dns.resolveSoa(hostname, callback)

  11. dns.resolveNaptr(hostname, callback)

  12. A (Address) 记录

    • 描述: 将域名映射到一个 IPv4 地址。
    • 用途: 当你输入一个域名时,DNS 解析器会查询 A 记录以获取该域名对应的 IPv4 地址。
    • 示例: example.com -> 93.184.216.34
  13. AAAA (IPv6 Address) 记录

    • 描述: 将域名映射到一个 IPv6 地址。
    • 用途: 当你输入一个域名时,DNS 解析器会查询 AAAA 记录以获取该域名对应的 IPv6 地址。
    • 示例: example.com -> 2606:2800:220:1:248:1893:25c8:1946
  14. MX (Mail Exchange) 记录

    • 描述: 指定邮件服务器的域名,该服务器负责接收该域名的电子邮件。
    • 用途: 用于电子邮件路由,指明哪台服务器接收特定域名的邮件。
    • 示例: example.com -> mail1.example.com (优先级: 10), mail2.example.com (优先级: 20)
  15. TXT (Text) 记录

    • 描述: 存储任意文本数据,可以包括各种验证信息或说明。
    • 用途: 通常用于域名所有权验证、SPF(发件人策略框架)等用途,确保邮件和服务的真实性。
    • 示例: example.com -> "v=spf1 include:_spf.google.com ~all"
  16. SRV (Service) 记录

    • 描述: 指定特定服务的主机及端口号。
    • 用途: 用于指定某些协议或服务的服务器位置,如 SIP、XMPP 等。
    • 示例: _sip._tcp.example.com -> priority: 10, weight: 60, port: 5060, target: sipserver.example.com
  17. PTR (Pointer) 记录

    • 描述: 将 IP 地址映射到一个域名(反向 DNS 解析)。
    • 用途: 用于反向查找 IP 地址的域名,通常用于验证邮件服务器的身份。
    • 示例: 93.184.216.34 -> example.com
  18. NS (Name Server) 记录

    • 描述: 指定管理域名的 DNS 服务器。
    • 用途: 确定哪些服务器负责处理特定域名的 DNS 查询。
    • 示例: example.com -> ns1.example.com, ns2.example.com
  19. CNAME (Canonical Name) 记录

    • 描述: 将一个域名别名(alias)指向另一个域名。
    • 用途: 用于将多个域名映射到同一个主机名,便于管理。
    • 示例: www.example.com -> example.com
  20. SOA (Start of Authority) 记录

    • 描述: 包含有关 DNS 区域的管理信息。
    • 用途: 包括 DNS 区域的原始服务器、管理员邮箱、序列号、刷新间隔、重试时间等。
    • 示例: example.com -> primary_ns: ns1.example.com, contact: admin.example.com, serial: 2023080801
  21. NAPTR (Name Authority Pointer) 记录

    • 描述: 用于支持正则表达式替换的 DNS 记录,通常与 SRV 记录一起使用。
    • 用途: 通常用于映射电话号码到 URI(如 SIP 协议)或其他服务。
    • 示例: example.com -> order: 100, preference: 10, flags: "u", service: "E2U+sip", regexp: "!^.*$!sip:info@example.com!"
js
const dns = require('node:dns')

dns.resolve('baidu.com', (err, address) => {
  console.log('resolve', address)
})

dns.resolve4('baidu.com', (err, address) => {
  console.log('resolve4', address)
})

dns.resolve6('www.baidu.com', (err, address) => {
  console.log('resolve6', address)
})

dns.resolveMx('baidu.com', (err, address) => {
  console.log('resolveMx', address)
})

dns.resolveTxt('baidu.com', (err, address) => {
  console.log('resolveTxt', address)
})

dns.resolveSrv('www.baidu.com', (err, address) => {
  console.log('resolveSrv', address)
})

dns.resolvePtr('baidu.com', (err, address) => {
  console.log('resolvePtr', address)
})

dns.resolveNs('baidu.com', (err, address) => {
  console.log('resolveNs', address)
})

dns.resolveCname('www.baidu.com', (err, address) => {
  console.log('resolveCname', address)
})

dns.resolveSoa('baidu.com', (err, address) => {
  console.log('resolveSoa', address)
})

dns.resolveNaptr('baidu.com', (err, address) => {
  console.log('resolveNaptr', address)
})

5.reverse

dns.reverse 是 Node.js DNS 模块中的一个方法,用于执行反向 DNS 查询。

它将一个 IP 地址解析为关联的主机名列表。

反向 DNS 查询的典型用途是通过已知的 IP 地址查找域名。

dns.reverse(ip, callback)

  • ip:一个字符串,表示要解析的 IP 地址。
  • callback:回调函数,接收两个参数 (err, hostnames)
    • err: 如果发生错误,将包含错误对象,否则为 null
    • hostnames: 包含解析后主机名的数组。
js
const dns = require('node:dns')

dns.reverse('8.8.8.8', (err, hostnames) => {
  if (err) {
    console.log(err.stack)
  }
  console.log('hostnames for 8.8.8.8: %j', hostnames)
})

6.setDefaultResultOrder

dns.setDefaultResultOrder 是 Node.js dns 模块中的一个方法,用于设置 DNS 解析返回的地址列表的默认排序顺序。

它允许控制当使用 dns.lookup 方法进行域名解析时,返回的 IP 地址的顺序。

dns.setDefaultResultOrder(order)

  • order: 一个字符串,指定返回的 IP 地址顺序。可选值包括:
  • "ipv4first": 使 IPv4 地址优先于 IPv6 地址返回。
  • "verbatim": 按照 DNS 服务器返回的顺序保留地址。
js
const dns = require('dns')

// 设置默认的结果顺序为 "ipv4first"
dns.setDefaultResultOrder('ipv4first')

// 解析 example.com
dns.lookup('example.com', (err, address, family) => {
  if (err) throw err
  console.log('Address: %j family: IPv%s', address, family)
})

7.setServers

dns.setServers() 是 Node.js dns 模块中的一个方法,用于手动设置 DNS 解析器使用的 DNS 服务器地址列表。

设置后,所有使用 dns 模块的 DNS 查询都会通过这些指定的服务器进行解析,而不是通过系统默认的 DNS 服务器。

dns.setServers(servers)

  • servers: 一个字符串数组,其中每个元素是一个 DNS 服务器的 IP 地址或 IP 地址和端口的组合。支持 IPv4 和 IPv6 地址格式。
    • IPv4 示例: "8.8.8.8"
    • IPv6 示例: "2001:4860:4860::8888"
    • IP 地址和端口号组合: "8.8.8.8:53" 或 "2001:4860:4860::8888:53"
js
const dns = require('dns')

// 设置自定义的 DNS 服务器
dns.setServers(['8.8.8.8', '8.8.4.4'])

// 进行 DNS 查询
dns.lookup('example.com', (err, address, family) => {
  if (err) throw err
  console.log('Address:', address)
})

const servers = dns.getServers()
console.log('DNS Servers:', servers)

8.getServers

dns.getServers() 是 Node.js dns 模块中的一个方法,用于返回当前 DNS 解析器正在使用的 DNS 服务器地址列表。

这些地址通常是从系统配置中读取的,但也可以通过 dns.setServers() 方法手动设置。

const servers = dns.getServers()

  • 系统默认 DNS 服务器: 如果没有手动设置 DNS 服务器,dns.getServers() 将返回操作系统默认配置的 DNS 服务器地址。
  • 手动设置: 如果你通过 dns.setServers() 方法手动设置了 DNS 服务器地址,dns.getServers() 将返回你手动设置的这些地址。

dns.getServers() 返回的服务器列表可以包括 IP 地址和可选的端口号(格式为 ip:port),如果没有端口号,默认使用 53 端口。

js
const dns = require('dns')

// 获取当前正在使用的 DNS 服务器
const servers = dns.getServers()
console.log('DNS Servers:', servers)