DNS笔记

发布时间 2024-01-03 11:27:40作者: 奶茶加盐

域名

因为访问网站时,很难记住对应网站的IP地址,所以使用域名来代替IP地址,使用户更加方便的访问网站。

DNS服务器的作用就是将IP地址与域名进行映射,使用户可通过域名得到到对应的IP,然后进行访问。

域名从右到左依次为顶级域名(一级域名)、二级域名、三级域名、四级域名、等等(通常域名层级不超过三级)。每一级的域名之间用点(.)来分隔。域名的点和IP地址点分十进制的点并没有一一对应的关系。

常见的顶级域名

  1. 国家顶级域名
    • .cn 表示中国
    • .us 表示美国
    • .uk 表示英国
  2. 通用顶级域名
    • ​ .com (公司和企业)
    • ​ .net (网络服务机构
    • ​ .org (非赢利性组织)
    • ​ .edu (美国专用的教育机构)
    • ​ .gov (美国专用的政府部门)
    • ​ .mil (美国专用的军事部门)
    • ​ .int (国际组织)
  3. 基础结构域名
    • 这种顶级域名只有一个,级arpa,用于反向域名解析,因此又称为反向域名

image-20231126160751920

例如:www.baidu.com这个域名,com是顶级域名,baidu是二级域名,www是三级域名。

补充:

根域名:完整的域名是www.baidu.com. 后面的'.'表示根域名,一般情况下省略。

域与域名的区别:域名是上图中从根节点到叶子结点的部分组成,用于标识某台计算机(服务器),比如上图中的www.cctv.com;域是域名除去叶子结点的部分,不如域名www.cctv.com所在的域是cctv.com。www.baidu.com所在的域是baidu.com。

域名服务器(待补充)

这里不太懂,以后再写

  • 一个服务器所负责管辖的(或有权限的)范围叫做区 (zone)
  • 各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。
  • 每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到 IP 地址的映射
  • DNS 服务器的管辖范围不是以“域”为单位,而是以“区”为单位。

image-20231126161505456

DNS工作原理概述

当一个主机中的进程需要把域名解析为 IP 地址时,该进程就会调用解析程序,并成为 DNS 的 一个客户,把待解析的域名放在 DNS 的请求报中,以 UDP用户数据报方式发送给本地域名服务器。本地域名服务器在查找域名后,把对应的 IP 地址放在回答报文中返回。获得 IP地址的后主机即可进行通信。
如果本地域名不能回答该请求,则向其他域名服务器发送查询请求。

简单来说就是,主机通过DNS服务器获得域名对应的IP地址,然后就可以通过IP地址进行通信了。

DNS报文格式

DNS属于应用层协议,DNS服务器使用的公认端口是53,DNS既可以封装在UDP中,也可以封装在TCP中。

报文格式如下:

image-20231126163209390

DNS 分为查询请求查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。

image-20231126164615011

整个 DNS 格式主要分为 3 部分内容,即基础结构部分问题部分资源记录部分。下面将详细地介绍每部分的内容及含义。

基础结构部分

DNS 报文的基础结构部分指的是报文首部,如图所示。

image-20231126164803866

头部中每个字段含义如下。

  • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的
  • 标志:DNS 报文中的标志字段。
  • 问题计数:DNS 查询请求的数目。
  • 回答资源记录数:DNS 响应的数目。
  • 权威名称服务器计数:权威名称服务器的数目。
  • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

基础结构部分中的标志字段又分为若干个字段,如图所示。

image-20231126165029689

标志字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。请求为0,响应为1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。
    • 该位为 1 时,服务器必须处理这个请求:如果服务器没有授权回答,它必须替客户端请求其他 DNS 服务器,这也是所谓的 递归查询
    • 该位为 0 时,如果服务器没有授权回答,它就返回一个能够处理该查询的服务器列表给客户端(实际上是本地域名服务器),由客户端自己进行 迭代查询
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Zero:保留字段,在所有的请求和应答报文中,它的值必须为 0
    • 在更新的RFC2535的6.1节中提到,原来的3位zero被分为Z、AD、CDZ仍固定为0AD位仅在应答报文中使用,为1表示已经对答案中的数据进行了校验CD位仅在查询报文中使用,当值为1时表示仅接受校验后的数据
  • rcode(Reply code):返回码字段,表示响应的差错状态。
    • 当值为 0 时,表示没有错误;
    • 当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;
    • 当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;
    • 当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;
    • 当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;
    • 当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

问题部分

问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题(也可以有多个)。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。格式如下:

image-20231126170151835

该部分中每个字段含义如下:

  • 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。
    • example.com为例,将被编码为7example3com0这13个字节。数字7表示后面example的长度,最后0则表示后面没跟任何字符,相当于一个结束符。单个字节最长可表示255大小,因此每一级域名的最大长度也是255
  • 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型表示由域名获取对应的 IP 地址。
  • 查询类:地址类型,通常为互联网地址,值为 1。

常用的查询类型如下:

查询类型 名称代码 含义
1 A 将域名解析到一个指定的IPV4的IP上。
2 NS 用来指定该域名由哪个DNS服务器来进行解析,类似于托管,将子域名交给其他DNS服务器解析。
5 CNAME 规范名称,可以将注册的不同域名都转到同一个规范名称上,由这个规范名称统一解析IP地址
15 MX 电子邮件交互
16 TXT 文本信息
28 AAAA 将域名解析到一个指定的IPV6的IP上。

资源记录部分

资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段权威名称服务器区域字段附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。

image-20231126170353547

资源记录格式中每个字段含义如下:

  • 域名:DNS 请求的域名。
  • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
  • :地址类型,与问题部分中的查询类值是一样的。
  • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
  • 资源数据长度:资源数据的长度。
  • 资源数据(长度可变):表示按查询段要求返回的相关资源记录的数据。

资源记录部分只有在 DNS 响应包中才会出现

补充:查询报文只有Header+问题两个节,响应报文会包含请求报文,由Header+问题+答案三个节构成。

DNS查询过程

  1. 首先本地浏览器和操作系统的DNS缓存 ,缓存中维护一张域名与 IP 地址的对应表
  2. 再查询本地hosts文件
  3. 如果没有找到,则操作系统将域名发送至本地域名服务器 ,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式一般是 递归查询
  4. 若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询 (注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
  5. 首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
  6. 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权威域名服务器的地址
  7. 本地域名服务器根据权威域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
  8. 本地域名服务器 将得到的 IP 地址返回给操作系统,同时自己将 IP 地址 缓存 起来
  9. 操作系统 将 IP 地址返回给浏览器,同时自己也将 IP 地址 缓存 起来
  10. 至此, 浏览器 就得到了域名对应的 IP 地址,并将 IP 地址 缓存 起来

image-20231126220124174

查看本地DNS缓存

widows

# 清除 dns 缓存内容
ipconfig /flushdns 
# 查看 dns 缓存内容
ipconfig /displaydns  

Ubuntu

# 查看 DNS 缓存状况
sudo systemd-resolve --statistics

# 清除 DNS 缓存,systemd-resolve daemon 默认在所有的 Ubuntu 系统上运行
sudo systemd-resolve --flush-caches

CentOS 默认不存在 Client 端的 DNS 缓存。通常使用 nscd 来启用 dns 缓存

yum -y install nscd
systemctl enable --now nscd
# 清除缓存 即重启 nscd 服务
systemctl restart nscd

参考文章:

[一文带你读懂DNS协议 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/607293323#:~:text=DNS在设计之初主要使用UDP服务来请求,主要考虑UDP服务包体较小,且不需要经过TCP的三次握手和四次挥手,网络带宽利用率更高,速度更快,但由于历史原因,互联网上物理链路的的最小MTU为576,基于 UDP 传输的 DNS 为了限制报文不超过,576 ,所以将 DNS 报文限制在 512 字节。)

DNS报文格式解析(非常详细) (biancheng.net)

WireShark实战笔记之DNS协议分析_wireshark dns_王大碗Dw的博客-CSDN博客

  1. 标识( identifier ),一个 16 位的 ID ,在应答中原样返回,以此匹配请求和应答;
  2. 标志( flags ),一些标志位,共 16 位;其含义分别如下:
  • QR 查询应答标志,0表示这是查询报文,1表示这是应答报文。

  • opcode 查询应答类型,0表示标准查询,1表示反向查询,2表示请求服务器状态。

  • AA 表示权威回答( authoritative answer ),意味着当前查询结果是由域名的权威服务器给出的,仅由应答报文使用。

  • TC 位表示截断( truncated ),使用 UDP 时,如果应答超过 512 字节,只返回前 512 个字节,仅当DNS报文使用UDP服务时使用。DNS 协议使用UDP服务,但也明确了 『当 DNS 查询被截断时,应该使用 TCP 协议进行重试』 这一规范。

  • RD 表示递归查询标志 ( recursion desired ),在请求中设置,并在应答中返回。

    • 该位为 1 时,服务器必须处理这个请求:如果服务器没有授权回答,它必须替客户端请求其他 DNS 服务器,这也是所谓的 递归查询;
    • 该位为 0 时,如果服务器没有授权回答,它就返回一个能够处理该查询的服务器列表给客户端,由客户端自己进行 迭代查询。
  • RA 位表示可递归 ( recursion available ),如果服务器支持递归查询,就会在应答中设置该位,以告知客户端。仅由应答报文使用。

  • zero 这三位未使用,固定为0。

  • rcode 表示返回码(reply code),用来返回应答状态,常用返回码:0表示无错误,2表示格式错误,3表示域名不存在。

  1. 问题记录数( question count ),一个 16 位整数,表示后面问题节中的记录个数;
  2. 应答资源记录数( answer count ),一个 16 位整数,表示答案节中的记录个数;
  3. 授权资源记录数( authority record count ),一个 16 位整数,表示授权信息节中的记录个数;
  4. 额外资源记录数( additional record count ),一个 16 位整数,表示额外信息节中的记录个数;