# DNS全解析
# 一.DNS来源
最开始世界上的机器比较少,使用host文件来解析就够了。
到后来机器变的多了,改用由中心服务器统一更新host文件,各地的机器通过ftp从中心服务器更新host文件到本地
再到后来,机器更多了,只由中心服务器来更新host文件也力不从心了,于是改成分布式的,并逐渐演化到了今天的DNS系统
# 二.DNS服务器分类
与域名对应,分根域名服务器,顶级域名服务器和权威服务器。作用如下
类别 | 作用 |
---|---|
根域名服务器 | 只关心所有顶级域名服务器的域名和IP地址 |
顶级域名服务器 | 自己的顶级域名下的所有二级域名和地址 |
权威域名服务器 | 负责自己区域的所有域名和地址(一主多备) |
# 1.根域名服务器
根域名服务器只记录所有顶级域名服务器的域名和IP地址。比如它们只记录.cn,.com等这些顶级域名的服务器的解析。
全球有13组根域名,从a.root-servers.net 到m.root-servers.net。注意是根域名,不是根域名服务器。全世界各地都有根域名服务器,国内的话北京和上海有。根域名的分布可以在www.root-servers.org查看。
根域名是最重要,最关键
# 2.顶级域名服务器
顶级域名服务器只负责自己的顶级域名解析。比.cn的顶级域名,它只解析和.cn相关的域名,并且只解析到xxx.cn
# 3.权威域名服务器
权威域名服务器就是负责具体的域名解析了。比xiaoxiaoguo.cn就有一台权威域名服务器,它只解析和xiaoxiaoguo.cn相关的域名。
# 4.本地域名服务器
还有种dns服务器叫本地域名服务器(也可能有其他叫法),它不属于上面任何一种。但它也解析域名,如家用路由器上的192.168.1.1,114.114.114.114或者一些运营商的dns。本地域名服务器发挥了很大的作用,分担了整个dns系统的压力。
# 三.DNS记录
主要了解A记录,4A记录,MX记录,CNAME记录, NS记录即可。
# 四.DNS解析过程
当我们去解析一个域名时,比如解析xiaoxiaoguo.cn,会经过如下步骤:
- 查看本机的缓存有无该域名记录,如果没有,查看本机的host文件有无该域名记录,如果没有,则发个请求到本地DNS服务器。
- 本地DNS服务器收到请求后,查看是否有该域名的解析,如果有,返回解析记录给主机,如果没有,则请求根域名服务器
- 根域名服务器收到请求后,返回该域名对应的顶级域名服务器,比如这次请求返回.cn的服务器地址
- 本地域名服务器接到顶级域名服务器地址后,向该顶级域名服务器请求
- 顶级域名服务器返回该域名的权威服务器地址,比如这次返回xiaoxiaoguo.cn对应的权威服务器地址
- 本地域名服务器获得该地址后,发请求到该域名的权威服务器。
- 权威服务器返回该域名对应的解析。
- 本地域名服务器获取该解析后,返回给主机,解析完成。
这里可能会有个疑问:本地DNS服务器是怎么知道根域名服务器的地址?如果安装了bind服务,可以看到默认有个name.ca的文件,里面记录了13组根域的解析。所以本地域名服务器默认就有根域的解析。
# 五.DNS报文结构
现在的DNS主要还是通过UDP来通讯,大小不超过1500个字节。报文结构如下:
+--+--+--+--+--+--+--+
| Header |
+--+--+--+--+--+--+--+
| Question |
+--+--+--+--+--+--+--+
| Answer |
+--+--+--+--+--+--+--+
| Authority |
+--+--+--+--+--+--+--+
| Additional |
+--+--+--+--+--+--+--+
按格式来区分的话,可以分为三部分:头部Header,查询部分Question,应答部分:Answer,Authority,Additional
# 1.头部Header
报文格式如下
Header format
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
各字段作用如下
ID: 2个字节(16bit),标识字段,客户端会解析服务器返回的DNS应答报文,获取ID值与请求报文设置的ID值做比较,如果相同,则认为是同一个DNS会话。
FLAGS: 2个字节(16bit)的标志字段。包含以下属性:
QR: 0表示查询报文,1表示响应报文;
opcode: 通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求),[3,15]保留值;
AA: 表示授权回答(authoritative answer)– 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器;
TC: 表示可截断的(truncated)–用来指出报文比允许的长度还要长,导致被截断;
RD: 表示期望递归(Recursion Desired) – 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的;
RA: 表示支持递归(Recursion Available) – 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询;
Z : 保留值,暂未使用;
RCODE: 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:
0 : 没有错误。
1 : 报文格式错误(Format error) - 服务器不能理解请求的报文;
2 : 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求;
3 : 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在;
4 : 没有实现(Not Implemented) - 域名服务器不支持查询类型;
5 : 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答.比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer);
[6,15] : 保留值,暂未使用。
QDCOUNT: 无符号16bit整数表示报文请求段中的问题记录数。
ANCOUNT: 无符号16bit整数表示报文回答段中的回答记录数。
NSCOUNT: 无符号16bit整数表示报文授权段中的授权记录数。
ARCOUNT: 无符号16bit整数表示报文附加段中的附加记录数。
# 2.Question 查询字段
报文格式如下:
Question format
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ... |
| QNAME |
| ... |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
各字段作用如下
QNAME 8bit为单位表示的查询名(广泛的说就是:域名).
QTYPE 无符号16bit整数表示查询的协议类型.
QCLASS 无符号16bit整数表示查询的类,比如,IN代表Internet.
# 3.应答部分Answer/Authority/Additional
它们的结构如下
Answer/Authority/Additional format
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NAME |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDATA |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
各字段作用如下
NAME 资源记录包含的域名.
TYPE 表示DNS协议的类型.
CLASS 表示RDATA的类.
TTL 4字节无符号整数表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。
RDLENGTH 2个字节无符号整数表示RDATA的长度
RDATA 不定长字符串来表示记录,格式根TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。
对这部分,可以通过wireshark等抓包软件抓个包看看,抓包的过程就不赘述了。
# 六.搭建DNS服务器
参考:http://blog.csdn.net/u012375924/article/details/50779891