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 地址,过程大致如下。
- 从“根域名服务器”查到 TLD 的 NS 记录和 A 记录(IP 地址)
- 从 TLD 查到 SLD 的 NS 记录和 A 记录(IP 地址)
- 从 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 记录
查询 PTR 记录
其他 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
用于互动式地查询域名记录。
参考链接