DNS分析 I
报文分析
例子:
名称服务器(nameserver)地址为192.168.18.135。
该名称服务器管理了一个区域(zone),区域的名称为example.com.
。
环境中有一台用户终端,地址为192.168.18.136,其在名称服务器中添加了一条解析记录,记录为user.example.com,该记录的值为本机的地址。
1 | +----------------+ query +--------------------+ |
当用户在终端上将解析服务(reslover)的地址指向名称服务器(192.168.18.135)时,他就可以通过user.example.com这条域名来访问他的终端(192.168.18.136)
用户可以通过dig、host、ping等命令来发送dns报文,如:
1 | [root@user ~]# host user.example.com |
在名称服务器上抓包,第一条为dns的请求,其报文如下:
1 | 0000 00 0c 29 8f da 54 00 0c 29 75 2e c5 08 00 45 00 ..).ÚT..)u.Å..E. |
其中”aa 96 01 00 00 01 00 00 00 00 00 00 04 75 73 65 72 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01”为dns的报文信息。
DNS查询响应报文的格式如下:
1 | |<-- 16 -->|<-- 16 -->|(bit) |
根据上述格式分析dns的请求报文信息:
标识(ID)为”aa 96”
标志(FLAG)为随后的”01 00”,转化为bit为”00000001 00000000”,其格式如下:
1
2
3+-----+---------+-----+-----+-----+-----+-------+--------+
|QR(1)|opcode(4)|AA(1)|TC(1)|RD(1)|RA(1)|zero(3)|rcode(4)|
+-----+---------+-----+-----+-----+-----+-------+--------+QR:0表示查询报文,1表示响应报文。
opcode:0表示标准查询,1为反向查询,2为服务器状态请求,3暂无定义,4为通知(Notify),5为更新(Update),6-15暂无定义
AA:表示“授权回答(authoritative answer)”。该名字服务器是授权于该域的。
TC:表示“可截断的(truncated)”。使用UDP时,它表示当应答的总长度超过512字节时,只返回前512字节。
RD:表示“期望递归(recursion desired)”。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为 0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。在后面的例子中,我们将看到这两种类型查询的例子。
RA:表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1。在后面的例子中可看到大多数名字服务器都提供递归查询,除了某些根服务器。
zero:必须设置为0,预留给将来的需求
rcode:表示返回码,0为没有差错,1为格式错误,2为服务端失败,3为不存在的域名,4为无法执行,5为请求拒绝,6为域名异常存在(不应存在),7为解析记录异常存在(不应存在),8为解析记录异常不存在(应存在),9为名字服务器不能认证该请求区域,10为请求的域不在区域文件中
根据上述格式及含义,本条报文的标志部分的含义为:本报文为查询报文,非授权回答,不可截断,期望递归查询,返回码为没有差错。
问题数(QDCOUNT)”00 01”,为16bit整数,表示请求(requestiong section)中包含的查询实体,即有几条查询,默认为1条。本条报文问题数部分的含义为:包含了一条查询实体,即user.example.com。
资源记录数(ANCOUNT)”00 00”,为16bit整数,表示回答(answer section)中包含的资源记录数。本条报文资源记录数部分的含义为:并未包含任何资源记录(因为是查询报文)。
授权资源记录数(NSCOUNT)”00 00”,为16bit整数,表示授权记录(authority records section)中包含的名字服务数量。本条报文授权资源记录数部分的含义为:未包含任何授权资源记录数(因为是查询报文)。
额外资源记录数(ARCOUNT)”00 00”,为16bit整数,表示额外记录(additional records section)中资源记录的数量。本条报文额外资源记录数部分的含义为:未包含任意额外记录数(因为是查询报文)。
查询问题(QUESTIONs)”04 75 73 65 72 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01”,其格式如下:
1
2
3
4
5
6
7|<----- 32 ----->|
+----------------------------------+
| QNAME |
+-----------------+----------------+
| QTYPE | QCLASS |
+----------------------------------+
|<-- 16 -->|<-- 16 -->|
其中”04 75 73 65 72 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00”即表示查询名(QNAME),其格式如下:
1 | +--------+-+-+-+-+--------+-+-+-+-+-+-+-+--------+-+-+-+--------+ |
每个标识符首部为计数,表示了该标识符的长度,末尾的0表示根标识符。标识符最长为63字节,所以计数应在0-63之间。
查询类型(QTYPE)”00 01”,即1,表示A记录(域名=>主机号);
查询类(QCLASS)”00 01”,即1,表示IN类型;
第二条为dns名字服务器应答的报文信息,其报文如下:
1 | 0000 00 0c 29 75 2e c5 00 0c 29 8f da 54 08 00 45 00 ..)u.Å..).ÚT..E. |
其中”aa 96 85 80 00 01 00 01 00 01 00 01 04 75 73 65 72 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 12 88 c0 11 00 02 00 01 00 00 02 58 00 07 04 6e 73 30 31 c0 11 c0 3e 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87”为dns的报文信息
根据DNS查询响应报文格式,其中:
标识为(ID)”aa 96”。
标志为(FLAG)”85 80”,转化为bit为”10000101 10000000”,按照标志部分的格式分析:
1
2
3+-----+---------+-----+-----+-----+-----+-------+--------+
|QR(1)|opcode(4)|AA(1)|TC(1)|RD(1)|RA(1)|zero(3)|rcode(4)|
+-----+---------+-----+-----+-----+-----+-------+--------+本条报文的含义为:该报文为响应报文,属于标准查询,查询的名字服务器授权该域,本条报文不可截断,具有递归期望的并且是可递归的,返回码没有错误。
问题数(QDCOUNT)”00 01”,表示包含1条查询实体。
资源记录数(ANCOUNT)”00 01”,表示包含了1条资源记录。
授权资源记录数(NSCOUNT)”00 01”,表示包含了1条授权资源记录。
额外资源记录数(ARCOUNT)”00 01”,表示包含了1条额外资源记录。
查询问题(QUESTIONs)”04 75 73 65 72 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01”,与上一条查询报文中的查询问题含义一致
以下为资源记录部分,资源记录的格式为:
1
2
3
4
5
6
7
8
9
10
11
12|<-- 16 -->|<-- 16 -->|(bit)
+----------------+
| RNAME |
+----------------+----------------+
| RTYPE | RCLASS |
+----------------+----------------+
| RTTL |
+----------------+----------------+
| RDLENGTH | |
+----------------+ |
| RDATA |
+---------------------------------+回答(ANSWERs)”c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 13 88”,表示回答中的资源记录,其中域名(RNAME)”c0 0c”表示user.example.com;类型(RTYPE)”00 01”值为1,代表A类即主机号;类(RCLASS)”00 01”值为1,代表IN互联网;生存时间(RTTL)”00 00 02 58”,32bit整数,数值为”00000000 00000000 00000010 01011000”,转换为10进制即为600,单位为秒;资源数据长度(RDLENGTH)”00 04”,表示后面的资源数据的长度,此处为4,单位是字节;资源数据(RDATA)”c0 a8 12 88”,转换为bit为”11000000 10101000 00010010 10001000”,即为主机号192.168.18.136。
授权(AUTHORITYs)”c0 11 00 02 00 01 00 00 02 58 00 07 04 6e 73 30 31 c0 11”,表示授权中的资源记录,其中域名(RNAME)”c0 11”表示example.com;类型(RTYPE)”00 02”值为2,代表NS类即名字服务器;类(RCLASS)”00 01”值为1,代表IN互联网;生存时间(RTTL)”00 00 02 58”同8,为600秒;资源数据长度(RDLENGTH)”00 07”表示后面的资源数据长度为7字节;资源数据(RDATA)”04 6e 73 30 31 c0 11”,表示名字服务器地址ns01.example.com。
额外信息(ADDITIONALs)”c0 3e 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87”,表示额外信息中的资源记录,其中域名(RNAME)”c0 3e”表示ns01.example.com;类型(RTYPE)”00 01”,代表A类即主机号;类(RCLASS)”00 01”代表IN互联网;生存时间(RTTL)”00 00 02 58”为600秒;资源数据长度(RDLENGTH)”00 04”表示资源数据长度为4字节;资源数据(RDATA)”c0 a8 12 87”,为主机号192.168.18.135。
?:为什么用户可以向名字服务器发起查询请求及为什么名字服务器能够响应
域、区域与资源记录
dns服务维护了一个资源记录映射关系,每条资源记录都像一个键值对,如果这个映射中包含了用户请求的key,那么dns服务就能根据这个key返回给用户它对应的value。
这些映射关系包含在抽象的层级概念中,如域、区域、资源记录。
域(domain):域表示一个域名,带有层级特征,如顶级域.com、.org等,顶级域下可以设置二级域名,二级域名下又可以设置三级域名。
区域(zone):区域从是域表现的一个部分,带有范围特征,它描述的不是域的层级,而是域所管辖的范围。
域和区域的区别:
例子:
域(domain)example.com.,包含了一个三级域cloud.example.com.,以及两个资源记录user1.example.com和user2.example.com。对应的,需要有两个区域(zone)来管理example.com.和cloud.example.com.这两个域的范围,即user1.example.com和user2.example.com就需要在example.com.的区域信息中进行描述,而不是在cloud.example.com.的区域信息中描述。
区域文件示例:
1 | $TTL 600 |
其中SOA表示了区域授权的起始,它包含了名字服务器域名(mname)、区域负责人邮箱域名(rname)、序列号(serial)、刷新时间(refresh)、重试间隔(retry)、过期时间(expire)、最小ttl时间(minimun,bind8.2之后已由第一行的TTL代替)。
NS指名字服务器,表示在这个区域(如example.com.)中,ns01.example.com(即192.168.18.135)有权利回答所有dns查询请求,并且回答是最可靠的。如果一个区域中配置了多个名字服务器,如:
1 | $TTL 600 |
那么ns02将作为辅助服务器协同ns01工作,它也可以响应关于该区域的dns查询请求。
在一般的dns集群中,存在一个主名字服务器,一个或多个辅助名字服务器。主名字服务器的数据变更时,通过DNS区域信息传输协议(AXFR)将变更后的区域信息通知给每个与之相连的辅助名字服务器。在这个过程中,需要依赖SOA给出的信息,如序列号,该值是辅助名字服务器判断是否与主名字服务器同步的标志。
资源记录(resource records):域是由域名的集合组成并描述的;资源记录表征了域名与其所对应的资源。在这个集合中,域名的顺序并不重要。
一般情况下,资源记录具有以下几个属性:
属主(owner):表示这个资源记录属于哪个域
类型(type):
1 | 类型 值 含义 |
类(class):
1 | 类 值 含义 |
存活时间(TTL);
资源数据(RDATA):对于A类型,资源数据为一个32位IP地址;CNAME的资源数据是一个域名;MX的资源记录是一个16位首选值加上用作邮件服务器的主机名;NS的资源数据是一个主机名;PTR的资源数据是一个域名;SOA的资源记录是一段包含SOA各个属性的授权信息。
?:区域之间是怎么交换信息的
DNS通信
dns可以使用udp及tcp来进行通信,使用的端口都是53。
dns使用udp的原因:dns的主要工作场景在于处理来自解析器的dns查询请求以及对其的反馈,udp的传输速度快,对系统资源的开销小,非常适合这种场景。
dns使用tcp的原因:当使用udp传输数据时,数据被限制在512字节内,超过512字节,数据将被截断(设置TC标志)。当解析器得到的反馈报文中TC标志设置为1时,它会认为这个报文的数据超过512字节限制,那么它将重发一次请求,这个时候就需要用tcp来进行重传(udp也可以进行重传)。此外,区域信息传输的过程中,同样需要使用tcp来传输这些数据。
AXFR:授权转移(Authoritative Transfer),用于传输区域(zone)的信息。AXFR应答报文由一系列(包含1)DNS报文组成,其中第一条报文及最后一条报文需要包含区域的SOA资源记录,中间的报文为该区域(zone)的资源记录信息,如可以包含NS类、A类、CNAME类记录等。
用户可以通过dig命令向名字服务器发起AXFR请求,如:
1 | [root@user ~]# dig @192.168.18.135 example.com. AXFR |
以下为AXFR请求报文:
1 | 0000 00 0c 29 8f da 54 00 0c 29 75 2e c5 08 00 45 00 ..).ÚT..)u.Å..E. |
其中”00 28 a9 0d 00 20 00 01 00 00 00 00 00 01 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 fc 00 01 00 00 29 10 00 00 00 00 00 00 00”为dns报文信息。
- 首部”00 28”表示这段报文的长度
- 标识为”a9 0d”
- 标志为”00 20”,转换为bit为”00000000 00100000”,其格式如下:此处的含义为,该报文为请求报文,是标准查询,非授权回答,是不可截断的,是不期望递归的,是无可用递归查询的,返回码无差错。
1
2
3+-----+---------+-----+-----+-----+-----+-------+--------+
|QR(1)|opcode(4)|AA(1)|TC(1)|RD(1)|RA(1)|zero(3)|rcode(4)|
+-----+---------+-----+-----+-----+-----+-------+--------+ - 随后的”00 01 00 00 00 00 00 01”分别表示问题数、回答中包含的资源记录数、授权资源记录数、额外资源记录数,每个片段有16位。此处的含义为,含有一个请求以及一个额外资源记录。
- 查询问题”07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 fc 00 01”。其中”07 65 78 61 6d 70 6c 65 03 63 6f 6d 00”为请求的域名(example.com),其格式如下:之后的”00 fc”为查询类型,转换为十进制数为252,即为AXFR;末尾的”00 01”表示查询类,即”IN”。
1
2
3+--------+-+-+-+-+-+-+-+--------+-+-+-+--------+
|7(count)|e|x|a|m|p|l|e|3(count)|c|o|m|0(count)|
+--------+-+-+-+-+-+-+-+--------+-+-+-+--------+ - 额外信息”00 00 29 10 00 00 00 00 00 00 00”,表示此处为一条OPT记录,其详情可以参考RFC 2671。
以下为AXFR应答报文:
1 | 0000 00 0c 29 75 2e c5 00 0c 29 8f da 54 08 00 45 00 ..)u.Å..).ÚT..E. |
其中”00 b4 a9 0d 84 00 00 01 00 06 00 00 00 00 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 fc 00 01 c0 0c 00 06 00 01 00 00 02 58 00 1d 04 6e 73 30 31 c0 0c c0 0c 00 00 00 00 00 01 51 80 00 00 0e 10 00 09 3a 80 00 00 2a 30 c0 0c 00 02 00 01 00 00 02 58 00 02 c0 29 06 6d 61 73 74 65 72 c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87 c0 29 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87 04 75 73 65 72 c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 12 88 c0 0c 00 06 00 01 00 00 02 58 00 18 c0 29 c0 0c 00 00 00 00 00 01 51 80 00 00 0e 10 00 09 3a 80 00 00 2a 30”为dns报文信息。
- 首部”00 b4”表示这段报文的长度
- 标识为”a9 0d”
- 标志为”84 00”,转换为bit为”10000100 00000000”,其格式如下: 此处的含义为,该报文为应答报文,是标准查询,是授权回答,是不可截断的,是不期望递归的,是无可用递归查询的,返回码为无差错。
1
2
3+-----+---------+-----+-----+-----+-----+-------+--------+
|QR(1)|opcode(4)|AA(1)|TC(1)|RD(1)|RA(1)|zero(3)|rcode(4)|
+-----+---------+-----+-----+-----+-----+-------+--------+ - 随后的”00 01 00 06 00 00 00 00”分别表示问题数、回答中包含的资源记录数、授权资源记录数、额外资源记录数,每个片段有16位。此处的含义为,含有一个请求以及应答中包含六条资源记录数。
- 之后的”07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 fc 00 01”表示查询内容,其中”07 65 78 61 6d 70 6c 65 03 63 6f 6d 00”为查询的域名,其格式如下: 之后的”00 fc”为查询类型,转换为十进制数为252,即为AXFR;末尾的”00 01”表示查询类,即”IN”。
1
2
3+--------+-+-+-+-+-+-+-+--------+-+-+-+--------+
|7(count)|e|x|a|m|p|l|e|3(count)|c|o|m|0(count)|
+--------+-+-+-+-+-+-+-+--------+-+-+-+--------+ - 之后的全部报文为AXFR的应答信息:
- 第一条资源记录是SOA记录,它的报文为”c0 0c 00 06 00 01 00 00 02 58 00 1d 04 6e 73 30 31 c0 0c c0 0c 00 00 00 00 00 01 51 80 00 00 0e 10 00 09 3a 80 00 00 2a 30”。由域名”c0 0c”(example.com)、类型”00 06”(SOA)、类”00 01”(IN)、生存时间”00 00 02 58”(600秒)、资源数据长度”00 1d”(29字节)、主名字服务器”04 6e 73 30 31 c0 0c”(ns01.example.com)、区域责任人邮箱”c0 0c”(example.com)、序列号”00 00 00 00”(0)、刷新时间”00 01 51 80”(86400秒,即1天)、重试间隔”00 00 0e 10”(3600秒,即1小时)、过期时间”00 09 3a 80”(604800秒,即7天)、最小TTL时间”00 00 2a 30”(10800秒,即3小时)组成。
- 第一条资源记录是NS记录,它的报文为”c0 0c 00 02 00 01 00 00 02 58 00 02 c0 29”。由域名”c0 0c”(example.com)、类型”00 02”(NS)、类”00 01”(IN)、生存时间”00 00 02 58”(600秒)、资源数据长度”00 02”(2字节)、资源记录”c0 29”(ns01.example.com)组成。
- 第三条资源记录是A记录,它的报文为”06 6d 61 73 74 65 72 c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87”。由域名”06 6d 61 73 74 65 72 c0 0c”(master.example.com)、类型”00 01”(A)、类”00 01”(IN)、生存时间”00 00 02 58”(600秒)、资源数据长度”00 04”(4字节)、资源记录”c0 a8 12 87”(192.168.18.135)组成。
- 第四条资源记录是A记录,它的报文为”c0 29 00 01 00 01 00 00 02 58 00 04 c0 a8 12 87”。由域名”c0 29”(ns01.example.com)、类型”00 01”(A)、类”00 01”(IN)、生存时间”00 00 02 58”(600秒)、资源数据长度”00 04”(4字节)、资源记录”c0 a8 12 87”(192.168.18.135)组成。
- 第五条资源记录是A记录,它的报文为”04 75 73 65 72 c0 0c 00 01 00 01 00 00 02 58 00 04 c0 a8 12 88”。由域名”04 75 73 65 72 c0 0c”(user.example.com)、类型”00 01”(A)、类”00 01”(IN)、生存时间”00 00 02 58”(600秒)、资源数据长度”00 04”(4字节)、资源记录”c0 a8 12 88”(192.168.18.136)组成。
- 最后一条资源是SOA记录,它的报文与第一条是一致的。
IXFR:增量区域传输(Incremental Zone Transfer),与AXFR一样用于传输区域(zone)的信息,但只传输增量数据。主要用于DNS NOTIFY。
NOTIFY:用于Master向Slave通知区域信息变更。默认使用udp传输,Master可以指定使用tcp传输。区别是,tcp方式只发送一次notify,超过响应等待时间后返回超时;而udp方式会定期发送notify,直到发送了过多的副本(即超时)或者收到了对应的回复。
例子:
Master与Slave之间使用DNS NOTIFY机制同步数据过程
1 | +---------------------+ 1.notify(query) +---------------------+ |
- 当Master区域信息变更后,向Slave发起notify的请求
- Slave响应notify请求
- Slave向Master请求SOA信息
- Master应答SOA请求
- Slave根据自己的SOA序列号以及由Master处请求到的SOA序列号,判断自己是否需要变更(注:如果双发的SOA序列号一致,那么即使区域信息是有区别的,Slave也不会向Master发起更新请求),如果需要变更,则向Master发起IXFR请求,期望同步区域信息到Master的那个版本
- Master应答了Slave的IXFR请求,返回了两个版本区域信息的增量记录