DNS基础

DNS 基础内容

什么是 DNS?

DNS 是一个应用层协议,域名系统 (DNS) 的作用是将人类可读的域名 (如,www.example.com) 转换为机器可读的 IP 地址 (如,192.0.2.44)。DNS 协议建立在 UDP 或 TCP 协议之上,默认使用 53 号端口。客户端默认通过 UDP 协议进行通讯,但是由于广域网中不适合传输过大的 UDP 数据包,因此规定当报文长度超过了 512 字节时,应转换为使用 TCP 协议进行数据传输。
可能会出现如下的两种情况:

  • 客户端认为 UDP 响应包长度可能超过 512 字节,主动使用 TCP 协议;
  • 客户端使用 UDP 协议发送 DNS 请求,服务端发现响应报文超过了 512 字节,在截断的 UDP 响应报文中将 TC 设置为 1 ,以通知客户端该报文已经被截断,客户端收到之后再发起一次 TCP 请求。

什么是域名?

域名是由一串用点分隔符 . 组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的方位。域名可以说是一个 IP 地址的代称,目的是为了便于记忆后者。例如,wikipedia.org 是一个域名,和 IP 地址 208.80.152.2 相对应。人们可以直接访问 wikipedia.org 来代替 IP 地址,然后域名系统(DNS)就会将它转化成便于机器识别的 IP 地址。这样,人们只需要记忆 wikipedia.org 这一串带有特殊含义的字符,而不需要记忆没有含义的数字。

DNS 的分层

域名系统是分层次的。

  • 根域:DNS域名使用中规定由尾部句点’.’来指定名称位于根或者更高层次的域层次结构,根服务器有13台。

  • 顶级域:用来指示某个国家、地区或者组织。采用三个字符,如com -> 商业公司,edu -> 教育机构,net -> 网络公司,gov -> 非军事政府机构等等。

  • 二级域:个人或者组织在Internet使用的注册名称。采用两个字符,如:cn -> 代表中国,jp -> 日本,uk -> 英国,hk -> 香港等等

  • 主机:主机名处于域名空间结构中的最底层,主机名和域名结合构成FQDN,主机名是FQDN最左端的部分。

在域名系统的层次结构中,各种域名都隶属于域名系统根域的下级。域名的第一级是顶级域,它包括通用顶级域,例如 .com、.net 和 .org;以及国家和地区顶级域,例如 .us、.cn 和 .tk。顶级域名下一层是二级域名,一级一级地往下。这些域名向人们提供注册服务,人们可以用它创建公开的互联网资源或运行网站。顶级域名的管理服务由对应的域名注册管理机构(域名注册局)负责,注册服务通常由域名注册商负责。

  • 授权型 DNS - 一种授权型 DNS 服务提供一种更新机制,供开发人员用于管理其公用 DNS 名称。然后,它响应 DNS 查询,将域名转换为 IP 地址,以便计算机可以相互通信。授权型 DNS 对域有最终授权且负责提供递归型 DNS 服务器对 IP 地址信息的响应。Amazon Route 53 是一种授权型 DNS 系统。
  • 递归型 DNS - 客户端通常不会对授权型 DNS 服务直接进行查询。而是通常连接到称为解析程序的其他类型 DNS 服务,或递归型 DNS 服务。递归型 DNS 服务就像是旅馆的门童:尽管没有任何自身的 DNS 记录,但是可充当代表您获得 DNS 信息的中间程序。如果递归型 DNS 拥有已缓存或存储一段时间的 DNS 参考,那么它会通过提供源或 IP 信息来响应 DNS 查询。如果没有,则它会将查询传递到一个或多个授权型 DNS 服务器以查找信息。

记录类型
DNS 中,常见的资源记录类型有:

  • NS 记录(域名服务) ─ 指定解析域名或子域名的 DNS 服务器。
  • MX 记录(邮件交换) ─ 指定接收信息的邮件服务器。
  • A 记录(地址) ─ 指定域名对应的 IPv4 地址记录。
  • AAAA 记录(地址) ─ 指定域名对应的 IPv6 地址记录。
  • NAME(规范) ─ 一个域名映射到另一个域名或 CNAME 记录( example.com 指向 www.example.com )或映射到一个 A记录。
  • PTR 记录(反向记录) ─ PTR 记录用于定义与 IP 地址相关联的名称。 PTR 记录是 A 或 AAAA 记录的逆。 PTR 记录是唯一的,因为它们以 .arpa 根开始并被委派给 IP 地址的所有者。

域名解析

域名解析的基本过程

主机名到 IP 地址的映射有两种方式:

  • 静态映射 - 在本机上配置域名和 IP 的映射,旨在本机上使用。Windows 和 Linux 的 hosts 文件中的内容就属于静态映射。
  • 动态映射 - 建立一套域名解析系统(DNS),只在专门的 DNS 服务器上配置主机到 IP 地址的映射,网络上需要使用主机名通信的设备,首先需要到 DNS 服务器查询主机所对应的 IP 地址。

通过域名去查询域名服务器,得到 IP 地址的过程叫做域名解析。在解析域名时,一般先静态域名解析,再动态解析域名。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。

上图展示了一个动态域名解析的流程,步骤如下:

  1. 用户打开 Web 浏览器,在地址栏中输入 www.example.com ,然后按 Enter 键。

  2. www.example.com 的请求被路由到 DNS 解析程序,这一般由用户的 Internet 服务提供商 (ISP) 进行管理,例如有线 Internet 服
    务提供商、DSL 宽带提供商或公司网络。

  3. ISP 的 DNS 解析程序将 www.example.com 的请求转发到 DNS 根名称服务器。

  4. ISP 的 DNS 解析程序再次转发 www.example.com 的请求,这次转发到 .com 域的一个 TLD 名称服务器。.com 域的名称服务器使用与 example.com 域相关的四个 Amazon Route 53 名称服务器的名称来响应该请求。

  5. ISP 的 DNS 解析程序选择一个 Amazon Route 53 名称服务器,并将 www.example.com 的请求转发到该名称服务器。

  6. Amazon Route 53 名称服务器在 example.com 托管区域中查找 www.example.com 记录,获得相关值,例如,Web 服务器的 IP 地址 (192.0.2.44),并将 IP 地址返回至 DNS 解析程序。

  7. ISP 的 DNS 解析程序最终获得用户需要的 IP 地址。解析程序将此值返回至 Web 浏览器。DNS 解析程序还会将 example.com 的 IP 地址缓存 (存储) 您指定的时长,以便它能够在下次有人浏览 example.com 时更快地作出响应。有关更多信息,请参阅存活期 (TTL)。

  8. Web 浏览器将 www.example.com 的请求发送到从 DNS 解析程序中获得的 IP 地址。这是您的内容所处位置,例如,在 Amazon EC2 实例中或配置为网站终端节点的 Amazon S3 存储桶中运行的 Web 服务器。

  9. 192.0.2.44 上的 Web 服务器或其他资源将 www.example.com 的 Web 页面返回到 Web 浏览器,且 Web 浏览器会显示该页面。
    注意:只有配置了域名服务器,才能执行域名解析。
    例如,在 Linux 中执行 vim /etc/resolv.conf 命令,在其中添加下面的内容来配置域名服务器地址:

    1
    nameserver 218.2.135.1

    域名解析涉及4个DNS服务器

    DNS recursor、根名称服务器 、TLD名称服务器、权威名称服务器

    1
    2
    3
    4
    5
    6
    7
    DNS recursor: recursor可以被认为是一个图书管理员,被要求在图书馆的某个地方找到一本特定的书。DNS recursor是一个服务器,旨在通过Web浏览器等应用程序从客户端计算机接收查询。通常,recursor负责发出其他请求以满足客户端的DNS查询。

    根名称服务器: 根服务器是将人类可读主机名转换(解析)为IP地址的第一步。它可以被认为是图书馆中指向不同书籍书籍的索引 - 通常它可以作为对其他更具体位置的参考。

    TLD名称服务器: 顶级域名服务器(TLD)可以被视为库中特定的书架。此名称服务器是搜索特定IP地址的下一步,它托管主机名的最后一部分(在east263.com中,TLD服务器是“com”)。

    权威名称服务器: 这个最终名称服务器可以被认为是书架上的字典,其中可以将特定名称翻译成其定义。权威名称服务器是名称服务器查询中的最后一站。如果权威名称服务器可以访问所请求的记录,它将把请求的主机名的IP地址返回给发出初始请求的DNS Recursor(图书管理员)

权威DNS服务器和递归DNS解析器的区别

这两个概念都指的是与DNS基础结构不可分割的服务器(服务器组),但每个服务器执行不同的角色并且位于DNS查询管道内的不同位置。考虑差异的一种方法是递归解析器位于DNS查询的开头,而权威的名称服务器位于最后。

递归DNS解析器
递归解析器是响应来自客户端的递归请求并花时间跟踪DNS记录的计算机。它通过发出一系列请求直到它到达请求记录的权威DNS名称服务器(或者如果没有找到记录则超时或返回错误)来完成此操作。幸运的是,递归DNS解析器并不总是需要发出多个请求才能跟踪响应客户端所需的记录; 缓存是一种数据持久性过程,它通过在DNS查找中提前提供请求的资源记录来帮助缩短必要的请求。

权威DNS服务器
简而言之,权威DNS服务器是实际持有并负责DNS资源记录的服务器。这是DNS查找链底部的服务器,它将使用查询的资源记录进行响应,最终允许Web浏览器发出请求以访问访问网站或其他Web资源所需的IP地址。权威的名称服务器可以满足来自其自身数据的查询,而无需查询其他来源,因为它是某些DNS记录的最终真实来源。

递归DNS查询和递归DNS解析器的差异

递归DNS查询是指对需要解析查询的DNS解析器发出的请求。递归DNS解析器是接受递归查询并通过发出必要请求来处理响应的计算机。

DNS查询的类型

在典型的DNS查找中,会发生三种类型的查询。通过使用这些查询的组合,用于DNS解析的优化过程可以导致行进距离的减少。在理想情况下,缓存记录数据将可用,允许DNS名称服务器返回非递归查询。

递归查询: 在递归查询中,DNS客户端要求DNS服务器(通常是DNS递归解析程序)将使用请求的资源记录响应客户端,或者如果解析程序无法找到记录,则会响应错误消息。
迭代查询: 在这种情况下,DNS客户端将允许DNS服务器返回它可以的最佳答案。如果查询的DNS服务器与查询名称不匹配,则它将返回对域名称空间的较低级别具有权威性的DNS服务器的引用。然后,DNS客户端将对引用地址进行查询。此过程将继续使用查询链中的其他DNS服务器,直到发生错误或超时。
非递归查询: 通常在DNS解析器客户端向DNS服务器查询其有权访问的记录时会发生这种情况,因为它对记录具有权威性,或者记录存在于其缓存中。通常,DNS服务器将缓存DNS记录以防止额外的带宽消耗和上游服务器的负载。

递归查询 VS. 迭代查询

在递归查询模式下,DNS 服务器在接收到客户机请求时,必须使用一个准确的查询结果回复客户机。也就意味着,如果 DNS 服务器本地没有缓存所查询的 DNS 信息,那么该服务器会询问其它服务器,并将返回的查询结果提交给客户机。

而在使用迭代查询时,DNS 服务器会向客户机提供其它能够解析查询请求的 DNS 服务器地址。也就是说,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台 DNS 服务器地址,客户机需要再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果为止。

也就是说,关键的区别是由谁去查询最终的结果。

DDoS

发送大量的 DNS 递归查询会消耗服务端的一定资源,所以,只需要将发送的报文设置一个 RD 标志位即可。
当发送垃圾查询时,例如 www.baidu.com 这类必然不存在的域名,必然会导致查询很慢。

ECS

ECS(EDNS-Client-Subnet)是DNS服务支持的新协议。该协议会在DNS请求包中附加请求域名解析的用户IP地址。这样,DNS服务器就可以根据该地址返回用户更容易访问的服务器IP地址。该技术广泛应用于CDN应用中。Nmap的dns-client-subnet-scan脚本利用该协议,通过提交不同的IP地址,获取指定域名所有的IP地址。

Non-authoritative answer

为加快 DNS 的查询速度,一般会在服务端缓存一段时间,所以有可能 DNS 会返回缓存在 Cache 中的内容,那么此时就会将 AA 响应设置为 0 ,也就是是这里显示的 Non-authoritative answer 。

DNS缓存

缓存的目的是将数据临时存储在一个位置,从而提高数据请求的性能和可靠性。DNS缓存涉及将数据存储在更靠近请求客户端的位置,以便可以更早地解析DNS查询,并且可以避免在DNS查找链中进一步查询,从而改善加载时间并减少带宽/ CPU消耗。DNS数据可以缓存在各种位置,每个位置将存储DNS记录一段时间,该时间由生存时间(TTL)决定。

缓存存在的位置

浏览器DNS缓存

默认情况下,现代Web浏览器设计为在一段时间内缓存DNS记录。这里的目的很明显; DNS缓存越接近Web浏览器,为了检查缓存并对IP地址发出正确的请求,必须采取的处理步骤越少。当请求DNS记录时,浏览器缓存是为请求的记录检查的第一个位置。

在chrome中,您可以转到chrome:// net-internals / #dns查看DNS缓存的状态。

操作系统(OS)级DNS缓存

操作系统级DNS解析程序是DNS查询离开计算机之前的第二个也是最后一个本地停止。设计用于处理此查询的操作系统内部的进程通常称为“存根解析程序”或DNS客户端。当存根解析器从应用程序获取请求时,它首先检查自己的缓存以查看它是否具有该记录。如果没有,则它将本地网络外部的DNS查询(带有递归标志集)发送到Internet服务提供商(ISP)内的DNS递归解析器。

递归解析器DNS缓存

当ISP内部的递归解析器收到DNS查询时,如同之前的所有步骤一样,它还将检查所请求的主机到IP地址转换是否已存储在其本地持久层内。

递归解析器还具有其他功能,具体取决于它在缓存中的记录类型:

如果解析程序没有A记录,但确实拥有权威名称服务器的NS记录,它将直接查询这些名称服务器,绕过DNS查询中的几个步骤。此快捷方式可防止从root和.com名称服务器(在我们的east263.com搜索中)中进行查找,并有助于更快地解析DNS查询。

如果解析器没有NS记录,它将向TLD服务器发送查询(在我们的例子中为.com),跳过根服务器。

万一解析器没有指向TLD服务器的记录,它将查询根服务器。此事件通常在清除DNS缓存后发生。

3. Linux 上的域名相关命令

hostname

hostname 命令用于查看和设置系统的主机名称。环境变量 HOSTNAME 也保存了当前的主机名。在使用 hostname 命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改 /etc/hosts 和 /etc/sysconfig/network 的相关内容。
示例:

1
2
hostname
test123vm6

nslookup
nslookup 命令是常用域名查询工具,就是查 DNS 信息用的命令。
示例:

1
2
3
4
5
6
7
8
9
10
$ nslookup www.baidu.com
Server: 192.168.16.24
Address: 192.168.16.24#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.215.177.38
Name: www.a.shifen.com
Address: 14.215.177.39

4. 参考

https://www.jianshu.com/p/915de89d070e
https://jin-yang.github.io/post/network-dns-protocol-details-introduce.html
DNS 协议 RFC1035 详细规定了 DNS 报文的格式,详见 4. MESSAGES 中的部分。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!