4

DNS 域名解析系统详解

 6 months ago
source link: https://maxqiu.com/article/detail/159
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
DNS 域名解析系统详解

创建日期:2024/03/14   修改日期:2024/03/14   Windows   Linux   DNS

参考资料:

什么是域名

网域名称(英语:Domain Name,简称:Domain),简称域名,是由一串用分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名可以说是一个IP地址的代称,目的是为了便于记忆后者。

  1. 域名由多个部分组成,这些部分通常连接在一起并由点分隔,例如 www.baidu.com
  2. 域名的结尾有时候还有一点,这是保留给根节点的,书写时通常省略,在查询时由软件内部补上。
  3. 域名里的英文字母不区分大小写,因此可以使用大写方法拼写,但一般都以小写形式拼写。

在域名系统的层次结构中,各种域名都隶属于域名系统根域的下级。

  • 顶级域(英语:Top-level domains,缩写:TLD):是域名中最高的一级,每个域名都以顶级域结尾。所有的顶级域名可以在 https://data.iana.org/TLD/tlds-alpha-by-domain.txt 查找。常见分类如下:
    • 通用顶级域:例如 .com.net.org 等。
    • 国家和地区顶级域:例如 .us.cn.tk 等。
    • 新通用顶级域:例如 .shop.vip.中国 等。
  • 子域名:顶级域名下一层是二级域名,例如在 baidu.comqq.com 中,baiduqq 就是二级域名。二级域名下面是三级域名,例如在 www.baidu.comwww.qq.com 中,www 是三级域名。也就是说从右侧到左侧,隔一个点依次下降一层。

DNS 简介

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务,将人类可读的域名(例如: www.baidu.com )转换为机器可读的 IP 地址(例如: 180.101.50.188

DNS 服务器类型

在 DNS 基础设施不可或缺的服务器(服务器组)为 权威 DNS 服务器递归 DNS 服务器 ,各自担当不同的角色,并且位于 DNS 查询管道内的不同位置。递归服务器位于 DNS 查询的开头,权威服务器位于末尾。

权威 DNS 服务器

根域名服务器

根域名服务器( root name server )是 DNS 系统中最高级别的域名服务器,负责返回顶级域的权威域名服务器地址。

根域名服务器地址的数量有 13 个,并采用任播技术架设镜像服务器,使得实际运行的根域名服务器数量有很多,可以通过访问 https://root-servers.org/ 查询。

全球 13 组根域名服务器以英文字母 A 到 M 依序命名,域名格式为 字母.root-servers.net ,可以通过 https://www.internic.net/domain/named.root 查询各个服务器对应的 IP 地址,列表如下:

服务器名 A AAAA
a.root-servers.net. 198.41.0.4 2001:503:ba3e::2:30
b.root-servers.net. 170.247.170.2 2801:1b8:10::b
c.root-servers.net. 192.33.4.12 2001:500:2::c
d.root-servers.net. 199.7.91.13 2001:500:2d::d
e.root-servers.net. 192.203.230.10 2001:500:a8::e
f.root-servers.net. 192.5.5.241 2001:500:2f::f
g.root-servers.net. 192.112.36.4 2001:500:12::d0d
h.root-servers.net. 198.97.190.53 2001:500:1::53
i.root-servers.net. 192.36.148.17 2001:7fe::53
j.root-servers.net. 192.58.128.30 2001:503:c27::2:30
k.root-servers.net. 193.0.14.129 2001:7fd::1
l.root-servers.net. 199.7.83.42 2001:500:9f::42
m.root-servers.net. 202.12.27.33 2001:dc3::35

所有根域名服务器都是以同一份根域文件( Root Zone file ,文件名为 root.zone )返回顶级域名权威服务器,可以在 https://www.internic.net/domain/root.zone 下载到该文件

顶级域名服务器

顶级域名服务器( Top-Level Domain Name Server )是 DNS 系统中负责管理顶级域名的域名解析,例如 .com.org.net 等。每个顶级域名都有自己的一组域名服务器,这些服务器负责管理该顶级域名下的所有子域名,将域名转换为相应的 IP 地址以便于网络通信。

区域域名服务器

区域域名权威服务器( Authoritative Name Server )是 DNS 系统中的一种服务器,负责管理特定域名解析记录。与顶级域名服务器不同,区域域名权威服务器管理的是特定域名( 例如 example.com )下的所有子域名和相关记录。

当一个域名的解析请求到达区域域名权威服务器时,如果该服务器管理着请求的域名,则它会负责提供与该域名相关的 DNS 记录,例如 A 记录、 CNAME 记录、 MX 记录等。

递归 DNS 服务器

客户端通常不会对权威 DNS 服务器直接进行查询,而是通常连接到递归 DNS 服务器。递归 DNS 服务器就像是旅馆的门童:尽管没有任何自身的 DNS 记录,但是可充当代表您获得 DNS 信息的中间程序。如果递归 DNS 服务器拥有已缓存或存储一段时间的 DNS 参考,那么它会通过提供源或 IP 信息来响应 DNS 查询。如果没有,则它会将查询传递到一个或多个权威 DNS 服务器以查找信息。

本地 DNS 服务器

本地 DNS 通常是指用户所在网络环境中的 DNS 服务器,也称为本地域名服务器。它通常由互联网服务提供商或组织内部的网络管理员设置和管理。

在家庭网络中,路由器拨号上网所获取的默认 DNS 服务器信息就是本地 DNS 服务器,如下图:

d31c95a1a9a5437e843316d77d83f31a.png

公共 DNS 服务器

这些服务器由互联网服务提供商、互联网公司或其他组织提供,为公众用户提供域名解析服务。

常见的公共 DNS 服务器有:

厂商 官网 IPv4 IPv6
阿里 https://www.alidns.com/ 223.5.5.5
223.6.6.6
2400:3200::1
2400:3200:baba::1
DNSPod https://www.dnspod.cn/Products/publicdns 119.29.29.29 2402:4e00::
Google https://developers.google.com/speed/public-dns/docs/using?hl=zh-cn 8.8.8.8
8.8.4.4
2001:4860:4860::8888
2001:4860:4860::8844
Cloudflare https://1.1.1.1/zh-Hans/dns/ 1.1.1.1
1.0.0.1
2606:4700:4700::1111
2606:4700:4700::1001

关于如何使用公共 DNS 服务器,以上链接或者搜索引擎都能找到修改方式,本文不做赘述

记录类型说明及规则

各类型和使用目的

DNS 系统中,常见的记录类型有:

记录类型 值类型 使用目的
A 记录 IPv4 保存域名的 IPv4 地址
AAAA 记录 IPv6 保存域名的 IPv6 地址
CNAME 记录 域名 将一个域转发到另一个域,即一个域是另一个域名的别名
MX 记录 域名 将邮件定向到电子邮件服务器
TXT 记录 文本 可让管理员在记录中存储文本注释,有时用于申请 SSL 证书
NS 记录 域名 用来指定该域名由哪个DNS服务器来进行解析

各记录类型冲突规则

各记录类型有如下三种关系:

  • 冲突:相同主机记录、不同记录类型只能创建一条。例如,已有 www 的 A 记录,则不允许再添加 www 的 CNAME 记录
  • 可多条:相同主机记录、相同记录类型,可创建多条。例如,已有 www 的 A 记录,还可添加 www 的默认路线 A 记录
  • 不冲突:相同主机记录、不同记录类型可以共存。例如,已有 www 的 A 记录,还可添加 www 的默认路线 MX 记录。

整理成表格如下:

A AAAA MX TXT NS CNAME
A 可重复 不冲突 不冲突 不冲突 冲突 冲突
AAAA 不冲突 可重复 不冲突 不冲突 冲突 冲突
MX 不冲突 不冲突 可重复 不冲突 冲突 冲突
TXT 不冲突 不冲突 不冲突 可重复 冲突 冲突
NS 冲突 冲突 冲突 冲突 可重复 冲突
CNAME 冲突 冲突 冲突 冲突 冲突 冲突

DNS 解析过程分析

下图概述了一次 DNS 解析的大致流程

c2ef5dcb4b0b469691d2fc1968d9ff9c.png
  1. 用户在 Web 浏览器中键入 example.com,查询传输到 Internet 中,并被递归 DNS 服务器接收。
  2. 递归 DNS 服务器向根域名服务器查询。
  3. 根服务器使用其存储的顶级域名服务器的地址响应该解析器。在搜索 example.com 时,返回 .com 顶级域名服务器地址
  4. 解析器向 .com 顶级域名服务器发出请求。
  5. 顶级域名服务器随后使用区域域名服务器的地址进行响应。在搜索 example.com 时,返回 example.com 区域域名服务器地址
  6. 递归 DNS 服务器将查询发送到区域域名服务器。
  7. 区域域名服务器返回该域名的具体IP。
  8. 递归 DNS 服务器返回 Web 浏览器该域的 IP 地址。
  9. DNS 查找的这 8 个步骤返回 example.com 的 IP 地址后,浏览器便能向该 IP 发出网页请求。
  10. 位于该 IP 的服务器返回网页数据。

使用 dig 命令模拟递归 DNS 服务器

在 Linux 系统中,可以使用 dig 命令发送 DNS 请求并查看返回信息。

  • 安装
    • CentOS 系统中,使用 yum -y install bind-utils 安装该命令
    • Debian 系统中,使用 apt-get install bind9-dnsutils 安装该命令
  • 命令格式:下文主要使用 dig domian A @server_ip 这样的格式,其中
    • domain 是要查询的域名
    • A 代表查询 A 记录,也可以是 AAAACNAME 等记录类型,默认不写时查询 A 记录,下文示例将忽略
    • server_ip 是 DNS 服务器的 IP 地址
  • 返回信息:
    • 头部部分:包含有关查询的信息,如操作码、查询类型(例如A、MX、NS)、查询类别(例如IN代表Internet)以及其他标志。
    • 问题部分( QUESTION SECTION ):显示查询的域名以及查询类型。
    • 回答部分( ANSWER SECTION ):提供了查询的实际答案。一般为当前域名 AAAAACNAME 等信息
    • 授权部分( AUTHORITY SECTION ):显示有关查询域的权威 DNS 服务器的信息。这包括名称服务器记录(NS),指定了哪些服务器对域是授权的。
    • 附加部分( ADDITIONAL SECTION ):包含可能与查询相关的附加信息。这可能包括名称服务器的 IP 地址或任何其他相关信息。
    • 尾部部分:包含查询耗时、服务器信息、当前时间等信息

下文以个人域名 maxqiu.com 为例,由于返回信息很多,仅展示重要信息,且部分内容以 ...... 省略:

  1. 向根域名服务器查询,根服务器地址在上文的全球 13 组根域名服务器信息中随便选一个 IP 。
    服务器返回了 .com 顶级域的权威服务器信息以及地址信息:
    1. dig maxqiu.com @192.5.5.241
    2. ......
    3. ;; AUTHORITY SECTION:
    4. com. 172800 IN NS e.gtld-servers.net.
    5. ......
    6. com. 172800 IN NS m.gtld-servers.net.
    7. ;; ADDITIONAL SECTION:
    8. e.gtld-servers.net. 172800 IN A 192.12.94.30
    9. e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30
    10. ......
    11. m.gtld-servers.net. 172800 IN A 192.55.83.30
    12. m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30
    13. ......
  2. .com 顶级域名服务器查询,同样,顶级域名服务器地址在上文附加部分中随便选一个 IP 。
    服务器返回了 maxqiu.com 区域域名的权威服务器信息:
    1. dig maxqiu.com @192.41.162.30
    2. ......
    3. ;; AUTHORITY SECTION:
    4. maxqiu.com. 172800 IN NS fifth.dnspod.net.
    5. maxqiu.com. 172800 IN NS execute.dnspod.net.
    6. ......
  3. 此时只得到 maxqiu.com 区域域名的权威服务器域名,并没有收到服务器 IP 地址。
    此时转换目标,查询任意一个权威服务器域名的 IP,下文以 fifth.dnspod.net 为例,向根域名服务器查询。
    服务器返回了 .net 顶级域的权威服务器信息以及地址信息:
    1. dig fifth.dnspod.net @192.5.5.241
    2. ......
    3. ;; AUTHORITY SECTION:
    4. net. 172800 IN NS e.gtld-servers.net.
    5. ......
    6. net. 172800 IN NS m.gtld-servers.net.
    7. ;; ADDITIONAL SECTION:
    8. e.gtld-servers.net. 172800 IN A 192.12.94.30
    9. e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30
    10. ......
    11. m.gtld-servers.net. 172800 IN A 192.55.83.30
    12. m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30
    13. ......
  4. 此时可以发现 .com.net 的顶级域名服务器信息是一样的!
    继续向 .net 顶级域名服务器查询。
    服务器返回了 fifth.dnspod.net 区域域名的权威服务器信息:
    1. dig fifth.dnspod.net @192.55.83.30
    2. ......
    3. ;; AUTHORITY SECTION:
    4. dnspod.net. 172800 IN NS ns4.dnsv2.com.
    5. dnspod.net. 172800 IN NS ns3.dnsv2.net.
    6. ;; ADDITIONAL SECTION:
    7. ns3.dnsv2.net. 172800 IN A 1.12.0.29
    8. ns3.dnsv2.net. 172800 IN A 117.89.178.226
    9. ns3.dnsv2.net. 172800 IN A 125.94.59.205
    10. ns3.dnsv2.net. 172800 IN A 129.211.176.248
    11. ns3.dnsv2.net. 172800 IN A 163.177.5.85
    12. ns3.dnsv2.net. 172800 IN AAAA 2402:4e00:1430:1102:0:9136:2b2f:bf6b
    13. ns3.dnsv2.net. 172800 IN A 36.155.149.180
    14. ......
  5. 此时得到 fifth.dnspod.net 区域域名的权威服务器域名,并且得到了服务器 IP 地址,继续向附加部分中的任意一个 IP 查询。
    服务器返回了 fifth.dnspod.net 区域域名的 IP 地址信息:
    1. dig fifth.dnspod.net @1.12.0.29
    2. ......
    3. ;; ANSWER SECTION:
    4. fifth.dnspod.net. 600 IN A 112.80.181.45
    5. fifth.dnspod.net. 600 IN A 117.89.178.173
    6. fifth.dnspod.net. 600 IN A 120.241.130.98
    7. fifth.dnspod.net. 600 IN A 129.211.176.209
    8. fifth.dnspod.net. 600 IN A 1.12.0.4
    9. ;; AUTHORITY SECTION:
    10. dnspod.net. 86400 IN NS ns3.dnsv2.net.
    11. dnspod.net. 86400 IN NS ns4.dnsv2.com.
    12. ......
  6. 绕了一圈,终于找到了 maxqiu.com 的权威服务器 fifth.dnspod.net 的 IP 地址,继续向回答部分中的任意一个 IP 查询。
    服务器返回了 maxqiu.com 的 IP 地址信息:
    1. dig maxqiu.com @112.80.181.45
    2. ......
    3. ;; ANSWER SECTION:
    4. maxqiu.com. 600 IN A 139.224.53.66
    5. ;; AUTHORITY SECTION:
    6. maxqiu.com. 86400 IN NS fifth.dnspod.net.
    7. maxqiu.com. 86400 IN NS execute.dnspod.net.
    8. ......

DNS 缓存机制

为什么需要缓存

  1. 查询次数问题:通过上文的模拟递归 DNS 服务器实战,一次域名解析需要很多步骤,在没有缓存的情况下,恐怕根域名和顶级域名根本扛不住全球互联网如此频繁的查询。
  2. UDP协议问题:由于 DNS 域名解析采用不可靠的 UDP 协议通讯,受网络环境的影响较大,特别是在有丢包的情况下,导致的时延可能达到数秒。

缓存在什么地方

从浏览器敲下回车至查询到域名IP,缓存存在多个地方

递归 DNS 服务器缓存

在上文 dig 命令返回结果中,在 ”回答部分/授权部分/附加部分“ 有一写数字,比如 172800 、 86400 、 600 等,这些就是权威服务器返回的当前返回信息的有效时长,单位为秒。

递归 DNS 服务器会记录权威 DNS 服务器返回的信息,当下次有相同查询时,就无需向权威服务器发起请求,并直接返回给客户端。

另外,也会存在多级递归 DNS 服务器的情况。

通过 dig 命令向递归 DNS 服务器查询解析记录查看缓存时间

  1. 第一次向 223.5.5.5 查询 maxqiu.com 解析记录,返回显示了一个有效时间:
    1. dig maxqiu.com @223.5.5.5
    2. ......
    3. maxqiu.com. 600 IN A 139.224.53.66
    4. ......
  2. 时隔 5 秒,再次发起请求,返回显示有效时间比上文的减少了 5 :
    1. dig maxqiu.com @223.5.5.5
    2. .....
    3. maxqiu.com. 595 IN A 139.224.53.66
    4. .....

操作系统级 DNS 缓存

操作系统也会将查询结果缓存,以 Windows 为例,执行 ipconfig /displaydns 查询已缓存的域名,执行 ipconfig /flushdns 可以清除缓存

浏览器 DNS 缓存

浏览器 DNS 缓存的时间跟 DNS 服务器返回的 TTL 值无关。浏览器在获取域名的 IP 地址后会对 IP 进行缓存,减少网络请求的损耗。

使用缓存的问题

如果 DNS 缓存设置使用不当,也会给用户访问体验带来负面影响,甚至影响到正常业务的使用。

  • 缓存刷新不受控:当域名发生变更时,并没有办法刷新全球各地的递归服务器缓存以及客户端上的 DNS 缓存,因此在每个缓存超时之前,客户发起请求仍然会按照缓存记录的原有映射关系发起请求,这就会出现站点不可达或者访问到错误的网站。只有等递归服务器和客户端上的 DNS 缓存失效后,才能重新发起请求,得到最新的映射关系。(有些 DNS 运营商购买付费解析套餐可以提供设置 TTL 最低为 1 秒的功能,大部分可以解决此问题)
  • 解析权和缓存值被修改:一些小运营商出于规模、节约成本的考虑,将域名转发到较大运营商进行解析,并把收到的域名缓存值更改为较长的值,这会带来两个方面的问题:
    1. 权威 DNS 接收到的请求 IP 地址不是访问者所在运营商 IP 地址,访问者的请求可能会被引导至错误的线路,导致访问变慢。
    2. 域名发生改变后将等待更长的超时时间才能正常访问业务,同样会给访问者带来较差的体验。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK