接上篇,我们知道每个域需要指定主机来实现dns服务的功能,所以有类似以下字段:
baidu.com. NS ns.baidu.com. (指定哪个主机实现管理域名服务器功能)
ns.baidu.com. A 1.1.1.1 (这个主机在哪个位置)
实际上ns.baidu.com A 1.1.1.1 这条记录在本机是可以不用指定的,因为真正授权是在上级指定的,也就是说以上两条记录应该在com这个域的域名数据库中指定,当然本机自身也要知道自己是谁,所以需要第一条记录,而既然本机可以成为ns服务器,说明本机的ip就是com指定的ip,所以第二条记录可以不要,之所以写上去是为了防止有人解析ns服务器的主机名A记录,此时我们需要返回结果。
dns是如此的重要,万一dns服务器挂掉,会造成很多域名无法解析。所以,为了防止一台单点故障导致dns服务无法使用,所以dns服务提供主从服务。当然dns也允许单机工作,根据它们功能的不通可以分为以下几种类型:
主域名服务器:主域名工作在主从模式下,在这个模式下dns可以在任意节点上解析,但是对dns的修改必须在主域名服务器上
从域名服务器:从服务器提供dns解析功能,它的数据来源于主域名服务器的拷贝,从服务器定时像主服务器请求更新数据文件。
缓存域名服务器(caching only server):如果一个dns服务器本身不管理任何域,但是它可以把它收到的信息存储下来,并提供给别人解析,那么这就是一个缓存dns服务器
转发服务器(forwarding server):如果一个dns服务器既不管理某个域也不解析任何dns,只为主机转发dns请求,那么这就是一个转发服务器。
DNS的主从工作原理:
dns主从服务器同时对外提供服务,所以要时刻保持数据的一致。为此,当主dns服务器数据库更新的时候从服务器必须到主服务器上cp数据到本地更新。但是从服务器怎么知道数据库改变了呢?它是这样子的:
主服务器和从服务器中都记录一个序列号(serial number),因为所有的更新必须在主dns服务器上操作,所以每次更新dns数据库的时候,主dns就在序列号上+1,这样子,当从服务器发来查看更新请求时,对比下序列号,就可以知道自己是否需要更新。
那么,从服务器什么时候来检查是否更新呢?
同样地,dns服务器记录一个刷新时间(refresh time),每隔这个时间从服务器来检查一次更新。然而更新过程中可能因为网络故障等问题无法联系上主dns服务器,这个时候,如果主dns刚好更新数据库,而我们又因为更新失败而等待下一次更新时间的话,那么dns缓存过期就会带来长时间的解析错误,这是我们不愿意看到的,所以dns服务器还定义了一个重试时间(retry time),定义当请求更新失败时,重新发起请求的时间间隔。所以一般这个时间比刷新时间小得多。但是,如果主dns服务器已经挂了,从服务器会一直请求更新失败,那么这个时候就需要一个标准来认定主dns挂了,这个就是过期时间(expire time),当超过这个时间,从服务器会认为主服务器挂掉,然后从服务器自己也停止提供服务(这个是听说的额,我自己一直以为从服务器会替代主服务器,下一篇实战测试下)
所以一个dns服务器的数据库会包含以下信息:
序列号(serial number)
刷新时间(refresh time)
重试时间(retry time)
超时时间(expire time)
否定回答超时时间(negative answer ttl)
事实上,它还需定义否定回答的超时时间,因为这个在资源记录中没有定义
资源记录(resource record RR):
我们把dns数据库中每一个条目称作一个资源记录(resource record RR)
我们知道,dns是用来做名称解析的,所以一个资源必须包含要解析的对象(name)和解析出来的结果(value)
我们还知道,以为缓存的关系,所以解析出来的结果需要一个过期时间,所以资源记录还需要ttl(time to live)值
有时我们需要把域名转化为ip,有时又相反,这是两种不同的过程,所以资源记录还需要类型(rrt resource record type)
所以一个资源记录格式大概如下:
NAME [ttl] IN RRT VALUE
N表示这是一个一个INTERNET的DNS资源记录,ttl加[]是因为,当所有的RR都有功能的TTL值的时候,我们可以把TTL值写在最上面,变成如下形式:
TTL 600;
NAME IN RRT VALUE
那么资源记录有什么类型呢?常见的如下:
1.A记录和AAAA记录,即域名-->ip,格式如下:
ns.baidu.com. 600 IN A 192.168.1.1
A是fqdn-->ipv4,AAAA是fqdn-->ipv6,一个A代表32位,对ipv6不太熟,这里不提供案例..
2.反向记录(PTR,pointer)即ip-->fqdn,格式如下:
1.1.168.192.in-addr.arpa. 600 IN PTR ns.baidu.com.
反向记录的写法比较特殊,它的name是ip反过来写并且以in-addr.arpa结尾
3.ns记录,我们知道ns是用来指定哪个主机担任某个域的解析的,所以它是fqdn-->fqdn,并且还需要知道这个主机的地址,所以它一般包含一个ns记录和ns主机的A记录,格式如下:
baidu.com. 600 IN NS ns.baidu.com
ns.baidu.com. 600 IN A 192.168.1.1
4.SOA(start of Authority)记录,既然我们掌管某个域,那么我们就应该拥有这个域的某些管理信息(域名,主从服务器之间的同步信息)所以这条记录是很重要的,必须放在区域文件第一条,它的格式如下:
ZONE_NAME TTL IN SOA FQDN ADMIN_MAILBOX{
serial number
refresh time
retrytime
expiretime
negative answer ttl
}
zone_name表示区域名(注意不是域名),ttl表示这条记录的过期时间,fqdn表示第一个授权主机的名字(不重要),admin_mailbox表示管理员的邮箱,剩下的参数前面已经讲过了,需要补充说的是,里面的时间单位可以写成M、H的形式,因为@在区域文件中有特殊含义(代表区域名,在bind的配置文件中定义),所以邮箱格式中的@必须转化为.
时间单位:M(分钟)、H(小时)、D(天)、W(周)默认是秒
邮箱格式:[email protected]> 1.163.com
例子:
@ 600 IN SOA ns.baidu.com. 1.163.com.{
1
1H
2W
3D
600}
也可以这么写:
baidu.com. 600 IN SOA ns.baidu.com. 1.163.com 1 1H 2W 3D 600
5.mx记录:我们知道,我们发邮件一般发送地址都是[email protected]的形式,但是我们主机怎么知道xx是谁呢?它是哪台主机上的用户呢?所以dns服务器还必须提供mx记录,它告诉外界,哪台主机提供了邮件服务,哪台主机可以帮你找到用户,它的格式如下:
ZONE_NAME TTL IN MX PRI VALUE
ri字段代表邮件服务器的优先级,值为0-99,数字越小优先级越高,这是因为可能提供多台邮件服务器的缘故
6.cname(canonical name)记录,也叫作别名记录,即一个域名的别名,fqdn-->fqdn的形式,例子:
www2.baidu.com. 50 IN CNAME www.baidu.com.
区域和域的区别:(参考bind9手册,2.3章)
整个域可以划分为多个区域,就比如说baidu.com是一个域(domain),它可以包含为a.www.baid.com.和b.ftp.baidu.com.这些主机,但是却用www.baidu.com.和ftp.baidu.com.这两个区域(zone)文件,可以说它们两者并没有太严格的关系,两种不同的概念,区域可以视为dns数据库的名称,是一种物理实现,而域是逻辑上的概念
今天就到这了,关于dns服务器软件bind的实现,我们下篇再探讨