【简介】DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
捕获 DNS 数据包
当客户端尝试访问互联网的某个网站时,访问请求会通过一台DNS服务器发送出去。这台DNS服务器会查找自己包含的资源记录,找到对应的IP地址并返回。
① 电脑上网的时候网卡都要设置DNS服务器IP地址,通过DNS服务器来查询网站的IP地址。DNS服务器可以是内网自建,也可以是外网公用。电信、移动等宽带都会根据不同地域,指定不同的DNS服务器IP地址。例如深圳电信常用的DNS地址就是202.96.134.133。当然也可以使用114.114.114.114或8.8.8.8公用DNS服务器地址,这样不同运营商的宽带都可以正常获取到IP地址。
② 启动 Wireshark,选择上网的网卡接口,点击捕获图标开始捕获。
③ 打开浏览器,这里我们访问美国飞塔的网站。
④ 在分析之前我们关闭捕获,以免抓到的包越来越多。
⑤ 在显示过滤器中输入过滤条件,得到我们要分析的DNS包。
DNS 数据包分析
在想象中,我们向DNS发送一个查询请求,然后回传一个IP地址,DNS的工作就算是完了。
① 实际上发送和回传的可并不只一次,客户端每发送一条查询消息,都会得到DNS服务器的响应。我们可以看到有个十六进制的号,使得发送和响应一一对应。
② 我们首先来查看0x54d1发送包,和其它包一样,最前面是14个字节为以太网帧头,然后是20字节的IP帧头,这里就不再描述了, 这里看到的是8个字节的用户数据报文协议(指定了源和目标端口),30字节的域名解析查询。
Transaction ID(交易口):这个数值的作用是将一个域名查询消息和对应的响应消息对应起来。
query/response(查询/响应):每个DNS数据包都会被标记为查询消息或者响应消息,具体哪一类取决于消息中包含的内容。
Flags(标记):每个查询和响应消息都有不同的标记位置位。
Response(响应):标识该消息为查询消息还是响应消息。
Opcode(操作码):这个标记决定了查询消息的类型。Opcode范围是0~15。
Opcode 值 | 描 述 |
0 | 标准查询 |
1 | 逆向查询 |
2 | 服务器状态请求 |
3 | 未分配 |
4 | 通告 |
5 | 更新 |
6~15 | 未分配 |
Truncated(截断):这个标记决定了如果数据包过大(大于512字节)时,是否对数据包进行截断。
Recursion desired(期望递归):如果要所查的记录不存在,那么客户端发送的消息就会从一台DNS服务器到另一台DNS服务器这样执行一个递归的搜索流程。
Type(类型):这个字段显示的是查询的类型。
类 型 | 描 述 |
A | 主机地址 |
NS | 域名服务器 |
MX | 邮件交互 |
SOA | 起始授权机构 |
PTR | 指针记录 |
AAAA | IPv6 地址 |
AXFR | 全量传输 |
IXFR | 增量传输 |
③ 再看0x54d1响应包,8个字节的用户数据报文协议,46字节的域名解析响应,比查询包多16字节,也就是查询反馈内容。
Reply code(应答码):这个字段的值用来表示是否出现了错误,以及错误的类型。
Code (代码) | 描 述 |
0 | 没有错误 |
1 | 格式错误 |
2 | 服务器故障 |
3 | 域名错误 |
4 | 未使用 |
5 | 拒绝 |
Questions(问题):表示数据包中包含的查询数量。
Answers RRs(回答):表示对查询消息所作响应的数量。
Authority RRs(授权):表示响应消息中授权资源记录的数量。
Additional RRs(额外):表示响应消息中额外资源记录的数量。
Answer(回答):对查询消息所作的响应。响应消息也可以有很多个。
多个 DNS 查询
我们看到,在浏览器里输入网站地址后,DNS出现多对查询与响应消息,它们之间有什么不同呢?
① 由于响应消息往往包含了查询消息,这里我们就直接查看0xa105的响应包。前面0x43d1查询的是 fortinet.com ,而这个包查询的是www.fortinet.com,并且得到了三个响应。除了两个类型为A(主机地址)外,还有一个类型为CNAME(Canonical Name 规范名称),通常称别名指向,它可以将你注册的不同域名统统转到一个主域名上去!与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地址!
② 0xa105的响应包里有三个响应,两个直接得到了IP地址,另一个得到的是CNAME,我们在0x52c7里看到,再次查询了这个CNAME地址,得到两个与0xa105包相同的IP地址。
③ 0x46de的响应包可以看到,查询类询为AAAA,也就是IPv6地址,这里得到了一个IPv6地址。
④ 0xe14b的响应包可以看到,通过查询得到的CNAME,再次查询并得到两个IPv6地址。
⑤ 经过比较,0x71c1与我们最早分析的0x54d1查询和响应的信息完全一致。看上去象是查询了两次fortinet.com。
总结:
查询 fortinet.com 二次
查询 www.fortinet.com 一次
查询 fortinet.com IPv6 一次
查询 fortinet.com CNAME 一次
查询 fortinet.com CNAME IPv6 一次
DNS 查询报错
很多情况下输入的网址不对,查询不到IP,看看会怎么样。
① 这里我们将fortinet.com 的网址多加一个t,打不开网站。
② 查看抓取到的DNS响应包,可以看到响应编码是3,也就是域名错误。如果网卡指定了两个DNS服务器,在第一个DNS服务器查找不到的情况下,会自动到第二个DNS服务器查询。