zoukankan      html  css  js  c++  java
  • 学习:DNS协议分析

    DNS服务:采用服务器/客户端(C/S)的方式工作。当客户端程序要通过一个主机名称访问网络中的一台主机时,它首先需要得到这个主机名称所对应的IP地址,此时就需要用到DNS,来进行域名转换为网络地址的作用

    进行DNS服务查询之前,会先进行系统DNS缓存 > HOSTS文件,然后会请求 DNS服务器中的缓存,如果没有就开始迭代DNS查询

    win查询dns缓存:ipconfig/displaydns

    win清除dns缓存ipconfig/flushdns


    DNS报文格式:

    首先看看Header段中每个字段的含义:

    DNS ID号(DNS ID Number): 用来对应DNS查询和DNS响应
    
    查询/响应(Query/Response, QR): 用来指明这个报文是DNS查询还是响应,占1个比特位。为1代表响应,0代表查询
    
    操作代码(OpCode):用来定义消息中请求的类型
    
    权威应答(Authoritative Answer, AA):这个比特位在响应的时候才有意义。则说明这个响应是由域内权威域名服务器发出的
    
    截断(Truncation, TC):用来指出报文比允许的长度还要长,导致被截断
    
    期望递归(Recursion Desired, RD):如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。
    
    支持递归(Recursion Available, RA): 当响应中设定了这个值,说明域名服务器支持递归查询
    
    保留(Z): 未使用,用0表示
    
    响应代码(Response  Code): 在DNS响应中指明错误,占4个比特位。
    
    问题计数(Question Count): 问题区段中的问题记录数
    
    回答计数(Answer Count):回答区段中的回答记录数
    
    域名服务计数(Name Server Count):权威区段中的记录数
    
    额外记录数(Additional  Records Count):在额外信息区段中的记录数
    
    问题区段(Question Section):包含有被发送到DNS服务器的一条或者多条信息
    
    回答区段(Answer Section):含有用来回答查询的一条或者多条资源记录
    
    权威区段(Authority Section):包含权威域名服务器的资源记录
    
    额外信息区段(Additional Information Section): 包含资源记录且大小可变的区段。
    

    分析数据包:

    DNS请求数据包:

    DNS应答数据包:

    需要注意的是:上面的抓到的只是客户端与DNS服务器114.114.114.114之间的递归查询,DNS服务器114.114.114.114还进行了之后的迭代查询

    1、递归查询

    客户计算机向本地域名服务器的查询一般采用的是递归查询。如果客户机所询问的本地域名服务器无法提供被查询域名的IP地址,那么本地域名服务器就会以DNS客户的身份,向其它根域名服务器继续发出查询请求的报文。

    2、迭代查询

    本地域名服务器向根域名服务器的查询通常采用的是迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求的报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器“下一步应该向哪个域名服务器进行查询”。然后本地域名服务器就进行后续的查询。

    使用wireshark走一遍流程,机器为ubuntu,用linux的dig命令来进行查询下dig www.adexx.xyz +trace

    ubuntu向本地DNS服务器发送请求,向根域服务器的ns记录

    返回信息如下:

    然后向其中的DNS服务器的A记录(自己抓包发现还有请求AAAA的记录)

    都拿到了A记录和AAAA记录之后,又向其中DNS服务器的A记录进行DNS查询www.adexx.xyz的A记录

    返回包中,它会返回xyz域的ns记录

    然后挑选其中的一条记录z.nic.xyz,请求dns请求A记录

    返回包中,它会返回z.nic.xyz的A记录

    然后请求其IP,尝试获取www.adexx.xyz的A记录

    返回包中却返回了其他服务器的ns记录

    然后又继续请求其中的dns服务器(ns记录),请求它的A记录

    然后请求dns服务器的A记录,询问www.adexx.xyz的A记录

    最后该dns服务器返回www.adexx.xyz的A记录

    总结:

    1、客户端先去向本地DNS服务器请求 根域的NS记录

    2、本地DNS服务器查询完之后,向客户端返回了根域的NS记录

    3、然后客户端会向本地DNS服务器请求---->这些根域的NS记录中的DNS服务器的A记录

    4、本地DNS服务器返回给客户端---->这些根域的NS记录中的DNS服务器的A记录

    5、接着客户端就开始向这些DNS服务器请求指定的域名www.adexx.xyz的A记录

    ....接着就如上的操作,返回类似.xyz的域名的ns记录 ----> 这些.xyz域的NS记录中的DNS服务器的A记录

  • 相关阅读:
    mysql----show slave status G 说明
    mysqldump 的方式来搭建master-->slave 的复制架构
    C++----练习--string 从文件中一个一个单词的读直到文件尾
    python 全排列combinations和permutations函数
    什么是restful api
    git知识点
    Hash算法解决冲突的方法
    python之单例设计模式
    Linux常用命令大全
    SQLAlchemy中时间格式化及将时间戳转成对应时间的方法-mysql
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12293596.html
Copyright © 2011-2022 走看看