目录

DNS 服务原理简介

DNS(Domain Name System,域名系统)是互联网的一项服务,提供根据域名查询 IP 地址的功能,默认使用 TCP 和 UDP 的 53 端口。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。

DNS 域名层级

早期在浏览器里输入域名时,必须在末尾加一个 .,因为所有的域名尾部,实际上都有一个根域名 root。例如 www.example.com 的真正域名是 www.example.com.root,简写为 www.example.com。因为,根域名 .root 对于所有域名都一样,所以平时是省略的。

  • 根域名的下一级,称为“顶级域名”(top-level domain,缩写为 TLD),例如 .com
  • 再下一级叫做“次级域名”(second-level domain,缩写为 SLD),我们注册的一般都是 SLD;
  • 再下一级是“主机名”(host),又称为“三级域名”。

DNS 分级查询

DNS 服务器根据域名的层级,进行分级查询。每一级域名都有自己的 NS 记录(NS 记录定义见下文),NS 记录指向该级域名的域名服务器,这些服务器知道下一级域名的各种记录。

所谓”分级查询”,就是从根域名开始,依次查询每一级域名的 NS 记录,直到查到最终的 IP 地址,过程大致如下。

  1. 从“根域名服务器”查到 TLD 的 NS 记录和 A 记录(IP 地址)
  2. 从 TLD 查到 SLD 的 NS 记录和 A 记录(IP 地址)
  3. 从 SLD 查出 host 的 IP 地址

目前,世界上一共有十三组根域名服务器,从 A.ROOT-SERVERS.NET 一直到 M.ROOT-SERVERS.NET

DNS 的记录类型

域名与 IP 地址间的对应关系,称为“记录”(record)。根据使用场景,“记录”可以分成不同的类型(type)。

常见的 DNS 记录类型有:

  • A 地址记录(Address),返回域名指向的 IP 地址;
  • AAAA 与 A 记录对应,指向 IPV6 地址;
  • NS 域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为 IP 地址。
  • MX 邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
  • CNAME 规范名称记录(Canonical Name),CNAME 记录用于将某个别名指向到某个 A 记录上,返回该 A 记录域名。
  • PTR 逆向查询记录(Pointer Record),用于从 IP 地址查询域名,用于反垃圾邮件(验证发送邮件的 IP 地址是否真的有它所声称的域名)等;

由于 CNAME 记录就是一个替换,所以域名一旦设置 CNAME 记录以后,就不能再设置其他记录了(比如 A 记录和 MX 记录),这是为了防止产生冲突。

dig 命令

查询域名

1
dig math.stackexchange.com

查询结果会输出六段信息。

第一部分是查询参数和统计:

1
2
3
4
5
; <<>> DiG 9.10.6 <<>> math.stackexchange.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31393
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

第二部分是查询内容:

1
2
;; QUESTION SECTION:
;math.stackexchange.com.		IN	A

第三部分是 DNS 服务器的答复:

1
2
3
4
5
;; ANSWER SECTION:
math.stackexchange.com.	300	IN	A	151.101.193.69
math.stackexchange.com.	300	IN	A	151.101.1.69
math.stackexchange.com.	300	IN	A	151.101.129.69
math.stackexchange.com.	300	IN	A	151.101.65.69

第四部分是域名的 NS 记录(macOS 上的 dig 命令可能没有这部分)

1
2
3
4
5
;; AUTHORITY SECTION:
stackexchange.com.	172800	IN	NS	ns-cloud-d1.googledomains.com.
stackexchange.com.	172800	IN	NS	ns-cloud-d2.googledomains.com.
stackexchange.com.	172800	IN	NS	ns-925.awsdns-51.net.
stackexchange.com.	172800	IN	NS	ns-1029.awsdns-00.org.

第五部分是第四部分中域名服务器的 IP 地址

1
2
3
4
5
;; ADDITIONAL SECTION:
ns-925.awsdns-51.net.	139523	IN	A	205.251.195.157
ns-1029.awsdns-00.org.	134932	IN	A	205.251.196.5
ns-cloud-d1.googledomains.com. 305123 IN A	216.239.32.109
ns-cloud-d2.googledomains.com. 205394 IN A	216.239.34.109

第六部分是 DNS 的一些传输信息

1
2
3
4
;; Query time: 383 msec
;; SERVER: 192.168.0.3#53(192.168.0.3)
;; WHEN: Thu Mar 14 13:02:36 CST 2019
;; MSG SIZE  rcvd: 314

简化输出

1
dig +short math.stackexchange.com

显示 DNS 分级查询

可以显示 DNS 的整个分级查询过程。

1
dig +trace math.stackexchange.com

指定 DNS 服务器

1
dig @8.8.8.8 stackexchange.com

查询域名 NS 记录

1
dig ns com

查询 PTR 记录

1
dig -X 192.30.252.153

其他 DNS 工具

host

host 命令可以看作 dig 命令的简化版本,返回当前请求域名的各种记录。

1
2
3
4
5
6
7
8
9
$ host github.com
github.com has address 52.74.223.119
github.com has address 13.229.188.59
github.com has address 13.250.177.223
github.com mail is handled by 5 alt2.aspmx.l.google.com.
github.com mail is handled by 10 alt3.aspmx.l.google.com.
github.com mail is handled by 10 alt4.aspmx.l.google.com.
github.com mail is handled by 1 aspmx.l.google.com.
github.com mail is handled by 5 alt1.aspmx.l.google.com.

也可以用于逆向查询 IP 地址,等同于 dig -x <ip>

whois

查询域名的 whois 信息,很多域名现在都有隐私保护了,只能查到注册商信息。

nslookup

用于互动式地查询域名记录。

参考链接