上海知名网站开发公司,wordpress进销存系统,想做电商怎么入手视频,上海地区网站开发公司目录
1. 用 tcpdump工具监听抓包
2. 用 host 工具获取域名对应的IP地址
3. 分析DNS以太网查询数据帧
3.1 linux下查询DNS服务器IP地址
3.2 DNS以太网查询数据帧
#xff08;1#xff09;数据链路层
#xff08;2#xff09;网络层
#xff08;3#xff09;传输层…目录
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查询包的
源IP192.168.0.155源MAC地址00:0c:29:83:72:68
目的IP19.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位为 0b0003位标志字段的第一位保留。 第二位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是 icmp6是 tcp17是 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位未用 必须都设置为0rcode 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 770x03表示接下来的字符串长度为3个字符0x77表示 w 的ASCII码值所以 0x03 77 77 77 表示 www 这3个字符组成的字符串。
0x05 62 61 69 64 750x05表示接下来的字符串长度为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 6d0x03表示接下来的字符串长度为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高性能服务器编程》- 游双