DNS and BIND

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DNS and BIND相关的知识,希望对你有一定的参考价值。

DNS and Bind

BIND:Berkeley internet name Domain, 伯克利互联网名称域;

名称域--名字空间:

    倒置的树

    根域(.)

    顶级域(Top Level Domain, TLD)

        组织域: com, org, edu, gov, mil, net, ...

                    info,cc, 中国, ......

        地理域: cn, tw, hk, jp, iq, ......

        方向域: in-addr.arpa

    DNS的名称解释方式:

        正向解析: 名称 --> IP地址

        方向解析: IP地址 --> 名称

        注意: 正向解析和方向解析所使用的名称非同一空间, 非同一棵殊; 也就是非同一数据库;

    DNS查询类型:    

        递归查询: 客户机向DNS服务器进行DNS查询的过程;

        迭代查询(重指引): 当服务器使用迭代查询时能够使其它服务器返回一个最佳的查询点提示或主机地址, 若此最佳的查询点中包含需要查询的主机地址, 则返回主机地址信息, 若此时服务器不能够直接查询到主机地址, 则是按照提示的指引依次查询, 知道服务器给出的提示中包含所需要查询的主机地址为止, 一般的, 每次指引都会更靠近根服务器(向上), 查询到根域服务器后, 则会再次根据提示向下查找.

    DNS服务器的分类:

        至少负责一个域的数据库:

            DNS服务器

            辅助DNS服务器(DNS服务器)

        不负责任何域的数据库:

            缓存DNS服务器(存根DNS服务器)

    一次完整的DNS查询请求流程:

        Client--> hosts --> Local Cache --> first DNS(recursive) --> 

            1.-->服务器本地缓存或本地数据库中有结果, 直接响应客户端;

            2.-->ROOT(iteration) --> TLD_DNS_SERVER --> 二级域DNS_SERVER--> ...... --> ns.xx. --> 解析结果;

    DNS解析一个域名的过程:

        1.一台通过ISP接入了互联网的计算机A(下面简称A). ISP会给A分配一个DNS服务器, 这个DNS服务器不是权威服务器, 而是相当于一个代理的dns解析服务器, 他会帮助A迭代权威服务器返回的应答, 然后把最终查到IP返回给A.

        2.现在A要向A网络设置里的DNS发起请求查询www.baidu.com这个域名了

        3.DNS拿到请求后, 先检查一下自己的缓存中有没有这个地址, 有的话就直接返回. 这个时候那个的ip地址, 会被标记为非权威服务器的应答.

        4.如果缓存中没有的话, DNS会从配置文件里面地区13个根域名的服务器的地址(这些地址是不变的, 直接在BIND的配置文件中).

        5.然后像其中一台发起请求.

        6.根服务器拿到这个请求后, 知道他是com.这个顶级域名下的, 所以就会返回com域中的NS记录, 一般来说是13台主机名和IP.

        7.然后该DNS想其中一台再次发起请求, com域的服务器发现你这请求是baidu.com这个域的, 我一查发现了这个域的NS, 那我就返回给你, 你再去查. (目前百度有4baidu.com的顶级域名服务器).

        8.DNS不厌其烦的再次向baidu.com这个域对的权威服务器发起请求, baidu.com收到之后, 查了下有www的这台主机, 就把这个IP返回给你了.

        9.然后该DNS那搞了之后, 将其返回给了客户端, 并且把这个保存在高速缓存中.

    查询得到的解析答案:

        权威答案: 由直接负责管理对应信息的DNS服务器返回的答案;

        非权威答案: 由指定的服务器从缓存中或者利用迭代的方式查询到的答案;

        还有两种可能:

            肯定答案: 能够按照客户端请求完成正确的名称解析的答案;

            否定答案: 无法按照客户端的请求完成正确的名称解析所返回的答案; 即客户端锁清秋的解析内容不存在或无法找到映射资源;

DNS:

    主从DNS服务器:

        传输方式: Push(), Pull()

        传输协议: TCP

        DNS服务器: 维护所负责解析的区域数据库文件的主体服务器, : 可以在区域数据库中进行增, , 改得管理操作; 读写操作均可进行;

        DNS服务器: 也称为辅助DNS服务器, DNS服务器或其他的从DNS服务器以区域传送的方式复制对方的区域数据库; DNS服务器无法完成管理类操作, 只能进行读写操作;

       为了保证DNS服务器中的数据库和从DNS服务器中的数据库一致;

            序列号: Serial, 即数据库的版本号; DNS服务器的数据库内容如果发生变化, 序列号应该自增; 如果从服务器接收到的新的数据库, 如果其序列号没有变化, 则忽略; 如果发现其比当前自身的数据库序列号更大, 则更新;

            刷新时间间隔: refresh, DNS服务器每隔多长时间到主DNS服务器上检查序列号的变化更新情况;

            重试时间间隔: retry, DNS服务器向主DNS服务器要求同步数据库失败之后, 再次发起尝试请求的时间间隔;

            过期时间: expire, DNS服务器始终联系不上主DNS服务器时, DNS服务器多长时间之后停止服务;

            否定答案的缓存时长: minimal TTL

        题外话:

            服务器时间同步的方法:

                1.到互联网同步时间;

                2.自架时间服务器;

                    CentOS 6-: ntpd服务器

                    CentOS 7: ntpd服务器, chrony服务器

                    ntpd的配置: /etc/ntp.conf

                        restrict 172.16.0.0 mask 255.255.0.0 nomodify

                    CentOS 6-: service ntpd start

                    CentOS 7: systemctl start ntpd.service

    区域数据传送:

        主DNS服务器可以主动跟通知从DNS服务器更新数据;

        从DNS服务器可以主动的向主DNS服务器发出更新请求;

        两种类型:

            全量传送: AXFR, All Transfer, 传送整个数据库;

            增量传送: IXFR, Increment Transfer, 仅传送自上次变化之后的数据内容

        对于BIND, 默认是允许所有客户端请求区域传送; 需要进行访问控制;

    区域是DNS服务器用于进行正常的权威解析活动的必要的基础;

    资源记录(RR): 存放于区域数据库文件中的那些用于解析工作的数据.

    资源记录:

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

        SOA: Start of Authority, 起始授权记录;

            在任何一个数据库中有且只有一条SOA记录, 必须是数据库的第一条记录

        A: Address, 主机记录;

            标识从完全合格域名到IP地址的映射关系, FQDN --> IPv4;

        AAA: Address, FQDN --> IPv6;

        PTR: PoinTeR, 指针记录;

            标识从IP地址到完全合格域名的映射关系, IP --> FQDN

        NS: Name Server, 名称服务器记录;

            用户标明当前域所有的DNS服务器;

        CNAME: Conanical Name, 别名记录;

            标识从完全合格域名到完全合格域名的映射关系, FQDN --> FQDN

        MX: Mail eXchanger, 邮件交换器记录;

            标识域中邮件服务器的主机名, 从域名映射到完全合格域名, Domain name --> FQDN

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

    区域数据库中资源记录的定义格式:

        语法: name|FQDN [TTL] IN RR_TYPE VALUE 

        注意:

            1.名称部分可以写FQDN, 也可以除去域名部分的主机名, 其域名会从配置文件中继承, 也可以使用宏$Origin来定义;

            2.TTL是以每秒为单位的时间概念, 如果省略, 则从全局定义的宏$TTL继承

            3."@"符号可以用于引用当前区域的域名;

            4.同一个name可以通过多条记录定义多个不同的VALUE; DNS在查询此类记录的时候, 会以轮询的方式一次调取每个记录的内容;

            5.多个name通过多条记录对应一个VALUE, 通常用于多个名称对应同一个VALUE, 通常用于多个名称对应同一个IP地址, 可以使用CNAME记录来进行标识;

七种资源记录在区域数据库中的具体格式:

    SOA资源记录;

        name: 当前域的域名, 如: qhdlink.com.; 或者可以使用"@"代替域名;

        value:

            1.当前区域的主DNS服务器的FQDN;

            2.当前区域数据库的管理员的邮件地址; 但是使用"."来代替"@"; 如:

                mailmaster.qhdlink.com.(表示[email protected])

            3.主从服务器进行区域传送的相关定义及否定答案的统一TTL;

                格式可以写成一行, 如下:                    

                (Serial 1H 15M 1W 1D)

                也可以写成多行:

                (
                    Serial;
                    1H;refresh
                    15M;retry
                    1W;expire
                    1D);minimal

                                (分行的好处就是可以加注释, 分号后面的就是注释.)

        例如:    (下面的qhdlink.com.即第一个字符可用@代替)

$TTL 86400
qhdlink.com. 86400 IN SOA ns1.qhdlink.com. master.qhdlink.com.(
              2017081001;serial
              1H;refresh
              15M;retry
              1W;expire
              1D);ttl

    NS记录: (必须有)

        name: 当前域的域名

        value: 当前区域内某DNS服务器的完全合格域名, 如: ns.qhdlink.com.

        注意: 

            1.一个域中可以有多个NS资源记录;

            2.每个NS资源记录都必须要有一个A记录与之对应;

        例如:

            1.正常写法:

                qhdlink.com. 86400 IN NS ns1.qhdlink.com.
                qhdlink.com. 86400 IN NS ns2.qhdlink.com.

            2.使用宏继承的写法:

                $Origin qhdlink.com.
                $TTL 86400
                    IN NS ns1
                    IN NS ns2

    MX记录: (必须有)

        name: 当前域的域名;

        value: 当前域中某有效的邮件服务器的主机名;

        注意:

            1.一个域中, 可以有多条MX资源记录;

            2.每个MX资源记录都必须要有一条A记录与之对应;

        例如:

            qhdlink.com. 86400 IN MX 10 mail1.qhdlink.com.
            @ IN MX 20 mail2

    A记录:

        name: 域中某主机的FQDN或主机名;

        value: 与主机名对应的IPv4地址;

        例如:

          www.qhdlink.com. 86400 IN A 192.168.1.1
            www.qhdlink.com. 86400 IN A 192.168.1.2 
            www.qhdlink.com. 86400 IN A 192.168.1.3 
            www.qhdlink.com. 86400 IN A 192.168.1.4
            www IN A 192.168.1.1

            泛域名: *.qhdlink.com. IN A 1.2.3.4

            直接域名(空域名): qhdlink.com. IN A 2.3.4.5

            泛域名和直接域名都是防止用户写错名称而导致无法给出正确的解析结果;

    CNAME记录:

        name: 别名的FQDN或简单的名称;

        value: 真正的名称的FQDN或其简单名称;

        例如:

            web.qhdlink.com. 86400 IN CNAME www.qhdlink.com.

            web IN CNAME www

    AAAA记录: 规则和A记录一致;

        ftp.qhdlink.com. 86400 IN AAAA fe08::1

        ftp.qhdlink.com. 86400 IN AAAA ::1

    PTR记录:

        name: 将IP地址反过来写, 并在其后缀加反向域的标准后缀; 所以其完整写法应该是: 1.72.16.172.in-addr.arpa.

        value: FQDN

        例如:

            1.72.16.172.in-addr.arpa. 86400 IN PTR www.qhdlink.com.

            如果有全局宏定义的话:

            1.72 IN PTR www www.qhdlink.com.

        注意:

            1.网络部分的地址和标准后缀可以省略;

            2.PTR记录的value部分, 必须写FQDN;

            3.如果剩余的IP地址中的主机部分仍然是多段, 主机部分依然需要反着写;

BIND软件:

    BIND ---- Berkeley Internet Name Domain, Berkeley 开发, ISC(isc.org)维护

        bind-libs: 为bind的其他应用程序提供共享库文件;

        bind-utils: 通用工具包, 如: dig, host, nslookup等;

        bind: 主程序包, 包括: DNS服务器程序(named), 解析库, 检测工具;

        bind-chroot: 设置伪根, 启用监牢的模式, 安全体现;

    实现DNS协议的程序是BIND, BIND的服务器的主程序named;

        named: DNS Server

            53/udp: 完成主机名查询;

            53/tcp: 完成区域传送;

        bind:

            主配置文件: /etc/named.conf

            可以在此配置文件中使用include命令包含其他的配置文件;

                /etc/named.isclv.key

                /etc/named.rfc1912.zones

                    声明区域:

                /etc/named.root.key

            主配置文件的格式:

                1.注释方式:

                    //: 单行注释;

                    /* ...... */: 任意内容注释;

                2.分段配置的特点:

                    a.访问控制列表定义段:

                        acl ACL_NAME {......};

                    b.全局选项段:

                        options {......};

                    c.日志配置段:

                        logging {......};

                    d.区域配置段:

                        zone "ZONE_NAME" IN {......};

                    e.视图配置段:

                        view VIEW_NAME {......};

                    f.include包含段:

                        include /PATH/TO/SOME_CONFIG_FILE

                全局配置段:

options {
    listen-on port 53 { 127.0.0.1; 172.16.72.1; };
        在启动DNS服务之后, named进程监听的IP地址;
    directory "/var/named";
        规定的解析库(区域数据库)的根目录;
    allow-query { localhost; };
        访问控制语句, 允许哪些主机将查询请求发送至本服务器; 
        默认为localhost, 即只为服务器自身提供查询请求处理;
    recursion yes;
        全局开启递归查询; 默认为所有客户端开启递归查询;
        初学者, 建议关闭dnssec功能;
    nssec-enable no;
    dnssec-validation no;
    dnssec-lookaside no;
};

        测试工具:

            dig, host, nslookup

            dig: DNS查找工具

                格式:

                    dig [@Server] [-t RR_TYPE] [query_options]

                        @Server: 表示为此次的查询请求使用指定的DNS服务器完成; 如果不给, 那么就读取/etc/resolv.conf中的nameserver配置项的值;

                        -t RR_TYPE: 指定此次查询请求的资源记录类型;

                        查询选项:

                            +[no]trace: 跟踪整个解析过程;

                            +[no]recurse: 要求目标DNS服务器必须[不]进行递归查询;

                        方向解析查询:

                            dig -x IPADDR

                        模拟区域传送:

                            dig -t axfr DOMAIN_NAME [@Server]

                    host命令:

                        host [-t RR_TYPE] DOMAIN_NAME SERVER

                    nslookup命令:

                        命令行工具+交互式命令:

                        命令行工具: nslookup DOMAIN_NAME

                        交互式命令: nslookup

                        > server IP_ADDR

                            指定此次查询使用的DNS服务器IP地址;

                        > set q=RR_TYPE

                            要查询的资源记录的类型;

                        > QUERY_NAME

                            压迫查询解析的主机名;

                        > set type=RR_TYPE 

                            同set q=RR_TYPE

        rndc: DNS服务器端的控制命令; 953/tcp

            rndc status: 查看服务器端的运行状态;

            rndc reload: 通知服务器端程序重载配置文件和区域文件;

    DNS服务的配置:

        1.基本的正向和方向区域的配置和解析;

        2.主从服务器的设置;

        3.子域和子域的委派;

        4.转发器;

        5.访问控制列表和视图;

基本的正向和方向区域的配置和解析:

    1.配置一个正向的区域:

        1) 定义区域: /etc/named.rfc1912.zones

            zone "ZONE_NAME" IN {
                type {master|slave|forward|hint};
                file "ZONE_NAME.zone";
            };
            zone "qhdlink.com" IN {
                type master;
                file "qhdlink.com.zone";
            };

        2) 创建区域数据文件

            /var/named/qhdlink.com.zone

            注意修改权限:

                # chown :named qhdlink.com.zone

                # chmod o-r qhdlink.com.zone

$ORIGIN qhdlink.com.
$TTL 86400
@ IN SOA ns1.qhdlink.com. admin.qhdlink.com. (
                        2017081001;serial
                        1H;refresh
                        15M;retry
                        1W;expire
                        1D);TTL
    IN NS ns1.qhdlink.com.
    MX 10 mx1.qhdlink.com.
ns1.qhdlink.com. IN A 172.16.72.1
www IN A 172.16.100.1
www IN A 172.16.100.2
www IN A 172.16.100.3
web IN CNAME www
mx1 IN A 172.16.100.4

        3) 重载配置文件和区域文件, 使配置生效;

            a.检测语法是否正确:

                named-checkconf

                    检测named.conf及其辅助配置文件的语法正确与否;

                named-checkzone "ZONE_NAME" FILE_NAME

                    检测域名和区域数据库文件是否对应和是否存在语法错误;

            b.重载配置文件;

                # rndc reload

                # systemctl reload named.service

                # service named reload(CentOS 6-)

    2.配置一个反向的区域:

        1) 定义区域: /etc/named.rfc1912.zones

            zone "ZONE_NAME" IN {
                type {master|slave|forward|hint};
                file "ZONE_NAME.zone";
            };
            zone "16.172.in-addr.arpa" IN {
                type master;
                file "172.16.zone";
            };

        2) 创建区域数据文件

            /var/named/172.16.zone

            注意修改权限:

                # chown :named 172.16.zone

                # chmod o-r 172.16.zone

$ORIGIN 16.172.in-addr.arpa.
$TTL 86400
@ IN SOA ns.qhdlink.com.admin.qhdlink.com. (
                    2017081001;serial
                    1H;refresh
                    15M;retry
                    1W;expire
                    1D);TTL
    IN NS ns1.qhdlink.com.
1.72 IN PTR ns1.qhdlink.com.
1.100 IN PTR www.qhdlink.com.
2.100 IN PTR www.qhdlink.com.
3.100 IN PTR www.qhdlink.com.
4.100 IN PTR mx1.qhdlink.com.

        3) 重载配置文件和区域文件, 使配置生效;

            a.检测语法是否正确:

                named-checkconf

                    检测named.conf及其辅助配置文件的语法正确与否;

                named-checkzone "ZONE_NAME" FILE_NAME

                    检测域名和区域数据库文件是否对应和是否存在语法错误;

            b.重载配置文件:

                # rndc reload

                # systemctl reload named.service

                # service named reload(CentOS 6-)

    2.主从服务器:

        注意: 主从服务器都是区域级别的概念;

        配置一个从区域:

            ON slave:

            1) 定义区域

    zone "ZONE_NAME" IN {
        type slave;
        file "slaves/ZONE_NAME.zone";
        masters { MASTER_IP; };
     };

                示例:

            zone "qhdlink.com" IN {
                type slave;
                file "slaves/qhdlink.com.zone";
                masters { 172.16.72.1; };
            };

                2) 检测并重载配置文件;

                    ~]# named-checkconf

                    ~]# rndc reload

        On Master:

            1.确保区域数据文件中为每个名称服务器都提供NS记录;

            2.在正向区域文件中, 需要为每个NS记录提供A记录;

            3.为NS记录提供的A记录所指向的IP地址必须是从服务器的真实IP地址;

            4.注意主从服务器的时间同步;

转发器:

    1.区域转发:

        专门针对某个特定的区域, 实现的转发器转发;

        定义在/etc/named.rfc1912.zones文件中的zone声明中;

        zone "baidu.com" IN {
            type forward;
            forward {first|only};
            forwarders { 172.16.72.1; };
        };

         first: 首先转发, 当指定的转发器无响应时, 再自行迭代;

         only: 只使用转发器进行转发, 不执行自行迭代;

    2.全局转发:

        针对那些没有通过zone在本地定义的区域的查询请求, 全部转发给转发器, 请求转发器予以递归查询;

    /etc/named.conf
    options {
        ...
        forward {first|only};
        forwarder { SERVER_IP; };
        ...
    };

子域委派授权:

    在父域的区域文件中直接授权即可;

    qhdlink.com区域的文件/var/named/qhdlink.com.zone

    tech.qhdlink.com. IN NS ns.tech.qhdlink.com.
    ns.tech.qhdlink.com. IN A 172.16.69.1

    在子域的NS服务器上, 直接创建子域的区域文件, 管理资源记录即可;

    /etc/named.rfc1912.zones
        zone "tech.qhdlink.com" IN {
            type master;
            file "tech.qhdlink.com.zone";
        };
    touch /var/named/tech.qhdlink.com.zone
    chown :named /var/named/tech.qhdlink.com.zone
    chmod 640 /var/named/tech.qhdlink.com.zone

    如果想要从子域的NS服务器解析父域的资源记录, 则需要转发器的定义;

        定义区域转发:

            在子域的NS服务器上的/etc/named.rfc1912.zones中定义父域转发器;

            zone "qhdlink.com" IN {
                type forward;
                forward first;
                forwarders { 172.16.72.1; };
            };

        定义全局转发:

            在子域的NS服务器的主配置文件/etc/named.conf文件中定义:

            options {
                ...
                forward first;
                forwarders { 172.16.72.1; };
                ...
            };

    总结:

        1.可以通过委派授权, 使父域可以直接找到子域的NS服务器, 从而解析子域中的资源记录;

        2.可以通过区域转发或全局转发, 是子域能够通过父域的NS服务器, 查找父域中的资源记录;

bind中的基础安全相关的配置:

    acl: 访问控制列表, 将一个或多个IP地址, 归并为一个命名的集合, 随后可以通过定义好的acl的名称对该集合内的所有的IP地址进行统一的调用或设置;

    bind有四个内置的acl:

        none: 不包括任何一个IP地址;

        any: 包括所有的IP地址;

        local: 本机的IP地址;

        localnet: 包括本机IP地址所在网段内的所有IP地址;

            172.16.72.1/16        172.16.0.0/16

    定义acl的语法:

        acl acl_name {
            [!] ip;
            [!] network/prefix;
        };
        acl mynet {
            172.16.0.0/16;
            127.0.0.1;
            ! 172.16.100.100;
        };

    注意:

        1.在调用acl之前, 确保其已经被定义;

        2.通常在主配置文件/etc/named.conf中定义, 并且放在options之前;

经常与acl配合使用的访问控制指令:

    allow-query { acl|IP|Network; };

        允许向本服务器发起查询请求的主机, 即: 白名单;

 allow-transfer { acl|IP|Network; };

        允许哪些从服务器可以从本机进行区域传送; 默认是所有主机都可以; 建议应该只允许从服务器完成此项工作, 白名单;

    allow-recursion { acl|IP|Network; };

        允许哪些主机向当前DNS服务器发起递归查询请求;

    allow-update { acl|IP|Network; };

        DDNS, Dynamic DNS;

        允许哪些主机动态更新区域数据库中的资源记录; 因为其不安全, 所以应该禁用;

视图: view

    定义视图:

        view VIEW_NAME {
            match_clients { acl; };
            zone
            zone
            zone
            ......
        };

    注意: 一旦在bind中启用的视图, 则所有的zone都必须定义在视图中;

视图配置示例:

view intranet {
    match-clients { mynet; };
    zone "." IN {
        type hint;
        file "named.ca";
    };
    zone "qhdlink.com" IN {
        type master;
        file "qhdlink.com.intra.zone";
        allow-query { mynet; };
        allow-update { none; };
        allow-transfer { none; };
    };
};
view internet {
    match-clients { any; };
    zone "." IN {
        type hint;
        file "named.ca";
    };
    zone "qhdlink.com" IN {
        type master;
        file "qhdlink.com.inter.zone";
        allow-update { none; };
        allow-transfer { none; };
    };
};


以上是关于DNS and BIND的主要内容,如果未能解决你的问题,请参考以下文章

DNS and BIND

DNS and BIND 笔记总结

DNS and BIND 实验

DNS and BIND

DNS原理与BIND基础

linux ubuntu下如何安装bind