《Linux高性能服务器编程》笔记3--tcpdump观察dns

DNS工作原理

DNS查询和应答报文详解

DNS是一套分布式域名查询服务系统。每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新。
《Linux高性能服务器编程》笔记3--tcpdump观察dns

16位标识字段标记一对DNS查询和应答,区分一个DNS应答是哪个DNS查询的回应。
16位标志字段用于协商具体的通信方式和反馈通信状态。
《Linux高性能服务器编程》笔记3--tcpdump观察dns

QR:查询/应答标志。0–查询,1–应答。
opcode:定义查询和应答的类型。0表示标准查询,1表示反向查询(由IP地址获取主机域名),2表示请求服务器状态。
AA:授权应答标志。仅有应答报文使用。1表示域名服务器是授权服务器。
TC:截断标志。仅当DNS报文使用UDP服务时使用,因为UDP数据包有长度限制,过长被截断。1表示DNS超过512字节,并被截断。
RD:递归查询标志。1表示执行递归查询操作。如果目标DNS无法解析某个主机名,则它向其他DNS服务器继续查询,如此递归,知道获得结果并把该结果返回给客户端。0表示执行迭代查询,如果目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供服务器参考。
RA:允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询。
zero:这三位未用,必须设置为0。
rcode:4位返回码,表示应答的状态。常用值有0(无错误)和3(域名不存在)。

接下来4个字段分别指出DNS报文的最后4个字段的资源记录数目。
对查询报文而言,一般包含1个查询问题,应答资源记录、授权资源记录和额外资源资料数为0.
对于应答报文而言,应答资源记录数至少为1,授权资源记录数和额外资源资料数可为0和非0.
《Linux高性能服务器编程》笔记3--tcpdump观察dns

查询名以一定的格式封装了要查询的主机域名。
查询类型:

  • 类型A,值为1,表示获取目标主机的IP地址。
  • 类型CNAME,值为5,表示获取目标主机的别名。
  • 类型PTR,值为12,表示反向查询。

查询类通常为1,表示获取IP地址。

DNS实验

host -t A www.baidu.com,host命令使用DNS协议和DNS服务器通信,其-t选项告诉DNS协议使用哪种查询类型。这里A表示查询IP地址,但实际上返回的还是包括别名。
《Linux高性能服务器编程》笔记3--tcpdump观察dns

使用tcpdump观察DNS通信过程。

一个终端运行tcpdump:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbWQQWBY-1588316898691)(_v_images/20200429101249399_3348.png =771x)]
这里两个数据包开始的“IP”指出,后面的内容描述的是IP数据报。tcpdump以“IP地址.端口号”的形式描述通信的某一段,以">"表示数据传输的反向,左边是源端,右边是目的端。
第一个数据包中,数值53326是DNS查询报文的标识值,该值也出现在DNS应答报文中。+表示启用递归查询标志。A?表示用A类型的查询方式,www.baidu.com是DNS查询问题中的查询名,括号中的31表示查询报文的长度,单位字节。
第二个数据包中,3/0/0表示3个应答记录,0个授权资源记录,0个额外信息。CNAME表示之后紧随的是机器的别名,A后表示的是记录的IP地址,应答报文的长度是90字节。

另一个终端运行host:
《Linux高性能服务器编程》笔记3--tcpdump观察dns

如果开启tcpdump -X选项,可以看到DNS报文的每一个字节。如图
《Linux高性能服务器编程》笔记3--tcpdump观察dns