让DNS解析看得见摸得着

相信大部分朋友对DNS解析还停留在只是知道它是拿域名换IP地址的过程,但具体细节如何?让我们从理论到实践,让DNS解析过程看得见摸得着。

DNS( Domain Name System)解析过程是将用户输入的域名(例如 minijude.cn)转换为对应的 IP 地址(例如 47.96.80.187)的过程。这个过程通常包括多个步骤,涉及多个 DNS 服务器和缓存机制。以下是详细的 DNS 解析过程

一. 输入网址

在浏览器的地址栏输入一个网址(如 https://minijude.cn/blog-web),浏览器需要解析该域名( minijude.cn),才能通过 IP 地址与服务器建立 TCP 连接。

二. 浏览器的DNS缓存

2.1 查看请求的DNS解析耗时:

chrome 浏览器为例,初次请求浏览器是没有对该域名的 DNS 缓存的。因此在 networktiming 面板中我们可以看到 dns lookup 时长👇️👇️👇️:

image.png

我们可以看到初次请求时,浏览器并没有缓存, DNS Lookup 耗时 28.36ms。让我们立马刷新页面👇️👇️👇️:

image.png

此时 DNS Lookup 没有耗时了,因为 chrome 存储了上一次 DNS 解析的结果。

2.2 清空chrome的DNS缓存:

当然你可以清空 chromeDNS 解析记录👇️👇️👇️: 地址栏输入 chrome://net-internals/#sockets,分别点击 Clear host cacheFlush socket pools 按钮。

image.pngimage.png

清空后再次刷新页面,会发现 DNS Lookup 耗时又出现了👇️👇️👇️:

image.png

三. 操作系统的 DNS 缓存

首先需要明确一点的是,经过验证,当浏览器没有缓存时,它不一定会去操作系统的缓存里面查询,可能它自己去 dns 服务器去查了。这里我没有深入研究,但可以肯定的一点是,操作系统也有 DNS 缓存。本节命令均使用 powershell

3.1 查看域名ip👇️👇️👇️:

nslookup minijude.cn

image.png

这个命令可以查看指定域名的ip地址,但 不会将结果存入OS的DNS缓存。 其中第一条指出,查询的是阿里的DNS服务器 223.5.5.5

47.96.80.187 就是DNS解析的IP地址。

3.2 查看OS的DNS缓存👇️👇️👇️:

ipconfig /displaydns

image.png

你也可以查看 指定域名 的dns解析记录👇️👇️👇️:

Get-DnsClientCache | Where-Object {$_.Entry -like "*minijude*"}

image.png

3.3 清空OS的DNS缓存👇️👇️👇️:

ipconfig /flushdns

四. 本地 hosts 文件

如果本地 DNS 缓存没有找到该域名,操作系统会接着检查本地的 hosts 文件hosts 文件是一个手动维护的文件,用户可以在其中添加域名与 IP 地址的映射。

  • 在 Windows 系统中, hosts 文件位于 C:\Windows\System32\drivers\etc\hosts
  • 在 Linux 和 macOS 系统中, hosts 文件位于 /etc/hosts

如果在 hosts 文件中找到该域名的映射,操作系统会直接使用文件中指定的 IP 地址。

当我将hosts文件中随便添加一条错误的dns映射👇️👇️👇️:

image.png

再次 ping minijude.cn 就会不通👇️👇️👇️:

image.png

这就是为什么上不了GitHub时,在hosts文件中手动插入几条github的域名ip映射就可以解决的原因。

五. 向 DNS 服务器发起请求

如果本地缓存和 hosts 文件中都没有该域名的记录,操作系统会将 DNS 查询请求发送到配置好的 DNS 服务器。一般情况下,DNS 服务器的地址由你的网络配置(如通过 DHCP 自动分配或手动指定)提供。

  • 递归查询:本地的 DNS 服务器(通常是 ISP 提供的 DNS 服务器或第三方公共 DNS 服务器,如 Google 的 8.8.8.8)会尝试解析该域名。如果它没有该记录,它会向更高层次的 DNS 服务器请求,直到找到该域名的 IP 地址。
  • 权威 DNS 服务器:最终,查询会被传递到 权威 DNS 服务器,这是该域名的正式注册 DNS 服务器,包含该域名的真实 IP 地址记录。

windows 系统可以通过更改网络适配器设置来指定 DNS 域名服务器👇️👇️👇️:

image.png

5.1 wireshark查看DNS解析经过

wireshark 过滤器中根据域名筛选 dns 记录👇️👇️👇️:

dns.qry.name == "minijude.cn"

image.png

image.png

通过 wireshark 抓包,我们分析得出👇️👇️👇️:

  • DNS 查询包括了 A 记录和 HTTPS 记录,目标是 minijude.cn

  • 响应提供了 minijude.cn 的 IPv4 地址( 47.96.80.187)和 SOA 信息。

  • 查询通过 UDP 协议完成,往返时间较短。

  • A记录的TTL是1分钟,SOA(Start Of a zone of Authority)记录的TTL是3分钟。

  • 查询的权威名称服务器是 alvin.dnspod.net,是腾讯旗下 DNSPod 提供的权威名称服务器。

5.2 DNS投毒攻击与防范

早在2008年中国和2010年美国都发生过相当大规模的DNS投毒攻击事件,攻击者入侵了部分DNS服务器篡改了DNS缓存记录,导致用户访问被重定向到恶意网站。

防范DNS投毒攻击👇️👇️👇️:

TTL和加密的DNS(DoH/DoT)可以增加其安全性。

TTL可以在我们申请域名的平台配置(我的是在腾讯云):

image.png

另外谷歌可以开启DoH选项,地址栏输入 chrome://settings/security,滚动到下面,开启 使用安全DNS

image.png

总结

综上所述,DNS解析流程大致如下👇️👇️👇️:

客户端向递归 DNS 服务器发送查询,递归 DNS 检查缓存,无结果时按层级向根服务器、顶级域名服务器(TLD)、权威 DNS 服务器递归查询,权威服务器返回最终结果,递归服务器将结果缓存后返回给客户端,完成域名到 IP 的转换。

本文主要关注的是如何看到dns解析的一些信息。当然如果你想从浏览器源码角度探究DNS解析过程,推荐看 《从Chrome源码看DNS解析过程》

原文阅读