解析DNS查询报文,探索DNS工作原理

news2024/11/24 4:27:14

目录

1. 用 tcpdump工具监听抓包

2. 用 host 工具获取域名对应的IP地址

3. 分析DNS以太网查询数据帧

3.1 linux下查询DNS服务器IP地址

3.2 DNS以太网查询数据帧

(1)数据链路层

(2)网络层

(3)传输层

(4)应用层


        DNS (Domain Name System),域名系统是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式系统,能够使人们更方便地访问互联网,DNS服务器使用UDP端口 53。在linux操作系统下,我们可以通过 host 命令,查询域名的IP地址,命令格式为:host -t A 域名,它的工作原理是怎样的呢,接下来,通过解析DNS查询报文,探索DNS工作原理。

1. 用 tcpdump工具监听抓包

tcpdump -i ens33 -ent -X port domain                                                                          

-i: 是 interface 的意思,指定要监听的网卡接口。"-i any"表示抓取所有网卡接口的数据包。

ens33:网卡接口名

-e: 是 ethernet (以太网) 的意思,显示以太网帧头部信息。

-n: 是 number 的意思,显示 IP 地址表示主机,而不是主机名;显示数字表示端口号,而不是服务名称。

-t: 不打印抓包时间戳

-XX: X是 hex 的意思,以十六进制显示数据包的内容,并打印每个十六进制字节对应的 ASCII 字符,XX表示还打印以太网帧头部信息

port domain:表示只抓取使用 domain (域名) 服务的数据包,即 DNS 查询和应答数据包

2. 用 host 工具获取域名对应的IP地址

host -t A www.baidu.com

host:是linux下一个常用的访问DNS服务器的客户端程序

-t:告诉DNS协议使用哪种查询方式

A:通过域名获取IP地址

www.baidu.com:需要查询的域名

从 host 命令输出可知,www.baidu.com 是 www.a.shifen.com 的别名,并且对应有两个IP地址,host 命令是通过 DNS 协议跟DNS服务器通信。

3. 分析DNS以太网查询数据帧

3.1 linux下查询DNS服务器IP地址

        我们的目的是要查询域名 www.baidu.com 对应的 IP地址,就要去访问DNS服务器查询,要访问DNS服务器,就要知道DNS服务器的IP地址,在linux下,/etc/resolv.conf 文件存放着DNS服务器的IP地址。我的主机 192.168.0.155 。

cat /etc/resolv.conf 

该文件的内容如下:

# Generated by NetworkManager
nameserver 192.168.0.1
nameserver 8.8.8.8

# Generated by NetworkManager 这行是注释,说明这两个 DNS服务器地址是由网络管理程序写入的

首选DNS服务器IP地址是:192.168.0.1,即路由器(网关)的IP地址

备选DNS服务器IP地址是:8.8.8.8,是google提供的免费DNS服务器的IP地址

有了DNS服务器的IP地址:192.168.0.1,就可以首先在本机 192.168.0.155 的ARP缓存中查询,是否有对应映射的 MAC地址,如果没有就会发送ARP请求,让192.168.0.1告诉它的MAC地址,192.168.0.1就会发送一个ARP应答告诉192.168.0.155 它的MAC地址。

arp -a 192.168.0.1  // 查询本机的ARP缓存是否有192.168.0.1对应映射MAC地址

从上 arp -a 192.168.0.1 命令输出可知,本机已经有 192.168.0.1 对应的映射MAC地址 3c:6a:48:e2:d5:67

本机 192.168.0.155 的 MAC地址是:00:0c:29:83:72:68

以上铺垫说了这么多,我们要查询域名 www.baidu.com 对应的 IP地址,组DNS查询包的

源IP:192.168.0.155,源MAC地址:00:0c:29:83:72:68

目的IP:19.168.0.1,目的MAC地址:3c:6a:48:e2:d5:67

3.2 DNS以太网查询数据帧

00:0c:29:83:72:68 > 3c:6a:48:e2:d5:67, ethertype IPv4 (0x0800), length 73: 192.168.0.155.48516 > 192.168.0.1.domain: 50690+ A? www.baidu.com. (31)
        0x0000:  3c6a 48e2 d567 000c 2983 7268 0800 4500  <jH..g..).rh..E.
        0x0010:  003b 4c5f 0000 4011 ac66 c0a8 009b c0a8  .;L_..@..f......
        0x0020:  0001 bd84 0035 0027 8225 c602 0100 0001  .....5.'.%......
        0x0030:  0000 0000 0000 0377 7777 0562 6169 6475  .......www.baidu
        0x0040:  0363 6f6d 0000 0100 01                   .com.....
(1)数据链路层

以太网首部:(目的MAC地址6字节)(源MAC地址6字节)(帧类型2字节)共14字节

3c6a 48e2 d567 000c 2983 7268 0800

0x3c6a 48e2 d567:对应的是目的MAC地址6字节,也就是DNS服务器192.168.0.1的MAC地址

0x000c 2983 7268:对应的是源MAC地址6字节,也就是发送方主机192.168.0.155的MAC地址

0x0800:对应的是帧类型,是用来区分上层协议的(即网络层),0x0800表示这帧是IP协议数据报,我们就可以根据这个帧类型在网络层怎么去解析数据报了

(2)网络层

IP协议头部共20个字节

4500 003b 4c5f 0000 4011 ac66 c0a8 009b c0a8 0001

0x4500:对应的是(4位版本号)(4位头部长度)(8位服务类型TOS)。

               高字节数据 0x45 中的前4位是IP版本号,值为 4 说明这是IPv4

               高字节数据 0x45 中的低4位是IP头部长度,标识IP头部有多少个4字节,值为 5 说明IP头部有20字节。

               低字节数据 0x00 是8位数据报服务类型,值为 0x00 说明是一般服务。

0x003b:对应的是16位总长度(单位:字节),即在该层中报文(包括IP协议头部和上层数据报)总共 59 字节

0x4c5f:对应的是 16位标识,唯一标识主机发送的每一个数据报,其初始值由系统随机生成,每发送一个数据报,其值加1,该值在数据报分片时被复制到每一个分片中,因此一个数据报的所有分片都具有相同的16位标识值。

0x0000:该16位数据对应的是(3位标志)(13位片偏移)

               高3位为 0b000,3位标志字段的第一位保留。 第二位(Don’t Fragment, DF) 表示“禁止分片”。 如果设置了这个位, IP模块将不对数据报进行分片。 在这种情况下, 如果IP数据报长度超过MTU的话, IP模块将丢弃该数据报并返回一个ICMP差错报文。 第三位(More Fragment, MF) 表示“更多分片”。 除了数据报的最后一个分片外, 其他分片都要把它置1。因此高3位为 0b000,最高位为 0,保留位,中间位为 0,表示允许分片,低位为 0 表示这是最后一个分片
                13位分片偏移(fragmentation offset) 是分片相对原始IP数据报开始处(仅指数据部分) 的偏移。 实际的偏移值是该值左移3位(乘8) 后得到的。 由于这个原因, 除了最后一个IP分片外, 每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值) 。因为这个数据报的总长度为 0x003b,即 59 字节,没有分片,所以这13位的值为0

0x4011:对应的是(8位生存时间TTL)(8位协议)

               高8位为 0x40,即十进制 64,数据报到达目的地之前允许经过的路由器跳数。

               低8位为 0x11,即十进制 17,是用来区分上层协议(即传输层),在 /etc/protocols 可以查询,比如,1是 icmp,6是 tcp,17是 udp 

0xac66:对应的是16位头部校验和(header checksum) 由发送端填充, 接收端对其使用CRC算法以检验IP数据报头部(注意, 仅检验头部) 在传输过程中是否损坏。

0xc0a8 009b:对应的是32位发送方IP地址,我们的发送方是主机 192.168.0.155,用点分十六进制就是 0xc0.80.0.9b

0xc0a8 0001:对应的是32位接收方IP地址,我们的接收方是网关 192.168.0.1,用点分十六进制就是 0xc0.80.0.1

(3)传输层

UDP头部共8字节

bd84 0035 0027 8225

0xbd84:对应的是16位源端口号,即十进制 48516

0x0035:对应的是16位目的端口口,即十进制 53

0x0027:对应的是16位UDP长度,即十进制 39

0x8225:对应的是16位UDP校验和

(4)应用层

DNS协议头部

c602 0100 0001 0000 0000 0000  

0xc602:对应的是16位标识,用于标记一对DNS查询和应答, 以此区分一个DNS应答是哪个DNS查询的回应。

0x0100:对应的是16位标志,值 0x0100 可以知道

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

0x0001:对应的是16位问题个数,对于查询报文来说,一般包含1个查询问题。

0x0000:对应的是16位应答资源记录个数,对于查询报文来说,值为 0

0x0000:对应的是16位授权资源记录数目,对于查询报文来说,值为 0

0x0000:对应的是16位额外资源记录数目,对于查询报文来说,值为 0

查询问题部分

0377 7777 0562 6169 6475 0363 6f6d 0000 0100 01 

0x03 77 77 77:0x03表示接下来的字符串长度为3个字符,0x77表示 'w' 的ASCII码值,所以 0x03 77 77 77 表示 "www" 这3个字符组成的字符串。

0x05 62 61 69 64 75:0x05表示接下来的字符串长度为5个字符,0x62表示 'b' 的ASCII值,0x61表示 'a' 的ASCII值,0x69表示 'i' 的ASCII值,0x64表示 'd' 的ASCII值,0x75表示 'u' 的ASCII值,所以 0x05 62 61 69 64 75 表示 "baidu" 这5个字符组成的字符串。

0x03 63 6f 6d:0x03表示接下来的字符串长度为3个字符,0x63表示 'c' 的ASCII码值,0x6f表示 'o' 的ASCII值,0x6d表示 'm' 的ASCII值,所以 0x03 63 6f 6d 表示 "com" 这3个字符组成的字符串。

0x00:对应的是表示字符串结束1字节,字符串的终止符是'\0',对应的ASCII码值为 0

0x0001:对应的是16位查询类型,表示如何执行查询操作:

  • 类型A, 值是1, 表示获取目标主机的IP地址。
  • 类型CNAME, 值是5, 表示获得目标主机的别名。
  • 类型PTR, 值是12, 表示反向查询,即根据IP地址查询域名的过程。

0x0001:对应的是16位查询类,该值通常为 1,表示获取因特网IP地址。

至此,DNS查询以太网帧数据全部解析完毕。

参考书籍

《Linux高性能服务器编程》- 游双 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NC 和为K的连续子数组

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个无序…

基于SpringBoot+Vue+MySQL的影院购票系统

系统展示 用户前台界面 管理员后台界面 系统背景 基于SpringBoot、Vue.js与MySQL的影院购票系统&#xff0c;实现了从后端服务到前端展示及数据库管理的全栈开发。该系统通过SpringBoot构建高效稳定的RESTful API&#xff0c;处理用户注册登录、影片信息查询、座位选择、在线购…

无人直播好帮手,视频指定词语消音,消除违禁词,直播视频录制,音视频分离,分段

1.视频消音功能 一键删除或者静音视频中的词语 2.直播视频录制功能 可同时录制多个平台,多个主播,没有数量限制 3.音视频转码 支持多种音视频格式转换 4.视频频分离 分离视频中的音频和视频 5.视频合并分割 合并和按时间分割视屏 目前正在测试中…如有需要可以先使…

【C语言从不挂科到高绩点】16-作用域和自定义头文件

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中的函数&#xff1a; 本套课程将会从0基础讲解C语言核心技术&#xff0c;适合人群&#xff1a; 大学…

LLM 大模型研习:当下热门 AI 大模型的生成原理与逻辑

前言 在过去数年里&#xff0c;人工智能领域迎来了前所未有的变革&#xff0c;其中大规模预训练模型的崛起尤为引人注目。像GPT系列、BERT、T5、DALLE和CLIP等模型&#xff0c;凭借强大的语言理解与生成能力&#xff0c;在自然语言处理&#xff08;NLP&#xff09;、计算机视觉…

Android Auto助力电动汽车智能驾驶

随着技术的飞速发展&#xff0c;电动汽车&#xff08;EVs&#xff09;成为未来出行的重要趋势。然而&#xff0c;EVs 的普及不仅仅代表环保选择&#xff0c;它们还推动了智能汽车技术的发展。Android Auto 的集成无疑为电动汽车用户带来了更便捷和智能的驾驶体验。 一、智能互联…

解决Matlab报错:MEX 文件 ‘D:\MATLAB\toolbox\maple\maplemex.mexw64‘ 无效: 缺少依赖共享库

安装Maple之后&#xff0c;再使用MATLAB就报了以上错误。 按照以下解决方法可以正常运行&#xff1a; 1. 在添加路径下删除D:\matlab\toolbox\Maple 2. 再添加路径 D:\matlab\toolbox\symbolic 3. 保存

UDS 诊断 - InputOutputControlByIdentifier(按标识符的输入输出控制)(0x2F)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl&#xff08;诊断会话控制&#xff09;&#xff08;0x10&#xff09;服务 UDS 诊断 - ECUReset&#xff08;ECU重置&#xff09;&#xff08;0x11&#xff09;服务 UDS 诊断 - SecurityA…

8月份美国CPI通胀降至+2.5%

根据劳工统计局&#xff08;BLS&#xff09;最近发布的一份报告&#xff0c;美国CPI&#xff08;消费者价格指数&#xff09;通胀在8月份放缓至2.5%&#xff08;同比&#xff09;&#xff0c;这是自2021年2月以来的最低水平。最新的通胀数据使美国国债收益率和美元指数上升&…

稀土抗菌剂真的能抗菌吗?

在现代生活中&#xff0c;抗菌剂已经成为了我们日常生活的一部分。然而&#xff0c;面对市面上各种抗菌产品&#xff0c;我们如何才能选择既安全又有效的产品呢&#xff1f;近年来&#xff0c;稀土抗菌剂因其独特的抗菌性能而引起了广泛关注。 稀土抗菌剂的抗菌原理 稀土抗菌剂…

基于 SpringBoot 的学习平台

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台…

Jenkins部署若依项目

一、配置环境 机器 jenkins机器 用途&#xff1a;自动化部署前端后端&#xff0c;前后端自动化构建需要配置发送SSH的秘钥和公钥&#xff0c;同时jenkins要有nodejs工具来进行前端打包&#xff0c;maven工具进行后端的打包。 gitlab机器 用途&#xff1a;远程代码仓库拉取和…

OpenHarmony鸿蒙( Beta5.0)智能加湿器开发详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

spring security OAuth2 客户端接入gitee

一、简介 OAuth 是一个开放标准&#xff0c;该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等)&#xff0c;并且在这个过租中无须将用户名和密码提供给第三方应用。通过令牌(token)可以实现这一功能&#xff0c;每一个令牌授权一个特定的…

ATF UFS初始化笔记

1. JESD220 中关于UFS初始化的描述 原文 13.1.3 Initialization and boot code download process The initialization and boot code download process is made up of the following phases: partial initialization, boot transfer and initialization completion. 13.1.3.…

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…

【读论文】End-to-end reproducible AI pipelines in radiology using the cloud

文章目录 End-to-end reproducible AI pipelines in radiology using the cloud01 研究背景与目的医学成像领域&#xff08;1&#xff09;研究现状&#xff08;2&#xff09;存在问题 其他研究领域&#xff1a;基因组学&#xff08;genomics&#xff09;研究目的&#xff1a;提…

Vue3使用vue-qrcode-reader实现扫码绑定设备功能

需求描述 移动端进入网站后&#xff0c;登录网站进入设备管理界面。点击添加设备&#xff0c;可以选择直接添加或者扫一扫。点击扫一扫进行扫描二维码获取设备序列号自动填充到添加设备界面的序列号输入框中。然后点击完成进行设备绑定。 安装vue-qrcode-reader 这里使用的版…

《OpenCV计算机视觉》—— 身份证号码识别案例

文章目录 一、案例实现的整体思路二、代码实现1.首先定义两个函数2.模板图像中数字的定位处理3.身份证号码数字的定位处理4.使用模板匹配&#xff0c;计算匹配得分&#xff0c;找到正确结果 一、案例实现的整体思路 下面是一个数字0~9的模板图片 案例身份证如下&#xff1a; 对…

http有什么方法升级成https?

&#x1f512; 获取与安装证书 JoySSL注册填写申请码230907即可领取免费申请资格https://www.joyssl.com/certificate/select/free.html?nid7 &#x1f4c4; 申请SSL证书 选择证书&#xff1a;首先需选择合适的SSL证书&#xff0c;如域名认证&#xff08;DV&#xff09;、公…