Node.js 的 dns
模块提供了域名系统(DNS)的接口,用于执行 DNS 查询。
它可以用于解析域名、查询 DNS 记录类型等操作。
主要功能
- 解析域名:将域名解析为 IP 地址。
- 查询 DNS 记录:可以查询特定类型的 DNS 记录,如
A
、AAAA
、MX
、TXT
等。 - 反向解析:将 IP 地址反向解析为域名。
{
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.ADDRCONFIG
或dns.V4MAPPED
。verbatim
: 布尔值,当设置为true
时,以字面上的顺序返回记录。默认为false
,这意味着dns.lookup()
将以最优顺序返回记录。
callback
: 回调函数,形式为function(err, address, family)
,如果all
设置为true
,则形式为function(err, addresses)
。
当 dns.lookup
方法的 all
选项设置为 true
时,它会返回主机名对应的所有 IP 地址。原因如下:
DNS 记录的多样性 域名系统(DNS)可以为一个域名配置多个 IP 地址。这些地址可能是为了负载均衡、故障转移或者是不同的服务部署在不同的服务器上。例如,一个大型网站可能有多个服务器处理请求,从而提供多个 IP 地址。这些地址可以是 IPv4 和 IPv6。
负载均衡 为了提高网站的可靠性和性能,通常会将流量分配到多个服务器上。这意味着单个域名可以映射到多个 IP 地址,这些 IP 地址通常在 DNS 记录中被返回。
DNS 记录的类型 某些域名配置有多种类型的记录,如
A
记录和AAAA
记录。A
记录用于返回 IPv4 地址,而AAAA
记录用于返回 IPv6 地址。当all
设置为true
,dns.lookup
会返回所有匹配的记录,包括不同类型的 IP 地址。
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
)是与指定端口号相关联的网络服务的名称。
服务名通常基于互联网分配的端口号标准,即 "知名端口"。
这些服务名在许多操作系统和网络工具中都有标准化定义,常见的例子包括 http
、https
、ftp
、ssh
等。
常见的服务名示例
http
: 对应端口号 80,用于 Web 服务的超文本传输协议 (HTTP)。https
: 对应端口号 443,用于安全的 HTTP (HTTPS)。ftp
: 对应端口号 21,用于文件传输协议 (FTP)。ssh
: 对应端口号 22,用于安全外壳协议 (SSH)。domain
: 对应端口号 53,用于域名系统 (DNS)。
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 服务器列表。
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 记录,如 A
、AAAA
、MX
、TXT
等。它是直接与 DNS 服务器通信进行查询。
dns.resolve(hostname[, rrtype], callback)
dns.resolve4(hostname, callback)
dns.resolve6(hostname, callback)
dns.resolveMx(hostname, callback)
dns.resolveTxt(hostname, callback)
dns.resolveSrv(hostname, callback)
dns.resolvePtr(hostname, callback)
dns.resolveNs(hostname, callback)
dns.resolveCname(hostname, callback)
dns.resolveSoa(hostname, callback)
dns.resolveNaptr(hostname, callback)
A (Address) 记录
- 描述: 将域名映射到一个 IPv4 地址。
- 用途: 当你输入一个域名时,DNS 解析器会查询
A
记录以获取该域名对应的 IPv4 地址。 - 示例:
example.com -> 93.184.216.34
AAAA (IPv6 Address) 记录
- 描述: 将域名映射到一个 IPv6 地址。
- 用途: 当你输入一个域名时,DNS 解析器会查询
AAAA
记录以获取该域名对应的 IPv6 地址。 - 示例:
example.com -> 2606:2800:220:1:248:1893:25c8:1946
MX (Mail Exchange) 记录
- 描述: 指定邮件服务器的域名,该服务器负责接收该域名的电子邮件。
- 用途: 用于电子邮件路由,指明哪台服务器接收特定域名的邮件。
- 示例:
example.com -> mail1.example.com (优先级: 10), mail2.example.com (优先级: 20)
TXT (Text) 记录
- 描述: 存储任意文本数据,可以包括各种验证信息或说明。
- 用途: 通常用于域名所有权验证、SPF(发件人策略框架)等用途,确保邮件和服务的真实性。
- 示例:
example.com -> "v=spf1 include:_spf.google.com ~all"
SRV (Service) 记录
- 描述: 指定特定服务的主机及端口号。
- 用途: 用于指定某些协议或服务的服务器位置,如 SIP、XMPP 等。
- 示例:
_sip._tcp.example.com -> priority: 10, weight: 60, port: 5060, target: sipserver.example.com
PTR (Pointer) 记录
- 描述: 将 IP 地址映射到一个域名(反向 DNS 解析)。
- 用途: 用于反向查找 IP 地址的域名,通常用于验证邮件服务器的身份。
- 示例:
93.184.216.34 -> example.com
NS (Name Server) 记录
- 描述: 指定管理域名的 DNS 服务器。
- 用途: 确定哪些服务器负责处理特定域名的 DNS 查询。
- 示例:
example.com -> ns1.example.com, ns2.example.com
CNAME (Canonical Name) 记录
- 描述: 将一个域名别名(alias)指向另一个域名。
- 用途: 用于将多个域名映射到同一个主机名,便于管理。
- 示例:
www.example.com -> example.com
SOA (Start of Authority) 记录
- 描述: 包含有关 DNS 区域的管理信息。
- 用途: 包括 DNS 区域的原始服务器、管理员邮箱、序列号、刷新间隔、重试时间等。
- 示例:
example.com -> primary_ns: ns1.example.com, contact: admin.example.com, serial: 2023080801
NAPTR (Name Authority Pointer) 记录
- 描述: 用于支持正则表达式替换的 DNS 记录,通常与
SRV
记录一起使用。 - 用途: 通常用于映射电话号码到 URI(如 SIP 协议)或其他服务。
- 示例:
example.com -> order: 100, preference: 10, flags: "u", service: "E2U+sip", regexp: "!^.*$!sip:info@example.com!"
- 描述: 用于支持正则表达式替换的 DNS 记录,通常与
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
: 包含解析后主机名的数组。
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 服务器返回的顺序保留地址。
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"
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 端口。
const dns = require('dns')
// 获取当前正在使用的 DNS 服务器
const servers = dns.getServers()
console.log('DNS Servers:', servers)