一,简介:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
因特网的域名系统DNS被设计成为一个联机分布式数据库系统,并采用客户--服务器方式。DNS使大多数名字都在本地进行解析(resolve),仅少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是联机分布式系统,即使单个计算机出现了故障,也不会妨碍整个DNS系统的正常运行。
DNS服务器的两种解析类别:
FQDN(完全限定域名解析)----> IP 正向解析
IP ----> FQDN 反向解析
正向解析:域名到IP地址的解析过程的要点如下:当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析程序,并成为DNS的一个客户端,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发送给本地域名服务器(使用UDP协议是为了减少开销)。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程获得目的主机的IP地址后即可进行通信。若本地域名服务器不能回答该请求, 则此域名服务器就暂时成为DNS中的另一个客户端,并向其他域名服务器发出的查询请求。
一个服务器所负责管辖的范围叫做区(zone)。各个单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够互通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。区可能等于或小于域,但一定不可能大于域(“域”是一个逻辑概念,“区”是一个物理概念)。
DNS服务器的类型:
主DNS服务器
辅助DNS服务器
缓存名称服务器
为了提高域名服务器的可靠性,DNS域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器。当主域名服务器出现故障时,辅助域名服务器可以保证DNS的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而更改的数据只能在主域名服务器中进行。这样就保证了数据的一致性。
区域传送:
辅助DNS服务器从主DNS服务器或其他的辅助DNS服务器请求数据传输过程
完全区域传送:传送区域的所有数据,AXFR
增量区域传送:传送区域中改变的数据部分,IXFR
DNS的查询方式:
递归:主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所查询的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户端的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。因此,递归查询返回查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
迭代:本地域名服务器向根域名服务器的查询通常是采用迭代查询。迭代查询的特点是这样的:当根域名服务器收到本地域名服务器发出的迭代查询请求的报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应该向那个域名服务器进行查询”。然后让本地域名服务器进行后续的查询(而不是代替本地域名服务器进行后续的查询)。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询,顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询,本地域名服务器就这样进行迭代查询。最后,知道了所要解析域名的IP地址,然后把这个结果返回给发起查询的主机。当然,本地域名服务器 也可以采用递归查询,这取决于最初的查询请求报文的设置是要求使用哪一种查询方式。
PS:根域名服务器是一定不会给任何主机递归的(太占资源了),网络上的DNS服务器只会进行迭代查询,而客户端指向的DNS服务器,一定是允许给本地主机做递归的
区域数据库文件只能包含资源记录或宏定义,每一个条叫一个资源记录(Resource Record),资源记录有类型 ,用于表示资源的功能:
SOA:Start Of Authority, 起始授权
NS:Name Server,域名服务器
MX:mail eXchanger,邮件交换器
A:Address,(FQDN-->IP)正向解析
PTR:PoiTeR,(IP-->FQDN) 反向解析
AAAA:Address,FQDN-->IPv6
CNAME:Canonical Name,正式名称(别名记录)
资源记录的格式:
name [ttl(缓存时间)] IN 资源记录类型(RRtype) Value
SOA:
name:只能是区域名称,通常可以简写为@,例如:luochen.com.
value:有n个数值,最主要的是主DNS服务器的FQDN,点不可省略
注意:SOA必须是区域数据库文件第一条记录
例子:
@ 600 IN SOA na.luochen.com. luochenmail.com.(
序列号(serial number) ;注释内容,十进制数据,不能超过10位,通常使用日期,例如2015061001
刷新时间(refresh time) ;即每隔多久到主服务器检查一次
重试时间(retry time) ;应该小于refresh time
过期时间(expire time)
netgative answer ttl ;否定答案的ttl
)
NS:可以有多条
name:区域名称,通常可以简写为@
value:DNS服务器的FQDN(可以使用相对名称)
例子:
@ 600 IN NS ns
A:只能定义在正向区域数据库文件中
name:FQDN(可以使用相对名称)
value:IP
例子:
www 600(单位s) IN A 192.168.1.111
www 600(单位s) IN A 192.168.1.119
PS:但凡以FQDN做为其值的记录,应该给这个值做一条A记录
MX:可以有多个
name:区域名称,用于标识smtp服务器
value:包含优先级和FQDN
优先级:0-99,数字越小,级别越高,
例子:
@ 600 IN MX 10 mail
@ 600 IN MX 20 mail2
CNAME:
name :FQDN
value :FQDN
例子:
ftp IN CHANE www
PTR:IP --> FQDN,只能定义在反向区域数据文件中,反向区域名称为逆向网络地址加.in.addr.arpa.后缀组成
name:IP,逆向的主机地址,例如192.168.1.111的name为111.1,完全格式为111.1.168.192.in-addr-arpa.
value:FQDN
例子:
111. 600 IN PTR www.luochen.com.
二,bind的应用
1,安装bind
# yum -y install bind
2,bind的配置文件
# rpm -ql bind
主配置文件,用来定义区域 /etc/named.conf
区域数据库文件存放目录 /etc/named/
3,bind服务进程名为named 运行该服务为named用户named组
4,修改/etc/named.conf配置文件后语法检测
# service named configtest 或 named-checkconf
5,启动服务
# service named start
6,在/etc/named.conf主配置文件中定义一个区域
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
// allow-query { localhost; };
recursion yes;
// dnssec-enable yes;
// dnssec-validation yes;
// dnssec-lookaside auto;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "luolinux.com" IN {
type master;
file "luolinux.com.zone";
};
include "/etc/named.rfc1912.zones";
//include "/etc/named.root.key";
7,在/var/named/ 目录下创建luochen.com 区域数据库文件
# vim /var/named/luolinux.com.zone
$TTL 600
@ IN SOA dns.luolinux.com. admin.luochen.com. (
2016030315
2H
10M
7D
1D)
@ IN NS dns
@ IN MX 10 mail
dns IN A 192.168.1.118
mail IN A 192.168.1.110
www IN A 192.168.1.121
ftp IN CNAME www
8,修改区域数据库文件的属主和属组和权限
# chown root:named luolinux.com.zone
# chmod 640 luolinux.com.zone
9,检测区域数据库文件是否有语法错误
# named-checkzone "luolinux.com" /var/named/luolinux.com.zone
10,重读配置文件
# killall -1 named
11,测试是否能正常解析luochen.com
# dig -t A www.luolinux.com @192.168.1.118
# dig -t NS luolinux.com
三,反向区域
1,定义反向区域
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.zone";
};
2,提供反向区域数据库文件
# vim /var/named/192.168.1.zone
$TTL 600
@ IN SOA dns.luolinux.com. admin.luochen.com. (
2016030315
2H
10M
7D
1D)
@ IN NS dns.luolinux.com.
118 IN PTR dns.luolinux.com.
110 IN PTR www.luolinux.com.
121 IN PTR mail.luolinux.com.
3,修改区域数据库文件的属主和属组和权限
# chown root:named 192.168.1.zone
# chmod 640 192.168.1.zone
4,检测区域数据库文件是否有语法错误
# named-checkzone "1.168.192.in-addr.arpa" /var/named/192.168.1.zone
5,重读配置文件
# killall -1 named
6,测试是否能正常反向解析
# dig -x 192.168.1.118
PS:反向区域数据库文件:区域名称为逆向的网络地址,并以 .in-addr.arpa为后缀;第一条资源记录必须是SOA,具有NS记录,但不能出现MX和A记录,常用的是PTR记录,名称为逆向的主机地址。
四,区域数据传送
# dig -t axfr luolinux.com @192.168.1.118
五,主从复制
1,在两台DNS 服务器中安装相同版本的bind,最关键的一步是在主DNS服务器上的区域数据库文件中为从DNS服务器添加一条NS记录和对应的A记录;从DNS服务器上不需要手动配置区域数据库文件。
# vim /var/named/luolinux.com.zone ;主DNS服务器上的区域数据库文件
$TTL 600
@ IN SOA dns.luolinux.com. admin.luochen.com. (
2016030315
2H
10M
7D
1D)
@ IN NS dns
@ IN NS dns2 ;NS记录
@ IN MX 10 mail
dns IN A 192.168.1.118
dns2 IN A 192.168.1.119 ;A记录
mail IN A 192.168.1.110
www IN A 192.168.1.121
ftp IN CNAME www
2,在从DNS服务器上修改主配置文件和定义区域
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
// allow-query { localhost; };
recursion yes;
// dnssec-enable yes;
// dnssec-validation yes;
// dnssec-lookaside auto;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
//include "/etc/named.root.key";
3,在从DNS服务器上定义区域
# vim /etc/named.rfc1912.zones (添加内容)
zone "luolinux.com" IN {
type slave;
masters { 192.168.1.118; }; //192.168.1.118 主DNS服务器IP地址
file "slaves/luolinux.com.zone";
};
4,直接启动从DNS服务器
# service named start
5,查看日志
# tail /var/log/messages
6,在从DNS服务器上定义反向区域
# vim /etc/named.rfc1912.zones (添加内容)
zone "1.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.1.118; }; //192.168.1.118 主DNS服务器IP地址
file "slaves/192.168.1.zone";
};
7,在从DNS服务器上检测配置文件是否有语法错误和重启服务
# named-checkconf
# service named reload
PS:如果主DNS服务器上的区域数据库文件修改了,那么必须将区域数据库文件中的SOA记录的序列号加1,并且重新加载配置文件(reload)。
六,区域数据传送安全控制
在主DNS服务器上修改/etc/named.rfc1912.zones 文件,为每个区域添加一个allow-transfer 选项
zone "luolinux.com" IN {
type master;
file "luolinux.com.zone";
allow-transfer { 127.0.0.1; 192.168.1.119; };
};
在从DNS服务器上测试
# dig -t axfr luolinux.com @192.168.1.118
PS:对于从DNS服务器如果不做为其他DNS服务器的主服务器,为了安全,最好为所有区域添加一项 allow-transfer { none; }。