NodeJS DNS模块研究

nodejs 提供了 DNS 查询和操作的 API,本篇的目录是:

  • 什么是 DNS 解析?
  • dns.resolve() vs dns.lookup()
  • 什么是反向域名解析?
  • 如何更改 DNS 服务器?

什么是 DNS 解析?

最直观的体验是,当在浏览器中输入网址时,浏览器能够找到网址对应的服务器的 ip 地址。这个过程就是依赖 DNS 域名解析。

DNS 解析的查询过程有两种,一种是迭代查询,一种是递归查询。

dns.resolve() vs dns.lookup()

在 dns 模块中,提供了两类解析的 API:resolve*()loopup()

dns.lookup() 使用的是本地 dns 解析,并且底层是同步调用 getaddrinfo(3) 来实现的。所以对于 dns.lookup() ,它虽然在使用上是异步的方式,但是可能阻塞进程,导致严重的性能问题。

1
2
3
4
5
6
const dns = require("dns");
dns.lookup("baidu.com", (err, address, family) => {
if (err) throw err;
// 地址: "220.181.38.148" 地址族: IPv4
console.log("地址: %j 地址族: IPv%s", address, family);
});

除了 dns.lookup() 之外,dns.resolve*() 函数均是连接到实际的 DNS 服务器,并且使用网络来进行 DNS 查询。

1
2
3
4
5
6
7
8
9
10
// 查看www.qq.com的ipv6记录
dns.resolve("www.qq.com", "AAAA", (err, address) => {
if (err) throw err;
console.log(address); //结果为[ '240e:ff:f040:28::a' ]
});
// 查看xin-tan.com的cname记录
dns.resolve("xin-tan.com", "CNAME", (err, address) => {
if (err) throw err;
console.log(address); //结果为[ 'dongyuanxin.github.io' ]
});

什么是反向域名解析?

正向域名解析是:域名 => ip。反向域名解析是:ip => 域名。

反向域名解析系统(Reverse DNS)的功能确保适当的邮件交换记录是生效的。这是一个最常见的问题(尤其是国外的邮件系统更是如此)。更多的电子邮件提供商是使用反向域名解析系统查找来确认信息是从哪里来的。由于这种方式的使用变得更广泛,那些没有正确地发布反向域名解析系统信息的域可能更常发生邮件的退回。

dns 模块提供了reverse()函数来实现反向域名解析:

1
2
3
4
dns.reverse("220.181.38.148", (err, hostnames) => {
if (err) throw err;
console.log(hostnames); //结果为[ 'public1.114dns.com' ]
});

如何更改 DNS 服务器?

如果想在 dns 模块上修改 DNS 服务器:

1
2
3
4
5
6
dns.setServers([
"4.4.4.4",
"[2001:4860:4860::8888]",
"4.4.4.4:1053",
"[2001:4860:4860::8888]:1053"
]);

如果不想影响其他的解析模块,那么可以新建一个 Resolver 类,更改类的 dns 服务器:

1
2
3
const { Resolver } = require("dns");
const resolver = new Resolver();
resolver.setServers(["4.4.4.4"]);

参考链接