1、实验概述
在Ubuntu上用host
命令通过DNS协议查询www.baidu.com
的IP地址。同时,使用tcpdump
抓取数据包,并观察结果。
2、实验过程
首先,在一个终端上输入如下命令:
sudo tcpdump -nt -s 500 port domain
-s 500
表示每个数据包的大小为500字节- 使用
port domain
表示只抓取使用domain
(域名)服务的数据包,即DNS查询和应答报文。
然后再开一个新的终端,输入如下命令:
host -t A www.baidu.com
-t
选项告诉DNS协议使用哪种查询类型。这里使用的是A类型(详请参考DNS的报文格式),即通过域名获得其IP地址。
host
使用DNS协议和DNS服务器通信,查询域名对应的IP。
3、结果分析
第二个终端:
host
命令的输出告诉我们,域名www.baidu.com
是www.a.shifen.com
的别名,且该域名对应两个IP地址。
第一个终端:
重点分析第一个终端的输出内容。前两行并不是抓包的输出信息。直接看后两行(按^C
前面的算)。
一共抓到两个数据包,分别是主机发出的DNS请求和收到的DNS应答。
- 两个数据包开始的
IP
表示,后面的内容描述的是IP数据报。 IP
后面紧跟着IP地址+端口号,tcpdump
以 “IP地址.端口号” 的形式描述通信的某一端。所以下面的DNS应答报文中的端口号为53
,是DNS服务使用的端口。>
表示数据传输的方向,>
前面是源端,后面是目的端。- 两个数据包中的
53231
是DNS查询报文的标识值,此值用于标记一对DNS查询/应答报文,所此值也出现在以下面的应答报文中。 +
表示启用递归查询标志。A?
表示使用A类型查询方式。www.baidu.com
是DNS查询问题中的查询名。- 最后括号中的
31
是DNS查询报文的长度(以字节为单位)。
DNS查询报文分析完毕,再看DNS应答报文。
3/0/0
表示该报文中包含3个应答资源记录、0个授权资源记录 和 0个额外信息记录。CNAME www.a.shifen.com., A 39.156.66.18, A 39.156.66.14
表示3个应答资源记录的内容。其中CNAME
表示紧随其后的纪录是机器的别名,A
表示紧随其后的纪录是IP地址。(90)
表示该应答报文的长度为226字节。
4、扩展
抓包时使用-x
选项,就能看到DNS报文的每一字节: