DNS 查询的工作原理
DNS 是一种分布式分层数据库。当应用需要查询主机名对应的 IP 地址时,通常会按以下流程解析:
- 应用向操作系统发起查询,操作系统先检查本地 DNS 缓存。
- 操作系统向递归解析器发起查询。递归解析器通常由 ISP 运营,也可以手动配置。
- 如果没有缓存结果,解析器会根据转介信息,从 DNS 根服务器查询到
.com服务器,再查询该域名的权威服务器。 - 权威服务器返回记录,相关缓存按生存时间(TTL)保存结果。
常见 DNS 记录
DNS 保存的并不只有网站地址:
| 记录 | 用途 | 示例 |
|---|---|---|
| A | 将名称映射到 IPv4 地址 | 192.0.2.25 |
| AAAA | 将名称映射到 IPv6 地址 | 2001:db8::25 |
| CNAME | 将一个名称设为另一个名称的别名 | www.example.com |
| MX | 标识域名的邮件服务器 | mail.example.com |
A 记录的基本形式如下:
example.com. 300 IN A 192.0.2.25
TTL 为 300,表示解析器可以缓存该结果 300 秒。在此时间到期前,修改后的记录可能还不会在各处生效。
DNS 与代理
DNS 解析可以在设备上完成,也可以通过代理服务器完成。采用本地解析时,所配置的解析器会看到主机名,并在建立代理连接前返回地址。采用远程解析时,客户端将主机名交给代理,由代理完成查询。
SOCKS5 代理支持域名请求,但究竟采用本地解析还是远程解析,取决于客户端设置。远程解析还可能返回更适合代理所在网络环境的 CDN 地址,而不是适合本地网络的地址。更改出口 IP 不会自动改变所使用的 DNS 解析器。
DNS 故障与排查
- NXDOMAIN: 查询的名称不存在。
- SERVFAIL: 解析器无法完成查询,可能是权威服务器发生故障或 DNSSEC 验证失败。
- 超时: 客户端等待期限已过,但仍未收到 DNS 响应。
- 旧结果: 解析器仍缓存着旧记录,要到 TTL 到期后才会更新。
检查主机名是否完全正确,对比应用与操作系统返回的结果,并查看记录的 TTL。如果只有经过代理的请求失败,请确认客户端需要本地 DNS 解析还是远程 DNS 解析。
常见问题
DNS 和 IP 地址是一回事吗?
不是。DNS 将名称映射到 IP 地址及其他记录。一个名称可以返回多个地址,一个地址也可以承载多个域名。
代理会使用自己的 DNS 吗?
取决于代理协议和客户端设置。如果客户端发送主机名,代理可以解析该主机名;如果客户端先完成解析,则会使用系统的 DNS 解析器。
DNS 使用哪个端口?
传统 DNS 使用 UDP 或 TCP 的 53 端口。DNS over TLS 通常使用 853 端口,DNS over HTTPS 通常使用 443 端口。