解析DNS查询报文,探索DNS工作原理
目录
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.baidu0x0040: 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高性能服务器编程》- 游双
相关文章:

解析DNS查询报文,探索DNS工作原理
目录 1. 用 tcpdump工具监听抓包 2. 用 host 工具获取域名对应的IP地址 3. 分析DNS以太网查询数据帧 3.1 linux下查询DNS服务器IP地址 3.2 DNS以太网查询数据帧 (1)数据链路层 (2)网络层 (3)传输层…...

Unity让摄像机跟随物体的方法(不借助父子关系)
在Unity中,不使用子对象的方式让相机跟随物体移动,我们通过编写脚本来实现。下面放一个从工程中摘出来的的C#脚本示例,用于将相机绑定到一个Target对象上并跟随其移动: using UnityEngine; public class FollowCamera : MonoBeh…...

misc音频隐写
一、MP3隐写 (1)题解:下载附件之后是一个mp3的音频文件;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密;mp3stego工具是音频数据分析与隐写工具 (2)mp3stego工具的使用:…...

如何启动网络安全计划:首先要做的事情
目录 数据分类:网络安全的基石 为什么它很重要? 如何对数据进行分类? 风险分析 什么是风险分析? 如何进行风险分析? 业务影响分析 (BIA) BIA 的用途是什么? BIA 是如何进行的? 安全解…...
Java零基础-三维数组详解!
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...
数据分析-20-时间序列预测之基于PyTorch的LSTM数据准备及模型训练流程
文章目录 1 数据加载2 去除异常值3 数据归一化4 切分窗口5 制作数据集加载器6 定义模型7 训练模型8 模型评估9 参考附录1 数据加载 参考数据集kaggle下载DailyDelhiClimate import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] = SimHei # 设…...
vue2中使用web worker启动定时器
vue2中使用web worker启动定时器,避免浏览器最小化或切换标签页时定时器不能按设定周期执行【一般是周期小于60s时,大于60s一般可正常执行】 1、添加worker-loader2、修改vue.config.js3、创建timer.worker.js4、创建TimerWorker.js5、使用TimerWorker启…...

【Python 学习】Numpy的基础和应用
目录 1 数组基础1.1 Numpy简介1.2 Numpy数组基础1.3 创建数组1.3.1 使用np.array()函数生成数组1.3.2 利用内置函数产生特定形式的数组1.3.2.1 简单内置函数1.3.2.2 特殊内置函数 1.3.3 生成随机数组 1.4 数组的数据类型1.5 数组的迭代1.6数组的索引和切片1.6.1 一维数组的索引…...

基于python+django+vue+MySQL的酒店推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】pythondjangovueMySQL的酒店推…...
什么是 PD 电压诱骗?
在这篇博客中,我们将深入了解 PD 电压诱骗 的概念,解释其工作原理,并通过简单的例子来帮助你理解整个过程。虽然看起来复杂,但我会尽量用通俗易懂的方式讲解每一个知识点。 什么是 PD 协议?要理解电压诱骗,我们首先需要知道什么是 PD 协议。 PD 协议(Power Delivery 协…...

【漏洞复现】用友 NC pagesServlet Sql注入漏洞
免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…...

边缘检测运用
文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 …...
应用宝自动下载安装
import uiautomator2 as u2 from threading import Thread import logging import sys import os loggerlogging.getLogger("uiautomator2") logger.setLevel(logging.INFO) d u2.connect()"""下载模块""" class yingyongbao(object…...
Vue 2 中实现双击事件的几种方法
在 Vue 2 中处理用户交互,特别是双击事件,是一个常见的需求。Vue 提供了一种简洁的方式来绑定事件,包括双击事件。本文将介绍几种在 Vue 2 中实现双击事件的方法。 1. 使用 dblclick 指令 Vue 允许你直接在模板中使用 dblclick 指令来监听双…...

windows服务管理插件 nssm
NSSM是一个windows下服务管理插件,可以填加、删除、启动、停止服务 1.下载 官网:http://nssm.cc 下载页面:http://nssm.cc/download 直接下载:http://nssm.cc/release/nssm-2.24.zip 2.食用 以填加php8.2为例 2.1.将nssm.ex…...

【读书笔记-《30天自制操作系统》-19】Day20
本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能,引入了系统调用以及API的概念。首先实现了显示单个字符的API,让应用程序通过传递地址的方式进行调用;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…...
Kubernetes服务注册与发现
Kubernetes服务注册与发现 1、服务注册2、服务发现2.1 DNS服务发现2.2 环境变量(较少使用)💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,服务注册与发现确保了Pod间的高效通信。 1、服务注册 当创建Service时,其信息被存储在Kubernetes的ETCD数据库中。Pod…...

【 html+css 绚丽Loading 】000047 玄武流转盘
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕…...

线程池原理及改造
目录 一 线程池执行原理 二 线程池改造(一) 三 线程池改造(二) 一 线程池执行原理 首先我们先了解一下线程池里面几个参数: 第一个是核心线程数,第二个是线程池最大线程数。(线程池里面的线程分为核心线程和非核心线程,既然核心…...
彻底理解mysql Buffer Pool (拓展)
彻底理解Buffer Pool (拓展) 一、Buffer Pool 的内存管理策略对数据库性能的影响 内存分配与回收:Buffer Pool 在申请内存时,需要考虑操作系统的内存分配策略。如果分配不合理,可能导致内存碎片,影响性能…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 ,它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...