如何查找域名服务器

原文:How to find a domain’s authoritative nameservers

如果你更新了你的 DNS 解析但是没有生效,那么有两种可能:

  1. 你的域名服务器上没有正确的记录;
  2. 你的域名服务器上有正确的记录,但是旧的记录还在缓存里,你需要等旧的记录超时;

为了能够判断到底是那种情况(你是否需要修改 DNS 配置,或者再继续等等),你需要找到你主机的域名服务器,并且看到上面的记录。

简单但不准确的方法

如果你确信自己最近没有更新 DNS 服务,最简单的方法就是通过执行 dig +short ns DOMAIN 命令查找。

1
2
3
$ dig +short ns rickylss.site
dns14.hichina.com.
dns13.hichina.com.

在这种情况下,我们得到了正确的答案。

但是如果你最近更新了你的 DNS 服务,它可能会给你一个不准确的答案。

第一步:查找根域名服务器

在这里我们以查找 rickylss.site 域名服务器为例。

无论我们查找的是什么域名,我们都需要从根域名服务器开始。h.root-servers.net 是 13 个根域名服务器之一,因此 dig @h.root-servers.net 意味着将查询请求发送给 h.root-servers.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
dig @h.root-servers.net rickylss.site                              10:44:14

; <<>> DiG 9.16.15-Ubuntu <<>> @h.root-servers.net rickylss.site
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4431
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 9
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;rickylss.site.			IN	A

;; AUTHORITY SECTION:
site.			172800	IN	NS	a.nic.site.
site.			172800	IN	NS	b.nic.site.
site.			172800	IN	NS	e.nic.site.
site.			172800	IN	NS	f.nic.site.

;; ADDITIONAL SECTION:
a.nic.site.		172800	IN	A	194.169.218.61
b.nic.site.		172800	IN	A	185.24.64.61
e.nic.site.		172800	IN	A	212.18.248.61
f.nic.site.		172800	IN	A	212.18.249.61
a.nic.site.		172800	IN	AAAA	2001:67c:13cc::1:61
b.nic.site.		172800	IN	AAAA	2a04:2b00:13cc::1:61
e.nic.site.		172800	IN	AAAA	2a04:2b00:13ee::61
f.nic.site.		172800	IN	AAAA	2a04:2b00:13ff::61

;; Query time: 84 msec
;; SERVER: 198.97.190.53#53(198.97.190.53)
;; WHEN: 五 3 月 04 10:50:06 CST 2022
;; MSG SIZE  rcvd: 286

我们要的正确答案就在 “AUTHORITY SECTION“ 里:

1
site.			172800	IN	NS	a.nic.site.

“AUTHORITY SECTION“ 下的任意一行都行,这里我们直接选第一行;

接下来我们用 a.nic.site 来做第二步:

第二步:查询 .site 域名服务器

同第一步相似,我们查询第一步中找到的 .site 域名服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ dig @a.nic.site rickylss.site                                      10:50:06

; <<>> DiG 9.16.15-Ubuntu <<>> @a.nic.site rickylss.site
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43120
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: bd5f9219be665508c84aa55b62217fbb99438a61510f4817 (good)
;; QUESTION SECTION:
;rickylss.site.			IN	A

;; AUTHORITY SECTION:
rickylss.site.		3600	IN	NS	dns14.hichina.com.
rickylss.site.		3600	IN	NS	dns13.hichina.com.

;; Query time: 148 msec
;; SERVER: 194.169.218.61#53(194.169.218.61)
;; WHEN: 五 3 月 04 10:55:56 CST 2022
;; MSG SIZE  rcvd: 121

和上次一样,找到 ”AUTHORITY SECTION“ :

1
rickylss.site.		3600	IN	NS	dns14.hichina.com.

成功了!?

现在我们成功找到了 rickylss.site 的域名服务器,和简单但不准确的方法中获取的结果一样。现在我们可以查询 dns14.hichina.com. 直接查找 rickylss.site 的 DNS 记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ dig @dns14.hichina.com. rickylss.site                              11:00:24

; <<>> DiG 9.16.15-Ubuntu <<>> @dns14.hichina.com. rickylss.site
; (9 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9607
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;rickylss.site.			IN	A

;; AUTHORITY SECTION:
rickylss.site.		600	IN	SOA	dns13.hichina.com. hostmaster.hichina.com. 2022011003 3600 1200 86400 600

;; Query time: 12 msec
;; SERVER: 47.118.199.201#53(47.118.199.201)
;; WHEN: 五 3 月 04 11:00:28 CST 2022
;; MSG SIZE  rcvd: 117

在这里我们再次看到了 ”AUTHORITY SECTION“ ,和前面不一样的是,我们这里出现的是个 SOA 记录。这意味着在这个域名服务器里没有找到 rickylss.site 的记录。换成 www.rickylss.site 进行尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ dig @dns13.hichina.com. www.rickylss.site                          11:03:28

; <<>> DiG 9.16.15-Ubuntu <<>> @dns13.hichina.com. www.rickylss.site
; (9 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31461
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.rickylss.site.		IN	A

;; ANSWER SECTION:
www.rickylss.site.	600	IN	A	49.235.89.141

;; Query time: 8 msec
;; SERVER: 47.118.199.202#53(47.118.199.202)
;; WHEN: 五 3 月 04 11:08:54 CST 2022
;; MSG SIZE  rcvd: 62

成功找到 ”ANSWER SECTION“ ,对应地址为 49.235.89.141

DNS 查询背后发生了什么

我喜欢使用这种方式查找主机的域名服务记录的原因是它模仿了 DNS 查询的步骤。当谷歌的 DNS 解析服务器 8.8.8.8 查询 www.rickylss.site 域名的时候,服务器会首先获取到 dns14.hichina.com.

由于这种方法使用了和真实 DNS 查询相同的信息源,因此你每次都能获取正确的结果。

每次我更新我的 DNS 解析服务之后,通常都不会立马更新。因此我会重复上面的步骤,检查一下我的 DNS 记录是否更新了。

其他的方法

除了上面提到的方法,还有其他更简便的方法,但是我不推荐将他们当作主要的方法来使用。

dig +trace DOMAIN

这种方法和上面提到的方法本质相同,因此每次都能拿到正确的结果,但是它的输出让人困惑,所以我不推荐用这种方法。

dig ns DOMAIN

这种方法通常能够拿到正确的结果,但是有两种情况会导致出错:

  1. 你可能会拿到一个旧的被缓存过的记录;
  2. 你得到的 NS 记录和我们在这篇文章中描述的方法不是来自同一个地方。举例来说,这个时候我们拿到的 NS 记录不是来自a.nic.site 而是来自 dns14.hichina.com. 通常来说这没什么区别,但是在某些奇怪的情况下就大有不同。

dig soa DOMAIN

你同样可以在 SOA 记录中找到对应的域名服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig soa www.rickylss.site                                          11:35:22

; <<>> DiG 9.16.15-Ubuntu <<>> soa www.rickylss.site
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47314
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.rickylss.site.		IN	SOA

;; AUTHORITY SECTION:
rickylss.site.		1	IN	SOA	dns13.hichina.com. hostmaster.hichina.com. 2022011003 3600 1200 86400 600

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: 五 3 月 04 11:49:49 CST 2022
;; MSG SIZE  rcvd: 110

通常这也是没有问题的,但是有两种特殊情况,这个和 dig ns DOMAIN 中提到的情况相似:

  1. 这个返回来自于权威域名服务器。因此,如果你正在更新你的域名解析服务,你可能拿到错误的结果,因为你的 DNS 解析服务器请求了旧的域名服务器;
  2. 因为某种原因,你的权威名称服务器可能会返回一个没有正确的名称服务器的 SOA 记录,

whois DOMAIN

通常会返回正确的结果,但是也可能会是旧的缓存的结果;