风也温柔

计算机科学知识库

计算机网络课程设计 解析ip数据包 《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析

  域名系统 DNS( Name ) 是互联网使用的命名系统,用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS,但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS。DNS 是:

  一个有分层的 DNS服务器实现的分布式数据库;一个使得主机能够查询分布式数据库的应用层协议。

  采用客户服务器方式,使大多数名字都在本地进行解析。名字到 IP 地址的解析是由若干个域名服务器程序完成的,域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器。当一个应用进程需要把主机名解析为 IP 地址是,该用户进程就调用解析程序,并成为 DNS 的一个客户,把待解析的域名放在 DNS 请求报文中,以 UDP 用户数据报的方式发给本地域名服务器。本地域名服务器查找域名后,把对应的 IP 地址放在回答报文中返回。若本地域名服务器不能回答该请求计算机网络课程设计 解析ip数据包 《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析,则该本地域名服务器就暂时成为 DNS 中的另一个客户,并向其他域名服务器发出查询请求。

  为什么是分布式?

  DNS 的一种简单的设计是,在互联网中只使用一个 DNS 服务器,该服务器包含所有的映射,所有客户的查询都发往该服务器。现在来考虑下,为什么 DNS 不使用集中式设计而是使用分布式?原因主要有一下 4 点:

  总而言之,单一的 DNS 服务器上运行集中式数据库,完全没有拓展能力。

  DNS 系统是一种将域名和 IP 地址相互映射的以层次结构分布的数据库系统。DNS 系统采用递归查询请求的方式来响应用户的查询,为互联网的运行提供关键性的基础服务。

  DNS 系统的解析过程描述如下:

  主机先向本地域名服务器进行递归查询;本地域名服务器采用迭代查询,向一个根域名服务器进行查询;根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的 IP 地址;本地域名服务器向顶级域名服务器进行查询;顶级域名服务器告诉本地域名服务器,下一步查询权威服务器的 IP 地址;本地域名服务器向权威服务器进行查询;权威服务器告诉本地域名服务器所查询的主机的IP地址;本地域名服务器最后把查询结果告诉主机。

  本实验的主要内容是基于 工具去分析 DNS 的解析过程及其协议字段。

  1 DNS 协议分析 1.1 域名解析 1.1.1 域名结构

  IP 地址是网络中面向应用的计算机主机的标志,而域名则是互联网中面向用户的主机的标志。为了保证域名的唯一性,域名系统采用层次结构。如下图所示:

  1.1.2 域名服务器

  域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名及其 IP 地址数据库的主机。

  域名服务器由高向低进行层次划分,可分为以下几大类:

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

  我们需要注意的是:

  1.1.3 域名解析

  域名解析主要是将主机名(例如 )转换为计算机友好的 IP 地址(例如 192.168.1.1),域名解析的基本过程:

  简单的域名对应的 IP 地址查询,也可以使用 ping 命令来完成。

  1.1.4 域名解析与

   是一种网络管理命令行工具计算机网络课程设计 解析ip数据包,可用于查询 DNS 域名和 IP 地址。无论是 linux 或者是 下都有这个工具,用好它对平常的域名解析情况,或者对域名服务器的维护都有帮助。

  语法:

   nslookup [ -Option ... ] [ Host ] [ -NameServer ]

   命令以两种方式查询域名服务器:

  下面列举几种主要用法:

  直接查询 查询一个域名的 A 记录,使用默认的 DNS 服务器,语法为: 例如:

  从中可以看出:

  (1) 的域名解析所使用的 DNS 服务器地址 172.21.0.10;

  (2) 域名对应的主机有几个IP地址。

  指定域名服务器查询

   nslookup domain dns-server

  将查询请求发送到 DNS 服务器 ,而不是默认的 DNS 服务器。如:

   nslookup baidu.com 172.21.0.10

  查询其他记录,语法格式如下:

   nslookup -type=type domain

  通过指定 -type 参数的具体类型,执行其他类型的查询。常用类型说明:

  如查询对应的名字服务器记录:

   nslookup -type=NS baidu.com

  结果如图:

  查询 IP 地址172.11.4.107对应的域名(反向查询):

   nslookup -type=PTR 172.11.4.107

  结果如图:

  1.2 查看与设置 DNS 服务器操作 1.2.1 如何查看网卡默认的 DNS 服务器

  在我们使用的 Linux 操作系统里面,DNS 服务器的配置信息在 /etc/.conf 文件里面。查看该文件的命令如下:

   cat /etc/resolv.conf

  该文件内容如下图所示:

  可以看出,默认的 DNS 服务器 IP 是:172.21.0.10

  1.2.2 如何修改网卡默认的 DNS 服务器

  可以直接修改 . conf文件,方法如下:

   vim /etc/resolv.conf // 打开resolv.conf 文件

  改为如下内容:

   nameserver 114.114.114.114 # 修改成你的主DNS

    nameserver 8.8.8.8                # 修改成你的备用DNS

  配置完成后,需重启网络服务才生效,重启网络服务的语句为:

   service networking restart

  1.3 DNS 报文分析 1.3.1 DNS 域名解析过程

  DNS 协议属于应用层,使用客户端-服务器模式运行在通信的端系统之间。在通信的端系统之间通过端到端传输输协议( UDP 协议,通常使用 53 号端口)来传送 DNS 报文。DNS 系统解析过程如下图所示:

  DNS 客户需要访问 WEB 服务器 ,则客户机可以访问本地的 hosts 文件,看能否知道主机名称对应的 IP 地址,如果 hosts 文件不能解析该主机名称,则只能通过向客户机所设定的 DNS 服务器进行查询。查询过程如下:

  有两种查询方式,分别是:

  1. 递归查询

  主机向本地域名服务器的查询,一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。

  2. 迭代查询

  本地域名服务器向根域名服务器的查询,通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。

  递归查询:主机向本地域名服务器的查询一般都是采用递归查询;迭代查询:本地域名服务器向根域名服务器的查询通常采用迭代查询。只是通常,也有的采用递归查询。 1.3.2 域名解析协议

  域名解析的实现是依靠 DNS 协议来完成。有两种 DNS 报文——查询报文和响应报文,分别来实现 DNS 的查询请求和响应请求。

  DNS 协议报文格式如下:

  1. 头部

  (1) 会话标识(2 字节) DNS 报文的 ID 标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分 DNS 应答报文是哪个请求的响应。

  (2) 标志(2 字节) 各字段定义如下:

  (3) 数量字段(总共 8 字节): 各自表示后面的四个区域的数目。

  2. 正文

  正文部分由查询区域和资源记录区域组成。

  (1) 查询区域

  注:查询类通常为 1 ,表明是 数据。

  (2) 资源记录 (RR) 区域(包括回答区域、授权区域和附加区域)

  这三个区域分别是:回答区域,授权区域和附加区域,其格式都是一样的。

  1.4 NS 类型的 DNS 解析报文分析 1.4.1 如何捕获 NS 类型的 DNS 报文

  DNS 中 NS 记录 NS(Name )记录是域名服务器记录,用来指定该域名由哪个 DNS 服务器来进行解析。 在注册域名时,总有默认的 DNS 服务器,每个注册的域名都是由一个 DNS 域名服务器来进行解析的,DNS 服务器 NS 记录地址一般以以下的形式出现:、 等。 简单的说,NS 记录是指定由哪个 DNS 服务器解析你的域名。

  在执行 时,可以通过指定参数 -type=NS 来查询指定域名对应的域名服务器。如下图所示。

  1.4.2 解析 DNS 请求报文

  通过 可以抓取执行上述操作报文列表。筛选 DNS 协议的报文,找到查询请求报文,展开如下图所示。

  可以看出,请求查询报文的的 Type 字段为 NS ,即 Name 。即希望得到权威的名字服务。该请求报文是通过 UDP 协议进行传输的,端口号为 53 。

  传输层协议使用 TCP 还是 UDP ?

  DNS 可以使用 UDP/53 ,也可以使用 TCP/53 。当响应报文的长度小于 512B 时,就使用 UDP (因为 UDP 的最大报文长度为 512B );若响应报文的长度超过 512B ,则选用 TCP 。DNS 协议关于 UDP 和 TCP 的选择通常为以下两种情况:

  (1) 若 DNS 客户程序事先知道响应报文的长度超过 512B ,则应当使用 TCP 连接;

  注意:主域名服务器与辅助域名服务器在进行区域传送时,通常数据量都比较大,所以 DNS 规定,区域传送使用 TCP 协议。

  (2) 若解析程序不知道响应报文的长度,它一般使用 UDP 协议发送 DNS 查询报文,若 DNS 响应报文的长度大于 512B ,服务器就截断响应报文,并把 TC() 置为 1 。在这种情况下,DNS 客户程序通常使用 TCP 重发原来的查询请求,从而它将来能够从 DNS 服务器中收到完整的响应。

  1.4.3 解析 DNS 应答报文

  查看随后的响应报文,可以看到有多个响应报文。这些报文就是在进行解析域名对应的权威服务器过程中响应的报文。展开这些报文,可以看到第一个响应报文如下图所示。

  该报文应答部分有多个服务器地址,其第一个地址类型为 SOA(start of a zone of an ),即权威区域的开始。其后的服务器地址类型为 SRV( ),即服务器选择。

  随后的多个报文都是对查询报文的响应。

  由于前述响应报文长度大于 512B ,随后再次出现了一个查询请求报文,查看其传输层协议,可以看到换用了 TCP 协议。

  同样有多个应答报文进行响应。查看这些报文的应答类型,有些是 SRV ,有些是 A(,内容是具体的 IP 地址)。

  查看最后一个应答报文,如下图所示。

  可以看出,其权威 DNS 服务器的名称为:ns.dns..local。

  1.5 反向 DNS 解析 1.5.1 反向解析

  在 中,类型参数设为 PTR 表示反向解析。反向解析是用于将一个 IP 地址映射到对应的域名,也可以看成是 A 记录的反向,IP 地址的反向解析。下图演示了反向解析 IP 地址 39.156.69.79 的操作。

  注意:反向解析时IP地址的顺序也是反的

  反向解析查询报文

  下图是 抓获的查询报文。

  展开 Query 段,可以看到,此报文的 Type 为 PTR ,即反向解析。反向解析的 name 是 IP 地址再加了 in-addr.arpa 这部分。

  反向解析响应报文

  下图是 抓获的反向解析应答报文。

  展开该报文的 部分,可以看到该段的 Type 是 PTR ,查询的 name 是 IP 地址加in-addr.arpa 部分,而响应的 Name 的值为:。

  1.6 指定服务器的DNS报文分析

  打开 ,并在过滤器中输入 DNS 。筛选出 DNS 协议报文,并开始捕获报文。然后打开终端,输入命令并执行 114.114.114.114,在 中停止捕获报文;

  从报文列表可以看出,经历了多次查询与应答,在最后一轮才得到了的 A 地址。查询的百度域名依次为:

   baidu.com.default.svc.cluster.local

    baidu.com.svc.cluster.local
    baidu.com.cluster.local
    baidu.com

  依次查看其应答报文,可以看出,前几次的应答都是 ,类型为 SOA计算机网络课程设计 解析ip数据包,即域名分区,没有得到真正的 IP 地址;只有最后一次才得到 ,其类型 Type 为 A ,其 IP 地址为 220.181.38.148,39.156.69.79。

  补充:

  (对于)和 (对于Linux / Unix)是主机中最实用的程序,尤其是用于调试网络问题时。这里我们只讨论,尽管Linux / Unix的 与其非常相似。 可用于显示您当前的TCP/IP信息,包括您的地址,DNS服务器地址,适配器类型等。例如,您只需进入命令提示符,输入

   ipconfig /all

  所有关于您的主机信息都类似如下面的屏幕截图所显示。

   对于管理主机中存储的DNS信息也非常有用。在第2.5节中,我们了解到主机可以缓存最近获得的DNS记录。要查看这些缓存记录,在 C:> 提示符后输入以下命令:

   ipconfig /displaydns

  每个条目显示剩余的生存时间(TTL)(秒)。要清除缓存,请输入:

   ipconfig /flushdns

  清除了所有条目并从hosts文件重新加载条目。

  2 实验分析

  现在,我们熟悉和,我们准备好了一些正经的事情。首先让我们捕获一些由常规上网活动生成的DNS数据包。

  运行 以获取一个亚洲的Web 服务器的IP 地址。该服务器的IP 地址

  是什么?

  答:这里使用的阿里的公众 DNS 223.5.5.5 替代我的 ISP 服务商的 DNS 进行查

  询,这里我查询的是南航()的IP 地址。可以在图中看到我请求阿里公共DNS 来获取南航的IP 地址,为:218.94.136.180。

  找到DNS查询和响应消息。它们是否通过UDP或TCP发送?

  答:是 UDP。

  DNS是查询消息的目标端口是什么? DNS响应消息的源端口是什么?

  答:都是 53 端口。

  DNS 查询消息发送到哪个 IP 地址?使用 来确定本地 DNS 服务器的 IP 地址。这两个 IP 地址是否相同?

  检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “”?

  答:Type 为 “A”,表示查询 IP 地址,没有任何 “”。

  检查DNS响应消息。提供了多少个""?这些答案具体包含什么?

  答:提供了 2 个 “”,是该域名的 2 个 IPV4 地址。

  考虑从您主机发送的后续 TCP SYN 数据包。 SYN 数据包的目的 IP 地址是否与 DNS 响应消息中提供的任何 IP 地址相对应?

  答:是相对应的。

  这个网页包含一些图片。在获取每个图片前,您的主机是否都发出了新的 DNS 查询?

  答:没有,因为本机 DNS 已经被缓存了,因此不需要发起新的 DNS 查询。

  DNS查询消息的目标端口是什么? DNS响应消息的源端口是什么?

  答:目标端口和源端口都是 53。

  DNS 查询消息的目标 IP 地址是什么?这是你的默认本地 DNS 服务器的 IP 地址吗?

  答:225.3.3.3,是我修改的默认本地 DNS 服务器的 IP 地址。

  检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “”?

  答:Type 为 “A”,表示查询 IP 地址,没有任何 “”。

  检查 DNS 响应消息。提供了多少个 “”?这些答案包含什么?

  答:提供了 1 个 “”,是该域名的 IPV4 地址。

  现在重复上一个实验,但换成以下命令:

   nslookup www.aiit.or.kr bitsy.mit.edu

  DNS 查询消息发送到的 IP 地址是什么?这是您的默认本地 DNS 服务器的 IP 地址吗?

  答:18.0.72.3,不是我的默认本地 DNS 服务器的 IP 地址。

  检查DNS查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “”?

  答:Type 为 “A”,表示查询 IP 地址,没有任何 “”。

  检查 DNS 响应消息。提供了多少个 “”?这些答案包含什么?

  答:提供了 1 个 “”,是该域名的 IPV4 地址。

  补充:dig命令

  命令行工具 dig 可以跟 DNS 服务器互动,它的查询语法如下(美元符号$是命令行提示符)

   $ dig @[DNS 服务器] [域名]

  网上有很多公用的 DNS 服务器,这篇文章选择 公司提供的 1.1.1.1 进行演示,向 1.1.1.1 查询域名,就执行下面的命令。

  参考

  文章来源:https://blog.csdn.net/xq151750111/article/details/130576182