DNS(Domain Name System,域名系统)是互联网的基础命名服务,用于在可读域名与 IP 地址之间建立映射关系。该系统默认使用 TCP 与 UDP 的 53 端口进行通信,并对域名的长度施加限制:每一级标签最多 63 个字符,完整域名(含末尾点号)最长 253 个字符。

DNS 域名层级

所有域名的末尾都隐含着根域(Root)。以 www.example.com. 为例,最末尾的点代表根域,通常为了简洁会被省略。DNS 的层级结构自顶向下大致分为:

  • 根域(Root):全球共有十三组根域名服务器,从 A.ROOT-SERVERS.NETM.ROOT-SERVERS.NET
  • 顶级域名(Top-Level Domain,TLD):例如 .com.org.cn 等。
  • 次级域名(Second-Level Domain,SLD):如 example.com,通常由注册商管理。
  • 主机名(Host):用于标识具体服务的子域名,例如 wwwapi 等。

DNS 解析流程

DNS 解析可通过递归或迭代查询完成。以迭代查询为例,流程如下:

  1. 向根域名服务器请求目标域名的 NS 记录及其 A 记录,获取负责该顶级域的权威服务器。
  2. 向顶级域名服务器请求目标次级域的 NS 记录,继续获得下一层的权威服务器。
  3. 向权威服务器查询主机名对应的记录,最终返回 IP 地址等结果。

这种分级查询模式使 DNS 能够在分布式环境中保持一致性与可扩展性。

常见 DNS 记录类型

DNS 使用多种资源记录(Resource Record,RR)描述域名信息,常见类型包括:

  • A:返回域名指向的 IPv4 地址。
  • AAAA:返回域名指向的 IPv6 地址。
  • NS:指定维护该域信息的权威域名服务器,只能填写域名。
  • MX:定义接收电子邮件的服务器。
  • CNAME:为域名设置别名,并指向另一个规范域名,启用后不能与其他记录并存。
  • PTR:用于反向解析,从 IP 地址定位域名,常见于邮件服务的反垃圾验证。

使用 dig 检查解析

dig(Domain Information Groper)是调试 DNS 的常用命令行工具。

基本查询

dig math.stackexchange.com

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

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

; <<>> 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

第二部分是查询内容:

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

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

;; 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 命令可能没有这部分)

;; 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 地址

;; 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 的一些传输信息

;; 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

简化输出

dig +short math.stackexchange.com

显示 DNS 分级查询

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

dig +trace math.stackexchange.com

指定 DNS 服务器

dig @8.8.8.8 stackexchange.com

查询域名 NS 记录

dig ns com

查询 PTR 记录

dig -X 192.30.252.153

其他 DNS 工具

host

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

$ 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

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

参考链接