1 域名解析过程
域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址或者别名等。从下面对jocent.me
进行域名解析的报文中可明显看出这两大步骤。注意:第一个步骤从主机到本地域名服务器是递归查询;第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的,详情见下面的流程分析(本地服务器向根域名服务器,顶级域名服务器,二级域名服务器,权限域名服务器(一般由公司企业提供解析)等DNS迭代查询)。
其具体的流程可描述如下:
- 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
- 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
- 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器
dns.me
的IP地址 - 本地域名服务器向顶级域名服务器
dns.me
进行查询 - 顶级域名服务器
me
告诉本地域名服务器,下一步查询权限服务器dns.jocent.me
的IP地址 - 本地域名服务器向权限服务器
dns.jocent.me
进行查询 - 权限服务器
dns.jocent.me
告诉本地域名服务器所查询的主机的IP地址 - 本地域名服务器最后把查询结果告诉 10.74.36.90
其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:
- 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
- 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询
2 DNS数据包格式
2.1 头部
- 会话标识ID(2字节):是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。用于划分DNS流(一个请求对应一个响应)。
- 标志(2字节):
QR(1bit) 查询/响应标志,0为查询,1为响应 Response: Message is a response opcode(4bit) 4个比特位用来设置查询的种类,应答的时候会带相同值,
0 标准查询 (QUERY)
1 反向查询 (IQUERY)
2 服务器状态查询 (STATUS)
3-15 保留值,暂时未使用
Opcode: Standard query (0) AA(1bit) 表示授权应答 Authoritative Answer
应答的时候有意义,指出给出应答的服务器是查询域名的授权解析服务器。注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。
1标识域名服务器是授权服务器。
Authoritative: Server is not an authority for domain TC(1bit) 表示截断 TrunCation
用来指出报文比允许的长度还要长,导致被截断。仅当DNS报文使用UDP服务时使用。因为UDP数据包有长度限制,当长度过长时会被截断。
1标识DNS报文长度超过512字节,并被截断。
Truncated: Message is not truncated RD(1bit) 表示期望递归 Recursion Desired
这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。
1标识执行递归查询,即DNS服务器无法解析某一个主机名,则它向其它DNS服务器继续查询,如此反复,直到它解析到目标主机名并返回给客户端。0标识迭代查询,即DNS服务器无法解析目标主机时,它将查询到的其它DNS服务器的IP地址返回给客户端,供客户端进行参考。
Recursion desired: Don't do query recursively RA(1bit) 表示支持递归 Recursion Available
这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。允许递归标识。此字段在应答字段中使用,1标识DNS服务器支持递归查询。
Recursion available: Server can't do recursive queries 保留字段,暂时未使用。在所有的请求和应答报文中必须置为0。 Z: reserved (0) 应答认证:应答/权限部分未由服务器进行认证 Answer authenticated: Answer/authority portion was not authenticated by the server 未经认证的数据:不可接受 Non-authenticated data: Unacceptable rcode(4bit) 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:
0 没有差错。
1 报文格式错误(Format error) - 服务器不能理解请求的报文。
2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。
3 名字差错(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。
4 没有实现(Not Implemented) - 域名服务器不支持查询类型。
5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。
6-15 保留值,暂时未使用。
Reply code: No error (0) - 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量。
问题数QDCOUNT 无符号16位整数表示报文请求段中的问题记录数。
资源记录数ANCOUNT 无符号16位整数表示报文回答段中的回答记录数。
授权资源记录数NSCOUNT 无符号16位整数表示报文授权段中的授权记录数。
额外资源记录数ARCOUNT 无符号16位整数表示报文附加段中的附加记录数。
2.2 正文
2.2.1 Queries区域
(1)查询名 QNAME 要查找的名字,是一个或多个标识符的序列,长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名)。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。单个标识符最大长度为63字节。一般的格式如下图所示。
(2)查询类型 QTYPE 每个问题有一个查询类型。2个字节表示查询类型,取值可以为任何可用的类型值,以及通配码*来表示所有的资源记录。
类型 | 助记符 | 说明 |
1 | A | 由域名获得IPv4地址 |
2 | NS | 查询授权的域名服务器 |
5 | CNAME | 查询规范名称(别名) |
6 | SOA | 开始授权 |
11 | WKS | 熟知服务 |
12 | PTR | 把IP地址转换成域名(指针记录,反向查询) |
13 | HINFO | 主机信息 |
15 | MX | 邮件交换记录 |
28 | AAAA | 由域名获得IPv6地址 |
252 | AXFR | 对区域转换的请求,传送整个区的请求。 |
255 | ANY | 对所有记录的请求 |
其他QTYPE类型有
MD 3 a mail destination (Obsolete - use MX)
MF 4 a mail forwarder (Obsolete - use MX)
SOA 6 marks the start of a zone of authority
MB 7 a mailbox domain name (EXPERIMENTAL)
MG 8 a mail group member (EXPERIMENTAL)
MR 9 a mail rename domain name (EXPERIMENTAL)
NULL 10 a null RR (EXPERIMENTAL)
WKS 11 a well known service description
MINFO 14 mailbox or mail list information
TXT 16 text strings (常用夹带其他数据比如C&C和文件,用于建立隧道)
查询类型出现在问题字段中,查询类型是类型的一个超集,所有的类型都是可用的查询类型
AXFR 252 A request for a transfer of an entire zone
MAILB 253 A request for mailbox-related records (MB, MG or MR)
MAILA 254 A request for mail agent RRs (Obsolete - see MX)
255 A request for all records
这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/
(3)查询类:通常为1,表示IN,表明是Internet数据。
IN (1) 指互联网地址。
CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
CH 3 the CHAOS class
HS 4 Hesiod [Dyer 87]
查询类是类的一个超集
* 255 any class
2.2.2 资源记录(RR)区域(包括回答区域,授权区域和附加区域)
该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域
(1) 域名NAME(2字节或不定长):它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C
(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。
(2) 查询类型TYPE :表明资源纪录的类型,见2.2.1节的查询类型表格所示。指出RDATA数据的含义
(3)查询类CLASS :对于Internet信息,总是1,代表IN。表示RDATA的类
(4)生存时间(TTL):4字节无符号整数表示资源记录可以缓存的时间。以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。0代表只能被传输,但是不能被缓存。
(5) 资源数据长度:URDLENGT**H 2个字节无符号整数表示RDATA的长度
(6)资源数据 RDATA 该字段是一个可变长字段,不定长字符串来表示记录,格式与TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。
注意:
为了减小报文,域名系统使用一种压缩方法来消除报文中域名的重复。使用这种方法,后面重复出现的域名或者labels被替换为指向之前出现位置的指针。优点:节约了空间,降低报文的容量;避免数据包截断;保证了数据的一致性。缺点:但是需要所有的程序都应该能够理解收到的报文中包含的指针。
以上截断概念重申:
仅当DNS报文使用UDP服务时使用截断标识和功能。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断。当然基于TCP的DNS数据包不存在此问题。