BIND软件:
BIND软件的主要rpm包:
bind:主程序包,包括:
DNS服务程序(named)
解析库
检测工具;
bind-libs:Bind软件的共享库程序包;
bind-utils:通用工具包,包括各种服务测试工具,如:dig, host, nslookup等;
bind-chroot:设置伪根,启用监牢模式;bind-9+版本中出现的安全功能实现;

应用层协议是DNS协议;DNS,Domain Name System;
DNS的应用程序实现:BIND;
BIND程序的服务主程序:named;
    53/TCP:完成区域传送;
    53/UDP:完成主机名的解析查询;
    953/TCP:rndc程序的监听端口;

IETF:dnssec标准;dnssec,DNS安全扩展插件;

Bind软件的组成:
    主配置文件:/etc/named.conf
    辅助配置文件:可以在主配置文件中利用include命令包含其他配置文件;
        /etc/named.rfc1912.zones:声明了区域;
    安全认证密钥文件:
        /etc/named.iscdlv.key
        /etc/named.root.key
    主程序:/usr/sbin/named
    远程管理程序:/usr/sbin/rndc
    配置文件检测工具:
        /usr/sbin/named-checkconf
    区域文件检测工具:
        /usr/sbin/named-checkzone
    日志文件:
        /var/log/named.log
    区域文件的存放目录:
        /var/named
    存放辅助区域文件的目录:
        /var/named/slaves

主配置文件:/etc/named.conf
    文件格式:
        格式特点:分段式配置格式;

    1.配置行的注释方式:
        //:单行注释;
        /*...*/:任意内容注释;
        #:单行注释;
    2.主配置文件中的常用配置段:
        1) 访问控制列表配置段:
            acl string { address_match_element; ... };
        2) 全局选项配置段:
            options { statements; ... };
        3) 日志配置段:
            logging { statements; ... };
        4) 区域配置段:
            zone string optional_class { statements; ... };
        5) 视图配置段:
            view string optional_class { statements; ... };
        6) include命令:
            include /PATH/TO/SOME_CONFIG_FILE;

全局配置段:
    options {
        listen-on port 53 { 127.0.0.1; 172.16.72.2; };
            //在启动DNS服务时,named进程所监听的套接字;
        directory   "/var/named";
            //定义解析库(区域数据库文件)的根目录;在主配置文件中添加此配置语句之后,可以在后面定义区域数据库时使用相对路径;
        allow-query     { localhost; };
            //访问控制语句,意思是允许本服务器处理哪些主机发送来的解析查询请求;默认为localhost,即:只允许本机以127.0.0.1发送查询请求;
        recursion yes;
            //允许本服务器为所有查询请求做递归查询;
        allow-recursion { 172.16.72.1/16; };
            访问控制指令,允许为哪些客户端做递归查询;
        pid-file "/run/named/named.pid";
            //定义存放主进程pid文件的路径;
    };

    rndc命令:Remote Name Domain Controller, 远程名称域控制器;
        953/TCP
        常用的子命令:
            status:查看服务器端的允许状态;
            reload:通知服务器重载配置文件和区域文件,无需重新启动服务;
            flush:清空服务器端的DNS缓存;
            stop:较安全的停止DNS服务;

区域配置段:
    zone "FQDN" IN {
        //声明一个区域名称;此名称要是有FQDN表示;如:qhdlink.com
        type master;
            区域的类型:
                master:主区域;
                slave:辅助区域;
                hint:提示区域,仅能在根域上设置;
                forward:转发区域;
        file "named.localhost";
            存放与该域有关的解析信息的数据库文件的路径;如果是相对路径,则相对于主配置文件的全局配置段中的"directory"指令所定义的目录而言;
            注意:文件的所有权和权限设置必须能够让named用户有读取权限;
        allow-update { none; };
            访问控制指令,允许哪些客户端对数据库内容进行动态更新;主要用于DDNS;
        allow-transfer { 172.16.72.1; };
            访问控制指令,允许哪些主机能够从当前服务器进行区域传送;
        allow-query { address_match_element; ... };
            访问控制指令,允许哪些主机进行区域内的解析查询;
        allow-notify { address_match_element; ... };
            访问控制指令,允许哪些主服务器向当前服务器发送区域变更通知;
    };

正向查找区域声明示例:

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

创建数据库文件,修改权限并添加相应资源记录;
    /var/named/ytc.zone

检测区域文件的语法格式:
    named-checkzone FQDN /PATH/TO/ZONE_FILE
例:# named-checkzone ytc.com /var/named/ytc.zone

对主配置文件或区域数据库文件进行修改之后,并不会立即生效;只有在重载配置文件和区域文件之后,配置才生效;重载配置文件的方法:
    1.systemctl reload named.service
    2.rndc reload
    3.systemctl restart named.service(不推荐)
    4.service named reload(CentOS 6-)

注意:对于应用程序服务进程重载配置文件的操作,如果能使用reload,就使用reload,不要轻易执行restart命令;

客户端测试工具:dig, host, nslookup
dig命令:
dig - DNS lookup utility
格式:
dig [@server] [-t type] [-x addr] [queryopt...]

        @server:表示此次查询请求使用指定的DNS服务器,而不使用/etc/resolve.conf文件中定义的nameserver;
        -t RR_type:指定此次查询的资源记录的类型;
        -x addr:进行反向解析查询时,用于指定IP地址;
        queryopt:查询选项:
            +[no]recurse:要求目标服务器必须[不]以递归方式进行查询;
            +[no]trace:[不]跟踪显示整个查询请求的解析过程;

        模拟区域传送:
            dig -t axfr|ixfr DOMAIN_NAME_FQDN

host命令:
    host - DNS lookup utility
    格式:
        host [-t RR_type] {name} [server]
        示例:
            ~]# host -t A www.ytc.com 172.16.1.12

nslookup命令:
    交互式命令;
        server IP_ADDR:指定使用哪个DNS服务器进行查询;
        set q=RR_type:指定此次查询的资源记录的类型及相关答案;
        set type=RR_type:功能同set q=RR_type;
        FQDN | IP_ADDR:根据FQDN进行正向查询解析或根据IP_ADDR进行反向查询解析;
    命令行工具;
        nslookup FQDN NS_SRV
        示例:
            ~]# nslookup www.ytc.com 172.16.72.2

配置反向解析区域:
    反向域的FQDN:172.16.0.0/16网段的反向域名:
        16.172.in-addrp.arpa.
    反向查找区域示例:

zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.local";
allow-transfer { none; };
};

正向区域库文件配置示例:
$ORIGIN ytc.com.
$TTL 86400
@ IN SOA ns1.ytc.com. root.ytc.com. (
2018041101;
1H;
20M;
2W;
1D);
IN NS ns1.ytc.com.
IN MX 10 mail.ytc.com.
ns1 IN A 172.16.1.11
mail IN A 172.16.1.11
www IN A 172.16.100.100
www IN A 172.16.100.101
web.ytc.com. IN CNAME www.ytc.com.
ftp.ytc.com. IN CNAME web.ytc.com.

反向区域配置示例:
$ORIGIN 16.172.in-addr.arpa.
$TTL 86400
@ IN SOA ns1.ytc.com. root.ytc.com. (
2018041102;
2H;
10M;
2W;
5H);
IN NS ns1.ytc.com.
11.1 IN PTR ns1.ytc.com.
11.1 IN PTR mail.ytc.com.
50.50 IN PTR www.ytc.com.
51.50 IN PTR www.ytc.com.

主从DNS服务器:(主辅)
注意:
1.主服务器和辅助服务器都是域级别的概念;
2.必须保证主辅服务器之间的网络通信的顺畅以及时间同步;
3.为了确保所有的名称服务器都能被识别和使用,需要在区域数据库中为所有的名称服务器添加NS资源记录;
4.区域数据库中每条NS资源记录都必须有A记录与之对应;
5.从服务器上可以默认将复制而来的数据库文件保存至/var/name/slaves目录中;
6.在主服务器上应该通过访问控制指令允许从服务器进行区域传送;同时从服务器要指定主服务器;

从服务器配置示例:
zone "ytc.com" IN {
type slave;
masters { 172.16.1.12; };
file "slaves/ytc.slave.zone";
allow-transfer { none; };
};

zone "16.172.in-addr.arpa" IN {
type slave;
masters { 172.16.1.12; };
file "slaves/172.16.slave.local";
allow-transfer { none; };
};

转发器:
全局转发:
对于凡是不能由本服务器管理的域的请求,全部以转发的方式由指定的服务器进行递归查询;

    在bind的主配置文件的全局配置段中定义;

    options {
        forward first;
        forwarders { FORWARD_SERVER_IP_ADDR; };
    };

在A服务器上定义ytc.com域;
zone "ytc.com" IN {
type master;
file "ytc.zone";
allow-transfer { 172.16.1.12; } ;
};

配置库文件:
$ORIGIN ytc.com.
$TTL 86400
@ IN SOA ns1.ytc.com. root.ytc.com.(
2018041111;
1H;
10M;
3D;
4H);
IN NS ns1
ns1 IN A 172.16.1.11
www IN A 1.1.1.2

在B服务器上,仅仅在全局配置段添加转发器;
zone "ytc.com" IN {
type forward;
forward only;
forwarders { 172.16.1.11; };
};

再用客户端测试:
dig @172.16.1.12 -t A www.ytc.com

区域转发:
    专门针对于某个特定的域的请求,如果不能给出权威答案,则转发至指定的服务器进行递归查询;

    在bind的主配置文件的区域配置段中定义;

    区域转发配置示例:

在A服务器上定义ytc.com.cn域;
zone "ytc.com.cn" IN {
type master;
file "ytc.cn.zone";
allow-transfer { none; };
};

还需要定义该域的区域数据库:/var/name/ytc.cn.zone

在B服务器上定义qhdlink.com.cn域的区域转发器:
zone "ytc.com.cn" IN {
type forward;
forward only;
forwarders { 172.16.1.11; };
};

forward first|only;
    first:首先转发,当转发器中指定的服务器无响应时,再自行迭代查找;
    only:只使用转发器中指定的服务器进行递归查询,如果无法获得答案,则直接返回否定答案;自身不再迭代查找;

注意:任何形式的请求转发,都必须依靠被指定的服务器允许自身做递归查询;

子域委派授权:
将子域的管理权授权给子域中的名称服务器;父域中不保存任何子域数据库中资源记录;但为了能够成功授权,需要添加一条NS记录,指向子域的名称服务器;

子域委派授权的示例:
在A服务器上维护父域ytc.org域;
在A服务器上的ytc.org域的数据库中添加NS记录,以实现委派授权;

$ORIGIN ytc.org.
$TTL 86400
@ IN SOA ns1.ytc.org. root.ytc.org. (
2018041103;
2H;
5M;
5D;
1D);
IN NS ns1.ytc.org.
qhd.ytc.org. IN NS ns1.qhd.ytc.org.
ns1 IN A 172.16.1.11
ns1.qhd.ytc.org. IN A 172.16.1.12
www IN A 1.2.1.1

在B服务器上维护子域qhd.ytc.org域;
    在B服务器上声明子域并创建数据库文件:

zone "qhd.ytc.org" IN {
type master;
file "qhd.ytc.org.zone";
allow-transfer { none; };
};

$ORIGIN qhd.ytc.org.
$TTL 86400
@ IN SOA ns1.ytc.org. root.qhd.ytc.org. (
201801104;
2H;
2M;
5D;
10H);
IN NS ns1
ns1 IN A 172.16.1.12
www IN A 11.11.22.22

注意:子域的委派授权,实际上是为客户端提供迭代查询机制;

Bind中的基础安全相关的配置:
1.访问控制列表:
acl,Access Control List,将一个或多个IP地址,归并为一个集合,随后可以通过实现定义好的名称对集合中的多个IP地址进行统一调用或设置;

    bind内部有四个内置的acl:
        any:包括所有的IP地址,整个IP地址栈中的所有有效IP地址;
        none:不包括任何一个IP地址;
        local:仅包含本地已经配置生效的所有IP地址;
        localnet:包含本机所有已经配置并生效的IP地址所在的网段的IP地址;

    定义acl的语法格式:
        acl acl_name {
            [!] ip_addr;
            [!] network/prefix;
        };

    示例:
        acl myacl {
            172.16.0.0/16;
            ! 172.16.100.100;
            172.17.100.101;
        };

    注意:
        1.在调用ACL之前,确保事先已经定义了指定的ACL;
        2.通常在主配置文件/etc/named.conf中定义ACL,建议将自定义的ACL放置在配置文件的最前面,以保证后面的操作可以成功调用到此ACL;

        所有的allow*语句,都是可以调用ACL的,包括:
            allow-update { acl_name; }; 
            allow-transfer { acl_name; };
            allow-recursion { acl_name; };
            allow-query { acl_name; };
            allow-notify { acl_name; };
            ...

视图的配置:View;
实现智能DNS解析服务;根据客户端发送的请求报文中的某个封装信息,判断客户端的网络类型和服务类型,从而能够提供最适合此用户使用的解析结果;

定义视图:
    view VIEW_NAME {
        match_clients { acl; };
        zone "DOMAIN1" IN {
            ...
        };
        zone "DOMAIN2" IN {
            ...
        };
        ...
    };

注意:一旦在Bind中启用视图功能,在所有的zone的声明必须都设置在视图中;

配置示例:
    1.给DNS服务器配置两个不同网段的IP地址;
        eno16777736:172.16.72.2/16
        eno16777736:0:100.100.100.1/24

    2.修改主配置文件:
        1) 创建一个intranet的ACL;

acl intranet {
172.16.0.0/16;
192.168.1.0/24;
10.1.1.0/24;
};
2) 定义视图:将所有的zone放置到视图中;
view intranet {
match-clients { intranet; };
zone "." IN {
type hint;
file "named.ca";
};

zone "ytc.com" IN {
type master;
file "ytc.intra.zone";
allow-update { none; };
allow-transfer { 172.16.1.11; };
};
};

view internet {
match-clients { any; };

zone "ytc.com" IN {
type master;
file "ytc.inter.zone";
allow-update { none; };
allow-transfer { 172.16.1.11; };
};
};

/var/named/qhdlink.intra.zone

$ORIGIN ytc.com.
$TTL 86400
@ IN SOA ns1.ytc.com. root.ytc.com. (
2018040701;Serial
1H;Refresh
15M;Retry
1W;Expire
1D);Minimal TTL
IN NS ns1.ytc.com.
ns1 IN A 172.16.1.12
www IN A 172.16.100.100

/var/named/ytc.inter.zone

$ORIGIN ytc.com.
$TTL 86400
@ IN SOA ns1.ytc.com. root.ytc.com. (
2018040701;Serial
1H;Refresh
15M;Retry
1W;Expire
1D);Minimal TTL
IN NS ns1.ytc.com.
IN MX 10 mail.ytc.com.
ns1 IN A 100.100.100.1
www IN A 61.72.178.82

利用不同的客户端进行测试:
client1:172.16.1.11/16 --> www.ytc.com ==> 172.16.100.100
cleint2:100.100.100.100/24 --> www.ytc.com ==> 61.72.178.82

总结:www.ytc.com域名的解析过程:
客户端首选DNS服务器的名称解析过程:
1.客户端请求解析的内容是服务器管理和维护的内容:
client --> First DNS --> client
答案:权威答案;

    2.客户端请求解析的内容不是服务器管理和维护的内容:
        1) 如果此服务器能够为客户端实施递归查询:
            client --> First DNS --> NS(.) --> FirstDNS {NS(com)}
                                 First DNS --> NS(com) --> FirstDNS {NS(ytc)}
                                 First DNS --> NS(ytc) --> Answer(www.ytc.com)
                                 First DNS --> client
            迭代查询的过程;

        2) 如果此服务器不能为客户端实施递归查询:
            直接返回否定答案;