cs.fyi 2023-03-26
如果你正在阅读本文,那么很可能你已经在不知不觉中使用过域名系统(DNS)。DNS 是互联网的基础组成部分之一,它让我们能够通过人类友好的名称(而非数字地址)访问网站和在线服务。但 DNS 到底是如何工作的呢?在本文中,我将解释 DNS 的基本原理,以及它是如何帮助我们在网络上导航的。
什么是 DNS?
DNS 就像互联网的电话簿。它将域名(例如 www.example.com)映射到 IP 地址(例如 192.0.2.1),而这些 IP 地址才是托管网站的实际服务器位置。这样,我们就无需记住一长串数字来访问我们喜欢的网站,只需输入域名,剩下的就交给 DNS 来处理。
DNS 是如何工作的?
但 DNS 是如何知道某个域名对应的 IP 地址在哪里的呢?答案是:它并非无所不知,而是依赖一个名为 DNS 解析器(DNS resolver)的服务器网络协同工作来找到答案。
当你在浏览器中输入一个域名时,你的计算机会首先检查其本地 DNS 缓存,看是否已有该域名的答案。如果有,就直接使用;如果没有,则会向一个 DNS 解析器发送查询请求。该解析器也会先检查自己的缓存。如果找到了答案,就返回给你的计算机;如果没找到,就会继续向其他 DNS 服务器发起查询。这个过程将持续进行,直到找到答案或查询超时。
DNS 解析器 是一种存储 DNS 记录并响应 DNS 查询的服务器。
让我们通过一个例子来具体说明。假设你想访问 www.example.com,以下是获取该域名对应 IP 地址所涉及的步骤或服务器层级:
- 检查本地缓存(Local Caches)
- 查询递归 DNS 服务器(Recursive DNS Servers)
- 查询根 DNS 服务器(Root DNS Servers)
- 查询顶级域 DNS 服务器(Top Level Domain DNS Servers)
- 查询权威 DNS 服务器(Authoritative DNS Servers)
第一步:本地缓存(Local Caches)
你的计算机会首先检查本地缓存——这是你最近访问过的域名及其对应 IP 地址的列表。如果目标域名在缓存中,计算机将直接使用该 IP 地址,并跳过后续所有步骤。
以下是一些可能包含域名到 IP 映射的本地缓存:
- 浏览器缓存:你可能之前访问过该网站,浏览器已缓存了其 IP 地址。
- DNS 缓存:根据 DNS 记录的 TTL(生存时间),你的操作系统可能已缓存了该 IP 地址。
- Hosts 文件:你可能手动在 hosts 文件中添加了该域名与 IP 的映射。
第二步:递归 DNS 服务器(Recursive DNS Servers)
你的计算机或路由器配置的 DNS 设置通常会指向一个 DNS 服务器(默认情况下是你 ISP 提供的 DNS 服务器)。这个服务器被称为 递归 DNS 服务器。它会先检查自己的缓存。如果找到了答案,就返回给你的计算机;如果没有,就会向 DNS 层级中的下一个服务器(即根 DNS 服务器)发起查询。
第三步:根 DNS 服务器(Root DNS Servers)
根 DNS 服务器位于 DNS 层级结构的最顶端,负责将对顶级域(如 .com、.org、.net 等)的查询委托给相应的顶级域 DNS 服务器。
它们本身并不存储网站的 IP 地址,而是存储顶级域 DNS 服务器的地址。例如,.com 域的根服务器之一是 a.gtld-servers.net。你可以通过以下命令查看不同顶级域的名称服务器:
dig +short NS com
dig +short NS org
dig +short NS ai
dig +short NS fyi
dig +short NS io
第四步:顶级域 DNS 服务器(Top Level Domain DNS Servers)
顶级域 DNS 服务器负责将对二级域名(如 example.com、example.org、example.ai)的查询委托给对应的 权威 DNS 服务器(即实际存储 DNS 记录的地方)。
它们也不直接提供网站的 IP 地址,而是提供权威 DNS 服务器的地址。
你可以通过以下命令查看某个二级域名的名称服务器:
dig +short NS cs.fyi
dig +short NS github.com
dig +short NS medium.com
第五步:权威 DNS 服务器(Authoritative DNS Servers)
这里是实际存储 DNS 记录的地方。在此阶段,权威 DNS 服务器会被请求提供该域名的 A 记录(A record)。A 记录是将域名映射到 IP 地址的 DNS 记录类型。权威服务器随后将 IP 地址返回给递归 DNS 服务器,后者再将其传回你的计算机。
DNS 在实际中如何运作?
我们可以通过 dig 命令来看看 DNS 在实践中是如何工作的。dig 是一个用于查询 DNS 名称服务器的命令行工具,在大多数 Linux 和 macOS 系统上都可用。在 Windows 上,你可以通过 Chocolatey 安装它:
choco install dig
假设你想查找 www.example.com 的 IP 地址,可以运行:
dig +short www.example.com
+short 选项告诉 dig 只输出响应中的答案部分。输出可能如下所示:
93.184.216.34
这就是 www.example.com 的 IP 地址。但 dig 是如何找到这个地址的呢?让我们看看背后发生了什么。
首先,dig 会检查本地缓存;如果没有,就向 DNS 解析器发送查询;解析器依次向上查询,直到找到答案。
你可以使用 +trace 选项查看完整的解析路径:
dig +trace www.example.com
完整输出较长,这里不展示。但你可以亲自运行该命令,观察整个过程中涉及的不同 DNS 服务器。
调试 DNS 问题
如果你无法访问某个网站,可以使用 dig 命令来排查问题。以下是一些实用示例:
检查域名的 DNS 解析
你可以用 dig 检查一个域名是否能成功解析为 IP 地址:
dig example.com +short
该命令将返回与 example.com 关联的 IP 地址(注意原文此处误写为 google.com,应为 example.com)。+short 选项仅显示 IP 地址,省略其他信息。
获取域名的 DNS 记录
你可以用 dig 获取域名的各种 DNS 记录。例如,获取所有 A 记录:
dig example.com A
获取 MX 记录(用于邮件服务器):
dig example.com MX
检查 DNS 传播状态
要确认 DNS 记录是否已在全球 DNS 服务器中生效,可使用:
dig example.com MX +trace
+trace 选项会显示从根服务器开始的完整解析路径,有助于判断是否有 DNS 服务器尚未同步最新记录。
检查 DNSSEC 验证
你可以用 dig 检查域名的 DNSSEC 是否正常工作:
dig example.com +dnssec
这将显示与 DNSSEC 相关的记录及其有效性。
DNSSEC(Domain Name System Security Extensions)是 DNS 的安全扩展,用于验证 DNS 数据的来源和完整性,并防止数据在传输过程中被篡改。
查询特定 DNS 服务器
你可以指定向某个 DNS 服务器发起查询。例如,使用 Google 公共 DNS(8.8.8.8)查询 A 记录:
dig example.com A @8.8.8.8
这会将查询发送到指定的 DNS 服务器,而不是使用本地默认配置。
常见 DNS 错误
你可能会遇到以下几种常见的 DNS 错误:
DNS_PROBE_FINISHED_NXDOMAIN
表示域名不存在。可能是拼写错误,或域名已过期。DNS_PROBE_FINISHED_NO_INTERNET
表示域名存在,但 DNS 服务器无法访问。可能是 DNS 服务器宕机,或网络连接问题。DNS_PROBE_FINISHED_BAD_CONFIG
表示 DNS 配置错误,导致无法连接到 DNS 服务器。同样可能由服务器故障或网络问题引起。
如何清除 DNS 缓存
有时你可能需要清除本地计算机的 DNS 缓存。
Windows:
ipconfig /flushdnsmacOS:
dscacheutil -flushcache
注意:在较新版本的 macOS 中,可能需要使用
sudo killall -HUP mDNSResponder来刷新 DNS 缓存。
结语
在本文中,我们学习了 DNS 的基本概念及其工作原理,还掌握了如何使用 dig 命令查询 DNS 记录和调试问题。希望这篇文章对你有所帮助!欢迎分享给你的朋友和同事。