概述


    互联网访问绝大多数都是基于域名的访问,互联网访问的基础是基于IP来实现的,因此,需要有一种将域名解析成IP的机制,让用户在利用域名访问时,自动将域名转换成为对应的IP,这就是DNS的功能,本章将介绍一些DNS相关的内容,具体分为:


    1、DNS的基础概念

    2、配置DNS作为缓存DNS服务器

    3、DNS的正向解析区域

    4、DNS的反向解析区域

    5、主从DNS实现

    6、子域授权

    7、区域转发

    8、DNS安全相关的配置(ACL及安全配置项)

    9、智能DNS(DNS的view)


一、DNS基础概念:

1、DNS

    domain name service 区域名称服务或者domain named system 区域名称系统,是互联网最基础的服务,分为正向域名解析(将域名解析为IP地址)和反向域名解析(将IP地址解析为域名)两部分、分别监听在tcp/udp的53号端口上,TCP用来进行区域传送、UDP用来解析请求



2、域名分类:

根域 .

TLD(top level domain顶级域):

    组织域:.com、.net、.org、.gov、.mil

    国家域:.iq、.tw、.hk、.jp、.cn

二级域:就是在顶级域上个人或组织申请的名称



3、DNS查询过程:

递归查询:

    客户端向自己所指定的DNS服务器请求的过程,是递归的,也就是说客户端向服务器请求时,服务器返回的必须是一个明确的结果,要么找到,要么找不到


迭代查询:

    是指当客户端请求到达直接指定的DNS服务器后,如果该服务器上没有缓存相关的条目,则需要向根域请求,根域返回给DNS服务器一个顶级域的地址,然后DNS服务器又根据返回的顶级域地址去找,顶级域又返回一个二级域的地址,而后,DNS服务器又向二级域去请求,追踪返回出一个明确的解析结果给DNS服务器,这个DNS一级一级去查找的过程就是迭代查询


4、DNS名称解析方式:

正向解析:

    名称 –> IP  

    正向解析时,给的地址是,如:www.magedu.com.


反向解析:

    IP –> 名称  

    反向解析时,给的地址是,如:4.3.2.1.in-addr.arpa.

    解析的实际地址是1.2.3.4


注意:正向解析和反向解析的名称空间,不是同一个空间,也就是不是同一颗树形结构;因此也不是同一个解析库


5、DNS服务器类型:

主DNS服务器:

    维护所负责解析的域内解析库服务器,解析库由管理维护


辅助DNS服务器:

    从主DNS服务器或其它的从DNS服务器那里“复制”(区域传递)一份解析库;


缓存DNS服务器:

    可以提高DNS访问速度,对局域网上网实现快速解析


转发器:

    全部转发: 凡是对非本机所有负责解析的区域的请求,统统转发给指定的服务器;

    区域转发:仅转发对特定的区域的请求至某服务器;

注意:被转发的服务器需要能够为请求者做递归,否则,转发请求不予进行;


6、DNS解析的答案类型:

肯定答案:

    有解析出来的结果


否定答案:

    不存在查询的键,因此,不存在与其查询的键对应的值


注意:对于肯定答案和否定答案都可以进行缓存,也都可以指定缓存时长


权威答案:

    由直接负责的DNS服务器给出的答案,也就是给出的结果是自己负责解析域时,给出的答案


非权威答案:

    给出的答案是缓存中的缓存下来的条目,此时因为缓存还在有效期,而后端真实的结果可能已经改变,但是由于有缓存,则依然用缓存响应请求,此时返回的就是非权威答案



7、完整的请求过程:

1)客户端一旦希望以主机名与对方主机通信,此时就需要名称解析,其会先查本地的hosts文件

2)如果host文件中没有对应的名称和地址的对应关系,则客户端会查DNS服务的本地缓存

3)如果本地DNS服务的缓存没有命中,则客户端会向客户端所指向的DNS服务器发送查询请求,此时的请求是递归请求(recursion请求)

4)DNS服务器收到请求后,如果客户端请求的就是自己负责的域,则直接查询数据库,并返回答案

,如果客户端请求的不是自己负责解析的域,则先×××器自己的缓存,如果缓存没命中,则基于迭代的方式先找根域,然后再找顶级域,然后找二级域,一步一步完成查询请求,并最终返回答案给客户端


8、区域传送

全量传送:

    axfr,传送整个数据库;一般在从服务器第一次向主服务器同步数据时

增量传送:

    lxfr,进传送变化的数据


9、区域资源类型:

资源记录:Resource Record, RR

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

    SOA:Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录;

    A:internet Address,作用,FQDN --> IP

    AAAA: FQDN --> IPv6

    PTR: PoinTeR,IP --> FQDN ,完全合格域名

    NS: Name Server,专用于标明当前区域的DNS服务器

    CNAME:Canonical Name,别名记录

    MX: Mail eXchanger,邮件交换器


10、资源记录定义的格式:

语法:name [TTL] IN  rr_type  value

(1) TTL可从全局继承;

(2) @可用于引用当前区域的名字;

(3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应;

(4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机而已;


SOA:

name: 当前区域的名字,例如“magedu.com.”;

value: 有多部分组成

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

(2) 录前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换,例如linuxedu.magedu.com;

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


序列号:serial

    也就是解析数据库的版本号,一旦主服务器的数据库内容发生改变时,其版本号递增。从服务器会每隔一段时间,就向主服务器请求其版本号,如果发现版本号与其不匹配,则执行同步


刷新时间间隔:refresh

    从服务器每隔多久到主服务器或其他从服务器上检查序列号,用于判断更新的状况


重试时间间隔:retry

    当从服务器尝试与主服务器进行通信,获取其序列号时,发现无法联系上主服务器,则进行重试,两次重试之间的时间间隔


注意:重试时间间隔应该小于刷新时间间隔,而且要远小于刷新时间间隔


过期时长:expire

    从服务器始终联系不上主服务器时,多久之后,放弃从主服务器同步数据;从服务器也就停止提供服务


否定答案的缓存时长:TTL

    当结果是明确的无法解析到时,此类否定答案缓存多长时间


11、包与配置文件

1)BIND的安装包:

BIND是dns协议的一种实现

BIND的程序运行时的进程名为named



2)DNS包:

bind  提供DNS服务器端程序,和解析库文件,以及几个常用的测试程序

bind-libs 被bind的主程序和bind-utils包中的程序共同用到的库文件

bind-utils  bind客户端程序集,提供了如dig、host、nslookup等工具

bind-chroot  可选装的程序包,让bind程序能运行在一个子shell中,万一bind程序被劫持,不会影响外面的shell的程序


3)相关配置文件

/etc/named.conf    是其主配置文件,其内部用include指令包含进来了很多其他的文件,如

/etc/named.rfc1912.zones    区域定义文件

/etc/named.iscdlv.key

/etc/named.root.key

/var/named/    是区域解析库文件的存放位置,也就是named的工作目录,该目录下文件名一般为ZONE_NAME.zone

usr/sbin/rndc    是DNS的远程控制工具程序,其工作在tcp/953端口,默认只监听在127.0.0.1的地址,因此仅允许本地使用

注意:

    <1>1台DNS服务器可同时为多个区域提供解析

    <2>在/etc/named/目录下,必须要有根域的解析库文件,在centos上一般为name.ca

    <3>在/etc/named/目录下,还应该有两个区域解析库文件:localhost和127.0.0.1的正向和反向解析的解析库文件,正向为named.localhost、反向为named.loopback文件


12、rndc的使用:

    rndc是DNS远程管理的工具,默认只监听在本地的127.0.0.1的953端口,只能在本机使用,如果要远程主机上管理,需要在/etc/named.conf配置文件中修改相关的配置选项,不过为了安全考虑,不建议用rndc命令在远程主机上管理,在本地管理即可

rndc status    可显示DNS服务器的状态信息

rndc stats    可显示DNS的统计数据

rndc stop      可停止DNS服务

rndc flush    表示清空DNS服务器的DNS缓存条目

rndc reload    表示重新装载DNS服务的配置文件和区域数据库文件



二、配置缓存DNS服务器


bind程序安装完成后,默认即可作为缓存名称服务器使用,可以让其他客户端将DNS指向该主机,作为其DNS服务器,当该DNS服务器中没有相应的缓存,或不是自己负责解析的区域后,也能够向根域发起迭代的查询请求,从而能够返回给客户端答案


如果安装完成bind后,如果没有专门负责解析的区域,将配置文件中的监听地址由120.0.0.1改为可与外部通信的地址,关闭dnssec功能,然后直接启动服务即可


1、修改配置文件

[root@localhost ~]# vim /etc/named.conf 

options {     //全局配置段
	listen-on port 53 { any; };    //修改为监听所有地址上的53号端口
	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     { any; };    //修改为允许来自所有地址的查询请求
	recursion yes;    
	dnssec-enable no;            //关闭dnssec相关功能
	dnssec-validation no;        //关闭dnssec相关功能

	/* Path to ISC DLV key */
//	bindkeys-file "/etc/named.iscdlv.key";    //关闭dnssec相关功能

//	managed-keys-directory "/var/named/dynamic";    //关闭dnssec相关功能
};

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


2、重启服务

[root@localhost ~]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]


3、测试

[root@localhost ~]# dig -t A www.magedu.com   @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A www.magedu.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1490
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 9

;; QUESTION SECTION:
;www.magedu.com.			IN	A

;; ANSWER SECTION:
www.magedu.com.		600	IN	A	101.200.188.230

;; AUTHORITY SECTION:
magedu.com.		172800	IN	NS	v2s1.xundns.com.
magedu.com.		172800	IN	NS	v2s2.xundns.com.

;; ADDITIONAL SECTION:
v2s1.xundns.com.	172771	IN	A	113.17.169.37
v2s1.xundns.com.	172771	IN	A	115.238.241.21
v2s1.xundns.com.	172771	IN	A	115.238.253.250
v2s1.xundns.com.	172771	IN	A	124.232.156.76
v2s1.xundns.com.	172771	IN	A	183.57.38.184
v2s2.xundns.com.	172771	IN	A	115.238.253.252
v2s2.xundns.com.	172771	IN	A	116.10.184.143
v2s2.xundns.com.	172771	IN	A	116.10.189.64
v2s2.xundns.com.	172771	IN	A	115.238.241.20

;; Query time: 260 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 18 10:02:58 2016
;; MSG SIZE  rcvd: 237


三、DNS正向解析区域

1、定义区域

[root@localhost ]# vim /etc/named.rfc1912.zones 

zone "ops.com." IN  {    //ops.com是需要定义的正向区域
        type master;    //master 为主服务器
        file "ops.com"; //文件名为/var/named/下的ops.com
        allow-update { none; };  //不允许自动更新文件
};


2、添加区域解析库

[root@localhost # vim /var/named/ops.com 

$TTL 1D   ;定义缓存时长为1天
$ORIGIN ops.com.  ;没写完的会自动补上该值
@       IN SOA  @  ops.qumaiyao.com (    ;@为配置文件里的区域名
                                        0       ; serial     序列号
                                        1D      ; refresh    刷新时间
                                        1H      ; retry      重试时间
                                        1W      ; expire     过期时间
                                        3H )    ; minimum    否定答案的TTL值

                IN      NS      ns1      ;定义NS服务器    
                IN      NS      ns2
                IN      NS      ns3
ns1.ops.com.    IN      A       192.168.122.94   ;定义NS服务器A记录
ns2.ops.com.    IN      A       192.168.122.95
ns3.ops.com.    IN      A       192.168.122.96

www             IN      A       192.168.122.94
ftp             IN      A       192.168.122.95


3、检查配置文件语法和区域数据文件语法

1)检查配置文件

named-checkconf

2)检查解析库文件

named-checkzone  ops.com.  /var/named/ops.com

指明区域名称,和区域数据文件的位置

[root@localhost named]# named-checkzone  ops.com.  /var/named/ops.com

zone ops.com/IN: loaded serial 0

OK

3)设定解析库权限

[root@localhost named]# chown :named /var/named/ops.com 

[root@localhost named]# ll /var/named/ops.com

-rw-r----- 1 root named 351 10月 18 14:32 /var/named/ops.com


4、重启并测试

[root@localhost named]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

[root@localhost named]# dig -t NS ops.com. @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27715
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 3

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns3.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns1.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.96

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 18 14:37:52 2016
;; MSG SIZE  rcvd: 127

[root@localhost named]# dig -t A  www.ops.com. @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A www.ops.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39277
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;www.ops.com.			IN	A

;; ANSWER SECTION:
www.ops.com.		86400	IN	A	192.168.122.94

;; AUTHORITY SECTION:
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns3.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.96

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 18 14:37:59 2016
;; MSG SIZE  rcvd: 147

[root@localhost named]# dig -t A  ftp.ops.com. @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A ftp.ops.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22681
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;ftp.ops.com.			IN	A

;; ANSWER SECTION:
ftp.ops.com.		86400	IN	A	192.168.122.95

;; AUTHORITY SECTION:
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns3.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.96

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 18 14:38:02 2016
;; MSG SIZE  rcvd: 147


四、DNS反向解析区域

1、定义区域

[root@localhost ]# vim /etc/named.rfc1912.zones

zone "122.168.192.in-addr.arpa" IN {  //122.168.192.in-addr.arpa是需要定义的反向区域
        type master;    //master 为主服务器
        file "ops.arpa";  //文件名为/var/named/下的ops.arpa
        allow-update { none; }; //不允许自动更新文件
};

2、添加区域解析库

[root@localhost] vim ops.arpa 

$TTL 1D    ;定义缓存时长为1天
$ORIGIN 122.168.192.in-addr.arpa.    ;没写完的会自动补上该值

@       IN SOA  @    ops.qumaiyao.com (     ;@为配置文件里的区域名
                                        0       ; serial     序列号
                                        1D      ; refresh    刷新时间
                                        1H      ; retry      重试时间
                                        1W      ; expire     过期时间
                                        3H )    ; minimum    否定答案的TTL值

                IN      NS      ns1.ops.com.     ;定义NS服务器
                IN      NS      ns2.ops.com.
                IN      NS      ns3.ops.com.

94              IN      PTR     ns1.ops.com.    
95              IN      PTR     ns2.ops.com.
94              IN      PTR     www.ops.com.    ;定义主机的反向解析
95              IN      PTR     ftp.ops.com.


3、检查配置文件语法和区域数据文件语法

1)检查配置文件

named-checkconf

2)检查解析库文件

指明区域名称,和区域数据文件的位置

[root@localhost ~]# named-checkzone "122.168.192.in-addr.arpa." /var/named/ops.arpa 

zone 122.168.192.in-addr.arpa/IN: loaded serial 0

OK

3)设定解析库权限

[root@localhost named]# chown :named /var/named/ops.arpa 

[root@localhost named]# ll /var/named/ops.arpa

-rw-r----- 1 root named 351 10月 18 14:32 /var/named/ops.arpa


4、重启并测试

[root@localhost named]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

[root@localhost ~]# dig -x 192.168.122.94 @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -x 192.168.122.94 @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58057
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;94.122.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
94.122.168.192.in-addr.arpa. 86400 IN	PTR	ns1.ops.com.
94.122.168.192.in-addr.arpa. 86400 IN	PTR	www.ops.com.

;; AUTHORITY SECTION:
122.168.192.in-addr.arpa. 86400	IN	NS	ns3.ops.com.
122.168.192.in-addr.arpa. 86400	IN	NS	ns2.ops.com.
122.168.192.in-addr.arpa. 86400	IN	NS	ns1.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.105

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Oct 20 15:34:41 2016
;; MSG SIZE  rcvd: 186


五、主从DNS

主从复制:

1、应该为一台独立的名称服务器;

2、主服务器的区域解析库文件中必须有一条NS记录是指向从服务器;

3、从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中;

4、主服务器得允许从服务器作区域传送;

5、主从服务器时间应该同步,可通过ntp进行;

6、bind程序的版本应该保持一致;否则,应该从高,主低;



注意:主服务器要添加一条到从服务器的NS记录


1、修改从DNS配置文件

[root@localhost ~]# vim /etc/named.conf 

options {
	listen-on port 53 { any; };    //修改为监听所有地址上的53号端口
	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     { any; };    /修改为允许来自所有地址的查询请求
	recursion yes;

	dnssec-enable no;     //关闭dnssec相关功能
	dnssec-validation no;     //关闭dnssec相关功能

	/* Path to ISC DLV key */
//	bindkeys-file "/etc/named.iscdlv.key";     //关闭dnssec相关功能

//	managed-keys-directory "/var/named/dynamic";     //关闭dnssec相关功能
};

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


[root@localhost~]# vim /etc/named.rfc1912.zones 

zone "ops.com." IN {
        type slave;
        file "slaves/ops.com";
        masters { 192.168.122.94; };
};


2、查看同步过来的文件

[root@localhost ~]# ll /var/named/slaves/
总用量 4
-rw-r--r-- 1 named named 436 10月 18 15:31 ops.com
[root@localhost ~]# cat /var/named/slaves/ops.com 
$ORIGIN .
$TTL 86400	; 1 day
ops.com			IN SOA	ops.com. ops.qumaiyao.com.ops.com. (
				0          ; serial
				86400      ; refresh (1 day)
				3600       ; retry (1 hour)
				604800     ; expire (1 week)
				10800      ; minimum (3 hours)
				)
			NS	ns1.ops.com.
			NS	ns2.ops.com.
			NS	ns3.ops.com.
$ORIGIN ops.com.
ftp			A	192.168.122.95
ns1			A	192.168.122.94
ns2			A	192.168.122.95
ns3			A	192.168.122.105
www			A	192.168.122.94


3、重启并测试

[root@localhost ~]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

[root@yaojianju ~]# dig -t NS ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20753
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 3

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns3.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.105

;; Query time: 0 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Tue Oct 18 15:34:17 2016
;; MSG SIZE  rcvd: 127


[root@yaojianju ~]# dig -t A www.ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A www.ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17789
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;www.ops.com.			IN	A

;; ANSWER SECTION:
www.ops.com.		86400	IN	A	192.168.122.94

;; AUTHORITY SECTION:
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns3.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95
ns3.ops.com.		86400	IN	A	192.168.122.105

;; Query time: 0 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Tue Oct 18 15:34:37 2016
;; MSG SIZE  rcvd: 147


六、子域授权

    在前的ops.com.这个域中,添加一个子域,子域的域名为:ha.ops.com. ,该子域自己内部有自己的DNS服务器

    这样在父域的DNS服务器上实现对子域的解析,都交给子域自己去实现,而不是直接利用父域上添加相应的资源记录来实现。


1、修改ops.com.这个域的配置

[root@localhost ~]# vim /var/named/ops.com 

$TTL 1D
$ORIGIN ops.com.

@       IN SOA  @    ops.qumaiyao.com (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

                IN      NS      ns1
                IN      NS      ns2
ha              IN      NS      ns3    ;定义子域的NS记录
ns1.ops.com.    IN      A       192.168.122.94
ns2.ops.com.    IN      A       192.168.122.95
ns3.ops.com.    IN      A       192.168.122.105

www             IN      A       192.168.122.94
ftp             IN      A       192.168.122.95

2、重启服务

[root@localhost ~]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]


3、修改子域配置文件

[root@localhost named]# vim /etc/named.conf

options {
	listen-on port 53 { any; };
	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     { any; };
	recursion yes;

	dnssec-enable no;
	dnssec-validation no;

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


[root@localhost named]# vim /etc/named.rfc1912.zones 

zone "ha.ops.com." IN {
        type master;
        file "ha.ops.com";
        allow-update { none; };
};


4、添加子域解析库

[root@localhost named]# vim ha.ops.com 

$TTL 1D
$ORIGIN ha.ops.com.
@       IN SOA  @ admin.163.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

        NS      ns1
ns1     A       192.168.122.105
www     A       192.168.122.105


5、检查配置文件语法和区域数据文件语法

1)检查配置文件

named-checkconf

2)检查解析库文件

named-checkzone  ha.ops.com.  /var/named/ha.ops.com

指明区域名称,和区域数据文件的位置

root@yaojianju named]# named-checkzone  ha.ops.com.  /var/named/ha.ops.com

zone ha.ops.com/IN: loaded serial 0

OK

3)设定解析库权限

[root@localhost named]# chown :named /var/named/ha.ops.com 

[root@localhost named]# ll /var/named/ha.ops.com

-rw-r----- 1 root named 351 10月 18 14:32 /var/named/ha.ops.com


6、重启并测试

[root@yaojianju named]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

[root@yaojianju named]# dig -t NS ha.ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ha.ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63910
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;ha.ops.com.			IN	NS

;; ANSWER SECTION:
ha.ops.com.		86400	IN	NS	ns1.ha.ops.com.

;; ADDITIONAL SECTION:
ns1.ha.ops.com.		86400	IN	A	192.168.122.105

;; Query time: 0 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Wed Oct 19 10:08:19 20



[root@yaojianju named]# dig -t A www.ha.ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A www.ha.ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32141
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.ha.ops.com.			IN	A

;; ANSWER SECTION:
www.ha.ops.com.		86400	IN	A	192.168.122.105

;; AUTHORITY SECTION:
ha.ops.com.		86400	IN	NS	ns1.ha.ops.com.

;; ADDITIONAL SECTION:
ns1.ha.ops.com.		86400	IN	A	192.168.122.105

;; Query time: 1 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Wed Oct 19 10:08:38 2016
;; MSG SIZE  rcvd: 82

7、父域测试是否能解析

[root@localhost ~]# dig -t NS ha.ops.com. @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ha.ops.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57381
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;ha.ops.com.			IN	NS

;; ANSWER SECTION:
ha.ops.com.		86174	IN	NS	ns1.ha.ops.com.

;; ADDITIONAL SECTION:
ns1.ha.ops.com.		86174	IN	A	192.168.122.105

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Oct 19 10:09:26 2016
;; MSG SIZE  rcvd: 62


七、区域转发

    在正常情况下,子域是无法直接找到父域内的解析的,因为当子域内的客户端向子域内的DNS服务器,请求解析某地址时,如果该地址不是子域DNS服务器自己负责解析的区域,则子域的DNS服务器会去找根域,然后根域告诉其找顶级域,顶级域告诉其找二级域,这样进行迭代查询。

    但是在本实验中,子域内的主机如果要找的是父域的DNS负责解析的地址,则按照上述的工作模式还是要先去找根域,然后一级一级找到父域,然后解析,这样不符合实际需求,此时就需要用到定义转发的概念了


定义转发有两种:

    区域转发:表示仅将某特定区域的解析请求进行转发

    全局转发:表示只要不是本DNS服务器直接负责解析的区域,都进行转发。相当于针对本地没有通过zone定义的区域查询请求,一律转发到某目标服务器


forward 定义转发的类型,有first和only两种:

    first:首先转发,表示当本DNS服务器解析不了时,就转发给目标服务器进行解析,当目标服务器由于不在线或其他原因,不响应时,则当前DNS服务器就自己去找根域,然后一步一步迭代查询

    only:只转发,表示当本地DNS服务器解析不了时,不管转发的目标服务器有没有响应,都转发,没响应就一直等着


注意:被转发的服务器,必须允许为当前定义转发的服务器对其做递归查询,默认情况下,是允许给任何人递归的


1、修改子域配置文件

[root@localhost named]# vim /etc/named.rfc1912.zones 

zone "ops.com." IN {
        type forward;
        forward  first;
        forwarders { 192.168.122.94; };
};


2、重启并测试

[root@localhost named]

# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

[root@yaojianju named]# dig -t NS ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34873
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns1.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95

;; Query time: 3 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Wed Oct 19 10:39:29 2016
;; MSG SIZE  rcvd: 93


[root@yaojianju named]# dig -t A www.ops.com. @192.168.122.105

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t A www.ops.com. @192.168.122.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61597
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.ops.com.			IN	A

;; ANSWER SECTION:
www.ops.com.		86400	IN	A	192.168.122.94

;; AUTHORITY SECTION:
ops.com.		86373	IN	NS	ns2.ops.com.
ops.com.		86373	IN	NS	ns1.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95

;; Query time: 3 msec
;; SERVER: 192.168.122.105#53(192.168.122.105)
;; WHEN: Wed Oct 19 10:39:56 2016
;; MSG SIZE  rcvd: 113

注意:

    如果定义全局转发,就不需要定义区域的方式进行配置,而是要在主配置文件/etc/named.conf中的全局配置段options中定义

    forward only|first ;    根据需要选择是first还是only

    forwarders { IP; };    //选择转发的目标服务器地址



八、dns安全相关配置 

访问控制列表,可以把一个或多个地址归并为一个命名的集合,随后,通过此名称即可对此集合内的所有主机实现统一调用;


1、定义方式:

acl ACL_NAME {

IP ;

NET_ADDR/MASK ;

};

如:

acl mynet {

10.1.32.0/24;

127.0.0.0/8;

};


注意:

定义acl的语句,要放在bind主配置文件/etc/named.conf文件最前面,不能放在某个具体配置段中间

acl只能先定义,后使用


bind有4个内置的acl:

none  表示没有一个主机

any   表示所有任意的主机

local  表示本机上的所有IP地址

loaclnet  表示本机IP所在的网络的网络内的所有主机


2、ACL访问控制指令

1)allow-query { };  

表示允许查询的主机,也就是只允许哪些主机对本机的DNS发起查询请求,括号内填入acl名称,如果不指定该指令,则默认允许所有的主机进行查询

此指令可以加在options中,表示对全局生效,也可以加在某个zone的定义中,表示仅对该区域生效


2)allow-transfer {};

表示允许向哪些主机做区域传送,默认为向所有主机;为了加强安全性,应该配置为仅允许向自己服务器的从服务器做区域传送

此指令可以加在options中,表示对全局生效,也可以加在某个zone的定义中,表示仅对该区域生效

如果将allow-transfer定义在某个具体的zone中,则可以实现该区域的数据仅向指定的主机传送


3)allow-recursion {};

表示允许哪些主机向当前DNS服务器发起递归查询请求,也就是要求本DNS如果没有解析的内容,本DNS就要一级一级的向根域,顶级域迭代查询的

注意:配置文件中默认有一项 recursion  yes;表示允许所有的递归请求,如果要实现只对本地的请求进行递归,则需要将该项注释掉


4)allow-update {};

表示允许动态更新区域数据库文件中的内容(也就是区域的具体各个资源记录的内容);一般情况下,除非使用了DDNS,否则需要定义为allow-update { none; };



ACL控制指令例子

3、修改配置文件

[root@localhost ~]# vim /etc/named.conf

acl mynet {
127.0.0.1;
};

options {
	listen-on port 53 { any; };
	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     { mynet; };
	recursion yes;

	dnssec-enable no;
	dnssec-validation no;
	

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


4、重启并测试

[root@localhost ~]# service named restart

停止 named:.                                              [确定]

启动 named:                                    [确定]

使用本地地址无法请求查询

[root@localhost ~]# dig -t NS ops.com. @192.168.122.94

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @192.168.122.94
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 59101
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;ops.com.			IN	NS

;; Query time: 0 msec
;; SERVER: 192.168.122.94#53(192.168.122.94)
;; WHEN: Wed Oct 19 11:05:25 2016
;; MSG SIZE  rcvd: 25



使用acl里的地址进可以正常请求

[root@localhost ~]# dig -t NS ops.com. @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18067
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns2.ops.com.
ops.com.		86400	IN	NS	ns1.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Oct 19 11:06:19 2016
;; MSG SIZE  rcvd: 93


九、智能DNS(DNS的view)

    bind视图的意义是:假设一个主机www.ops.com 这台服务器上有两个IP,一个是内网IP,一个是外网IP,或者一个是联通服务器的IP,一个是电信服务器的IP;那么,我们可以在DNS服务器上定义,当来自内网用户的访问,都解析到内网的IP上,通过外网用户的访问,都解析到外网的IP上。或者来自联通的用户访问,都解析到联通的IP上,来自电信的用户,都解析到电信的IP上,这样就可以实现来自对同一个域名的请求,根据需要,可以解析到不同的IP上


一个bind服务器可定义多个view,每个view中可定义一个或多个zone;

每个view用一来匹配一组客户端;

多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件;


注意:

    (1) 一旦启用了view,所有的zone都只能定义在view中;

    (2) 仅有必要在匹配到允许递归请求的客户所在view中定义根区域;

    (3) 客户端请求到达时,是自上而下检查每个view所服务的客户端列表;


定义视图:

    view VIEW_NAME {

    match-clients {  };

    ZONE1;

    ZONE2;

    };


1、修改配置文件

[root@localhost named]# vim /etc/named.rfc1912.zones 

view a {
match-clients {
192.168.122.0/24;
};

zone "ops.com." IN  {
        type master;
        file "ops.com";
        allow-update { none; };
};

};

view b {
match-clients {
172.16.200.0/24;
};

zone "ops.com." IN  {
        type master;
        file "opsb.com";
        allow-update { none; };
};

};


view default {

zone "." IN {
        type hint;
        file "named.ca";
};


zone "localhost.localdomain" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};

zone "localhost" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};

zone "0.in-addr.arpa" IN {
	type master;
	file "named.empty";
	allow-update { none; };
};



zone "ops.com." IN  {
	type master;
	file "ops.com";
	allow-update { none; };
};


zone "122.168.192.in-addr.arpa" IN {
	type master;
	file "ops.arpa";
	allow-update { none; };
};

};


2、添加新的解析库

[root@localhost named]# vim /var/named/opsb.com 

$TTL 1D  
$ORIGIN ops.com.

@	IN SOA  @    ops.qumaiyao.com (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum

		IN	NS      ns1
		IN	NS      ns2
ns1.ops.com.	IN	A 	172.16.200.100
ns2.ops.com.	IN	A 	172.16.200.200

www		IN	A 	172.16.200.200


3、检查配置文件语法和区域数据文件语法

1)检查配置文件

named-checkconf

2)设定解析库权限

[root@localhost named]# chown :named /var/named/opsb.com 

[root@localhost named]# ll /var/named/opsb.com

-rw-r----- 1 root named 351 10月 18 14:32 /var/named/opsb.com


4、重启并测试

[root@localhost named]# service named restart

停止 named:.                                              [确定]

启动 named:                                               [确定]

192.168.122.0网段
[root@localhost named]# dig -t NS ops.com. @192.168.122.94

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @192.168.122.94
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61578
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	192.168.122.94
ns2.ops.com.		86400	IN	A	192.168.122.95

;; Query time: 1 msec
;; SERVER: 192.168.122.94#53(192.168.122.94)
;; WHEN: Wed Oct 19 11:52:40 2016
;; MSG SIZE  rcvd: 93



172.16.200.0网段
[root@localhost named]# dig -t NS ops.com. @172.16.200.100

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> -t NS ops.com. @172.16.200.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16629
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;ops.com.			IN	NS

;; ANSWER SECTION:
ops.com.		86400	IN	NS	ns1.ops.com.
ops.com.		86400	IN	NS	ns2.ops.com.

;; ADDITIONAL SECTION:
ns1.ops.com.		86400	IN	A	172.16.200.100
ns2.ops.com.		86400	IN	A	172.16.200.200

;; Query time: 0 msec
;; SERVER: 172.16.200.100#53(172.16.200.100)
;; WHEN: Wed Oct 19 11:53:16 2016
;; MSG SIZE  rcvd: 93