DNS(Domain Name Service)是域名解析服务。由于网络中IP地址众多而很难记住提供服务主机(比如web服务)的IP,所以使用人们更容易记住的字符串名来代替IP,但是主机间通信要依靠IP地址。所以为了解决这种矛盾,我们使用域名解析服务这个中间层。使得主机名和IP能够一一对应起来;

这篇博文我们主要讲解一下以下内容:

    1、DNS服务器工作原理。

    2、DNS配置文件介绍(重点说一下安全控制选项)。

    3、正向解析区域文件配置、反向解析区域文件配置。

    4、主、从DNS服务器构建。


一、DNS服务器工作原理

  在介绍DNS服务器工作原理之前我们先来了解几个DNS相关的概念:

    1、FQDN:Full Qualified Domain Name,完全限定域名,即每个域在全球网络都是唯一的;

    另外值得提到的一点是域并不是指诸如www.google.com这样的域名,而google.com才是

    域;

    2、的分类

     (1)根域:标识为 . ,全球13组根域名服务器以英文字母A到M依序命名,域名格式

    为“字母.root-servers.net”。其中有11个是以任播技术在全球多个地点设立镜像站。比如中

    国大陆在北京有两台编号为L的镜像,编号为F、I、J的镜像各一台,共5台;香港有编号为D、J

    的镜像各2台,编号为A、F、I、L的镜像各一台,共8台;台湾则有编号为F、I、J各一台,共3

    台。

     (2)顶级域:顶级域(Top Level Domain,简称TLD)分为三类

        1> 通用顶级域:诸如 .com(商业机构) .org(非营利性组织) .net(网络服务机构)等

         2> 国家顶级域:诸如 .cn(中国) .uk(英国) .us(美国) .jp(小日本)

        3> 反向域(基础建设顶级域):.arpa,即从IP到FQDN的反向解析

    3、DNS服务器查询的类型:

     (1)递归:客户端仅发出一次请求,让DNS服务器去查询返回结果;

     (2)迭代:要发出多次请求去分别查询不同的DNS服务器;

    4、DNS名称解析方式:

     (1)正向解析:即将FQDN转化为IP。

     (2)反向解析:即将IP转化为FQDN。

    5、DNS服务器类型

     (1)主DNS服务器:负责解析至少一个域。

     (2)辅助(从)DNS服务器:负责解析至少一个,是主DNS服务器的辅助。

     (3)缓存DNS服务器:不负责解析域,只是缓存域名解析结果。

    6、DNS返回的结果类型

     (1)肯定答案:查询的域存在,会被缓存下来。

     (2)否定答案:不存在查询的域名,因此不存在与其查询的域名对应的IP;会被缓存下来。

     (3)权威答案:所查询的域名的结果是由负责解析这个域的DNS服务器所返回的答案。

     (4)非权威答案:在缓存中查询的结果。

    7、DNS的监听端口:tcp的53号端口,udp的53号端口。


  DNS工作原理(以查询www.google.com为例)

    wKiom1aR_GmikaeNAADI4P1b6lw916.gif

注:图片来自博客 从输入url到页面加载完都做了什么

    

    在上图过程中本地域名服务器完成的就是迭代的过程,本地域名服务器先去找根域名服务器,根域名服务器告诉它去找.com顶级域名服务器,而后本地服务器又去询问.com域名服务器,.com域名服务器告诉他去找google.com域名服务器,google.com域名服务器正是负责解析www.google.com这个域名的服务器,返回权威答案给本地域名服务器。

    客户端即是递归去查询,仅发出一次解析www.google.com域名的请求给本地服务器,剩下的事情就是等待答案。


二、DNS(bind)配置文件介绍

  1、DNS在linux主机上主要的实现程序是bind,此程序的配置文件为:

    (1)主配置文件:/etc/named.conf,在主配置文件中可能包含诸如

/etc/named.iscdlv.key

/etc/named.rfc1912.zones

/etc/named.root.key

    (2)区域配置文件:/var/named/目录下一般名字为ZONE_NAME.zone的文件

     注意: 1> 一台DNS服务器可同时为多个区域提供解析;

   2>  必须要有根区域解析库文件:/var/named/named.ca;

   3> 两个区域解析文件:localhost和127.0.0.1的正反向解析库;

正向解析:/var/named/named.localhost

反向解析:/var/named/named.loopback

  2、主配置文件格式介绍:

    (1)全局配置段:

options{....}

    (2)日志配置段:

logging{....}

    (3)区域配置段:

zone{.....}

那些由本机负责解析的区域或转发的区域

    注意:每个配置语句必须以分号结尾;

/
// 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 { 172.16.25.71; };    ----> 设定监听端口及主机
	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; };    ------> 允许查询主机列表设置

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;    ------> 是否允许递归

	dnssec-enable no;
	dnssec-validation no;
	dnssec-lookaside no;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

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";

(4)bind的安全相关的配置

   1> 在option段的访问控制指令有:

    1、allow-query { }; 允许查询此DNS服务器的主机列表;白名单
    2、allow-transfer { }; 允许向哪些主机做区域传送;默认为向所有主机,应当配置为仅允许从

               服务器。

    3、allow-recursion { }; 允许哪些主机向当前DNS服务器主机发起递归查询请求。

    4、allow-update { }; 允许那些主机动态更新数据库文件中内容。

  2>  定义acl段

    acl:访问控制列表;把一个或多个地址归并一个命名的集合,随后通过此名称即可对此集合内

    的所有主机实现统一调用

   格式:  

    acl acl_name{

    ip;

    net/prefix

    }

   例如:

 acl mynet{

   172.16.0.0/16;

   127.0.0.0/8;

   192.168.1.231;

  };

bind有四个内置的acl

none:没有一个主机

any:任意主机

local:本机

localnet:本机所在的IP所属的网络

    另外建议关闭dnssec

dnssec-enable no;

dnssec-validation no;

dnssec-lookaside no;


  3、区域配置文件将会在DNS服务器的配置中解释给出配置方式。


三、正向解析区域文件配置、反向解析区域文件配置

1、在配置正想解析区域文件和反向区域文件之前我先来介绍一下区域文件中定义的资源记录

资源记录:Resource Record, 简称rr;

记录类型有:A, AAAA, PTR, SOA, NS, CNAME, MX

1> SOA:Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;

2> NS:Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主NS;

3> A: Address, 地址记录,FQDN --> IPv4;

4> AAAA:地址记录, FQDN --> IPv6;

5> CNAME:Canonical Name,别名记录;

6> PTR:Pointer,IP --> FQDN

7> MX:Mail eXchanger,邮件交换器;

 优先级:0-99,数字越小优先级越高;


资源记录的定义格式:

 语法:name   [TTL] IN RR_TYPE  value

SOA:

    name: 当前区域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”;

     value:由多部分组成

1) 当前区域的区域名称(也可以使用主DNS服务器名称);

2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代;

3) (主从服务协调属性的定义以及否定答案的TTL)

例如:

flyalways.com. 	86400 	IN 	SOA 	flyalways.com. 	admin.flyalways.com. (
		2016010801	; 序列号
		2H 		; 刷新时间间隔
		10M 		; 重试时间时长
		1W	        ; 过期时间
		1D	        ; 否定答案生存时长 
		)	

序列号:指的是这个区域文件的序列号,每改变一次需要更改+1,一般这个序列号不超过10位。

刷新时间间隔:刷新时间到期时会比较序列号,来判断是否主从DNS服务器同步。

重试时间时长:辅助服务器的等待重新传送的时间,一般重试时间小于刷新时间;

过期时间:辅助服务器会不断尝试完成区域传送,当过了过期时长还没有完成区域传送,认为主DNS服务器已坏。

否定答案的生存时长:否定答案会被缓存,缓存中存在的时长。

NS:

    name: 当前区域的区域名称

value:当前区域的某DNS服务器的名字,例如ns.flyalway.com.;

注意:一个区域可以有多个ns记录; 

例如:

flyalways.com. 	86400 	IN 	NS  	ns1.flyalway.com.
flyalways.com. 	86400 	IN 	NS  	ns2.flyalway.com.

MX:

name: 当前区域的区域名称

value:当前区域某邮件交换器的主机名;

注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级;

例如:

flyalways.com. 		IN 	MX 	10  	mx1.flyalway.com.
flyalway.com. 		IN 	MX 	20  	mx2.flyalway.com.

A:

    name:某FQDN,例如www.magedu.com.

value:某IPv4地址;

例如:

www.flyalway.com.		IN 	A	1.1.1.1
www.flyalway.com.		IN 	A	1.1.1.2
bbs.flyalway.com.		IN 	A	1.1.1.1

AAAA:

name:FQDN

value: IPv6

PTR:

name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4(ip)的记录应该写

       为4.3.2.1.in-addr.arpa.;

value:FQND

例如:

4.3.2.1.in-addr.arpa.  	IN  PTR	www.flyalway.com.

CNAME:

name:FQDN格式的别名;

value:FQDN格式的正式名字;

例如:

web.flyalway.com.  	IN  	CNAME  www.flyalway.com.

    

注意:

    (1) TTL可以从全局继承;例如可以写$TTL 3600

(2) @表示当前区域的名称;会从主配置文件中集成ZONE_NAME

(3) 相邻的两条记录其name相同时,后面的可省略;

(4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;


2、配置一个正向解析的区域文件

(1)定义区域

    在主配置文件或者主配置文件的辅助配置文件中实现

     zone "ZONE_NAME" IN {

      type {master|slave|hint|forward};

      file "ZONE_NAME.zone";

      };

~]# vim /etc/named.rfc1912.zones 
~]# cat /etc/named.rfc1912.zones    -----> 截取在此文件写入的域的部分显示
zone "flyalways.com" IN {    
	type master;
	file "flyalways.com.zone";
};

(2)建立区域数据库文件(主要记录为A或者AAAA记录)

    在/var/named下建立区域数据文件ZONE_NAME.zone。

   注意:此文件权限更改为640,属主和属组更改为root和named

[root@COS7 ~]# touch /var/named/flyalways.com.zone
[root@COS7 ~]# vim /var/named/flyalways.com.zone    ----> 写入此文件内容如下
[root@COS7 ~]# cat /var/named/flyalways.com.zone
$TTL 3600
$ORIGIN flyalways.com.
@	IN	SOA	dns.flyalways.com.	dnsadmin.flyalways.com. (
	2016011001
	1H
	10M
	3D
	1D )
	IN	NS	dns
	IN 	MX   10 mx1
	IN	MX   20 mx2
dns	IN	A	172.16.25.71
mx1	IN	A	172.16.25.72
mx2	IN	A	172.16.25.73
www	IN	A	172.16.25.74
web	IN	A	172.16.25.75	
[root@COS7 ~]# ll /var/named/flyalways.com.zone
-rw-r--r--. 1 root root 273 1月  10 16:50 /var/named/flyalways.com.zone
[root@COS7 ~]# chgrp named /var/named/flyalways.com.zone
[root@COS7 ~]# chmod o= /var/named/flyalways.com.zone
[root@COS7 ~]# ll /var/named/flyalways.com.zone
-rw-r-----. 1 root named 273 1月  10 16:50 /var/named/flyalways.com.zone

(3)检查语法错误

    named-checkconf

    named-checkzone ZONE_NAME ZONE_FILE

[root@COS7 ~]# named-checkconf 
[root@COS7 ~]# named-checkzone flyalways.com /var/named/flyalways.com.zone 
zone flyalways.com/IN: loaded serial 2016011001
OK

(3)让服务器重载配置文件和区域数据文件

    rndc reload

    或者:systemctl reload named.service

[root@COS7 ~]# rndc reload
server reload successful

验证:

[root@COS7 ~]# dig -t A www.flyalways.com @172.16.25.71

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -t A www.flyalways.com @172.16.25.71
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36732
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.flyalways.com.		IN	A

;; ANSWER SECTION:
www.flyalways.com.	3600	IN	A	172.16.25.74  ----> 权威答案 

;; AUTHORITY SECTION:
flyalways.com.		3600	IN	NS	dns.flyalways.com.

;; ADDITIONAL SECTION:
dns.flyalways.com.	3600	IN	A	172.16.25.71

;; Query time: 2 msec
;; SERVER: 172.16.25.71#53(172.16.25.71)
;; WHEN: 日 1月 10 16:54:54 CST 2016
;; MSG SIZE  rcvd: 96

3、配置反向解析的区域文件

(1)定义区域

    在主配置文件或者主配置文件的辅助配置文件中实现""

    zone "ZONE_NAME" IN {

    type {master|slave|hint|forward};

    file "反写的网段地址.in-addr.arpa";

    };

[root@COS7 ~]# vim /etc/named.rfc1912.zones 
[root@COS7 ~]# cat /etc/named.rfc1912.zones
zone "25.16.172.in-addr.arpa" IN {
	type master;
	file "172.25.16.zone";
};

 注意:反向区域名字一般为反写的网段地址.in-addr.arpa ,例如:100.16.172.in-addr.arpa

(2)定义区域解析库文件(主要记录为PTR)

  在/var/named下建立区域数据文件反写的网段地址.in-addr.arpa。

  注意:此文件权限要更改为640,属主和属组更改为root和named

[root@COS7 ~]# touch /var/named/172.25.16.zone
[root@COS7 ~]# vim /var/named/172.25.16.zone
[root@COS7 ~]# cat /var/named/172.16.25.zone
$TTL 3600
$ORIGIN 25.16.172.in-addr.arpa.
@       IN      SOA     dns.flyalways.com.  dnsadmin.flyalways.com. (
	2016011001
	1H
	10M
	3D
	12H )
	IN      NS      dns.flyalways.com.
71      IN      PTR     dns.flyalways.com.
72      IN      PTR     mx1.flyalways.com.
73      IN      PTR     mx2.flyalways.com.
74      IN      PTR     www.flyalways.com.
75      IN      PTR     web.flyalways.com.
[root@COS7 ~]# chgrp named /var/named/172.16.25.zone
[root@COS7 ~]# chmod o= /var/named/172.16.25.zone
[root@COS7 ~]# ll /var/named/172.16.25.zone
-rw-r-----. 1 root named 396 1月  10 17:16 /var/named/172.16.25.zone

(3)检查语法错误

    named-checkconf

    named-checkzone ZONE_NAME ZONE_FILE

[root@COS7 ~]# named-checkconf
[root@COS7 ~]# named-checkzone 25.16.172.in-addr.arpa /var/named/172.16.25.zone
zone 25.16.172.in-addr.arpa/IN: loaded serial 2016011001
OK

(3)让服务器重载配置文件和区域数据文件

    rndc reload

    或者:systemctl reload named.service

[root@COS7 ~]# rndc reload
server reload successful

验证:

[root@COS7 ~]# dig -x 172.16.25.74 @172.16.25.71

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -x 172.16.25.74 @172.16.25.71
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 942
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;74.25.16.172.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
74.25.16.172.in-addr.arpa. 3600	IN	PTR     www.flyalways.com.   ----> 查出域名

;; AUTHORITY SECTION:
25.16.172.in-addr.arpa.	3600	IN	NS	dns.flyalways.com.

;; ADDITIONAL SECTION:
dns.flyalways.com.	3600	IN	A	172.16.25.71

;; Query time: 1 msec
;; SERVER: 172.16.25.71#53(172.16.25.71)
;; WHEN: 日 1月 10 17:39:09 CST 2016
;; MSG SIZE  rcvd: 119


四、主、从DNS服务器配置

  假设我们以上配置的主机为主DNS服务器,在另一台主机配置从服务器。

  从服务器是区域级别的概念;所以是在zone定义的type为slave;所以可以互为主从,例如一个正向解析的DNS服务器A的从服务器是DNS服务器B。DNS服务器B是反向解析的主服务器,DNS服务器A是反向解析的从服务器;

(1)配置从DNS服务器方式

在从DNS服务器上

  1)定义区域:

    zone "ZONE_NAME" IN {

    type slave;

    file "slaves/ZONE_NAME.zone"; ----> slaves目录的属主是named,确保数据可以写入;

    masters {MASTER_IP;};

    };

   配置文件语法检查:named-checkconf

[root@COS6 ~]# vim /etc/named.rfc1912.zones 
[root@COS6 ~]# cat /etc/named.rfc1912.zones    ----> 截取部分
zone "flyalways.com" IN {
	type slave;
	file "slaves/flyalways.zone";
	masters {172.16.25.71;};
};
[root@COS6 ~]# named-checkconf

  (2) 重载配置

    rndc reload

[root@COS6 ~]# rndc reload
server reload successful

在主DNS服务器上

(1)确保区域数据文件中为每个从服务配置NS记录,并且在正向区域文件需要为每个从服务器的主机名配置一个A记录,且此后A后面的地址为真正的从服务器的IP。 

注意:时间要同步;ntpdate命令

主服务器的序列号每次修改都要更新!!!!

[root@COS7 ~]# vim /var/named/flyalways.com.zone
[root@COS7 ~]# cat /var/named/flyalways.com.zone 
$TTL 3600
$ORIGIN flyalways.com.
@	IN	SOA	dns.flyalways.com.	dnsadmin.flyalways.com. (
	2016011002                          -----> 修改序列号
	1H
	10M
	3D
	1D )
	IN	NS	dns
	IN	NS	dns2                -----> 添加从服务器的NS记录
	IN 	MX   10 mx1
	IN	MX   20 mx2
dns	IN	A	172.16.25.71
dns2	IN	A	172.16.25.67        -----> 指明从服务器的地址
mx1	IN	A	172.16.25.72
mx2	IN	A	172.16.25.73
www	IN	A	172.16.25.74
web	IN	A	172.16.25.75	 
[root@COS7 ~]# named-checkconf 
[root@COS7 ~]# named-checkzone flyalways.com /var/named/flyalways.com.zone 
zone flyalways.com/IN: loaded serial 2016011002            ----> 序列号已变
OK
[root@COS7 ~]# rndc reload
server reload successful

验证:

[root@COS7 ~]# systemctl status named.service -----> 截取部分
1月 10 18:18:11 COS7.1 named[3025]: zone flyalways.com/IN: sending notifies (serial 2016011002)
[root@COS6 ~]# dig -t A www.flyalways.com @172.16.25.67

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -t A www.flyalways.com @172.16.25.67
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15735
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.flyalways.com.		IN	A

;; ANSWER SECTION:
www.flyalways.com.	3600	IN	A	172.16.25.74

;; AUTHORITY SECTION:
flyalways.com.		3600	IN	NS	dns.flyalways.com.
flyalways.com.		3600	IN	NS	dns2.flyalways.com.

;; ADDITIONAL SECTION:
dns.flyalways.com.	3600	IN	A	172.16.25.71
dns2.flyalways.com.	3600	IN	A	172.16.25.67

;; Query time: 0 msec
;; SERVER: 172.16.25.71#53(172.16.25.71)
;; WHEN: 日 1月 10 18:25:18 CST 2016
;; MSG SIZE  rcvd: 131

    另外值得提出的是,从服务器一般而言是为了和主DNS服务器一起做负载均衡的。一旦主DNS服务器失效,从DNS服务器也会停止提供服务。


注:本博文实际测试均在CentOS系统上进行。