DNS服务器

DNS服务器

DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器,使用UDP和TCP 的53端口。DNS服务器是C/S架构,服务器完成将主机名和域名转换为IP地址的工作。

“本文将主要介绍DNS报文的格式,以及通过wireshark观察DNS报文来进行学习。”

信息来源

以下内容记录在RFC1035

报文格式

dns请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:

    +---------------------+
    |        Header       | 报文头                   // 报文头格式 1.1 节
    +---------------------+
    |       Question      | 要查询的问题             // 问题格式 1.2 节
    +---------------------+
    |        Answer       | 服务器的应答             // 后三种信息统一格式 1.3 节
    +---------------------+
    |      Authority      | 权威的应答
    +---------------------+
    |      Additional     | 附加信息
    +---------------------+

Header段定义了Request/Response,以及其它一些信息;
Question段描述了查询问题;
Answer段包含了对问题的回复信息。

1.1 Header格式

 0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       |  客户端设置16bit ID,服务器响应时应一致
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |  一些状态字,在下面详细讨论
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QDCOUNT                    |  表示报文请求段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ANCOUNT                    |  表示报文回答段的数目 
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                       
|                    NSCOUNT                    |  报文授权段的数目     
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ARCOUNT                    |  报文附加段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

字段的解释:
ID:唯一标识了某个请求与对应的应答
QR :字段 1bit区分请求(0),应答(1)。
OPCODE : 4 bit 设置查询的种类,具体意义如下表所示

含义
0 标准查询
1 反向查询
2 服务器状态查询
3-15 保留

AA :授权应答,在应答报文中代表这是一个从授权解析服务器中查询到的应答。
TC :截断,指出报文比允许的长度还要长,导致被截断。
RD :递归,请求时设置,期望DNS服务器进行递归的查询。
RA :递归可用,响应时服务器设置,表示本服务器是否支持递归。
Z :3 bit 预留位,设置为0
RCODE:3 bit 应答码,具体意义如下表

含义
0 没有错误
1 报文格式错误
2 服务器错误,无法处理该请求
3 解析的域名错误
4 没有实现,域名服务器不支持该查询种类
5 拒绝,服务器因为某种策略拒绝给出应答
6-15 保留

QDCOUNT:表示报文请求段的数目,该请求包含几个问题
ANCOUNT:表示报文回答段的数目,该响应报文包含了几个问题的回答
NSCOUNT:表示包含的授权记录数
ARCOUNT:表示附加段记录数

1.2 Question格式

 0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |   
/                     QNAME                     /
/                                               /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     QTYPE                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     QCLASS                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Question包含了client向server提出的问题,
QNAME:包含请求的域名,格式为1字节长度加对应字节数据,举例来说若要查询www.baidu.com对应的IP,那么这个地方应该插入03 77 77 77(代表有3个字母,是www,自动以.分隔),05 62 61 69 64 75(代表baidu,以.分隔),之后 03 63 6f 6d(代表com)结尾处添加一个00表示QNAME结束。

QTYPE:表示查询类型,类型有如下

类型 值和含义
A 1 a host address
NS 2 an authoritative name server
MD 3 a mail destination (Obsolete – use MX)
MF 4 a mail forwarder (Obsolete – use MX)
CNAME 5 the canonical name for an alias
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
PTR 12 a domain name pointer
HINFO 13 host information
MINFO 14 mailbox or mail list information
MX 15 mail exchange
TXT 16 text strings
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

QCLASS:表示查询的协议

类型 值和含义
IN 1 the Internet
CS 2 the CSNET class (Obsolete – used only for examples in some obsolete RFCs)
CH 3 the CHAOS class
HS 4 Hesiod [Dyer 87]

常见的QTYPE为A,QCLASS为IN表示查询IP地址

1.3 Resource record格式
后三种报文,应答/授权/附加段统一格式,每种段包含的个数由头部对应的COUNT确定,资源计入格式如下:

  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                                               /  		// 记录包含的域名
/                      NAME                     /
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      TYPE                     |       // 记录的类型  
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     CLASS                     |       // RDATA的类
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      TTL                      |       // 表示该记录能够进行缓存的时间,
|                                               |       // 0表示不能缓存
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   RDLENGTH                    |       //  RDATA的长度
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/                     RDATA                     /       //  RDATA不定长数据,
/                                               /       //  根据TYPE与CLASS指定含义
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

具体实例

本机ping www.baidu.com会先进行DNS请求,具体如下
DNS请求
响应报文如下
响应报文

域名解析过程

从上到下依次进行查询,查到为止。

  1. 先在本地host文件中查找对应关系
  2. 若无则在本地DNS缓存是否存在这个关系
  3. 通过配置的TCP/IP中的DNS服务器进行查询
    –> 假如由该DNS服务器解析:权威解析
    –> 如果不由该DNS服务器解析,但该服务器缓存了映射关系:不具有权威性

在向DNS服务器进行查询过程中有两种模式:
递归模式: 假如DNS服务器不存在该地址,DNS服务器会向下一级DNS服务器进行询问,直到找到该地址或者确认无法找到,则向client返回该结果。
迭代模式: DNS服务器不存在该地址,向client返回下一级DNS服务器的地址,让client自己去进行查找。

张贴在2