DNS正反向解析、主从同步、子域授权及视图

关键词: 正向解析 反向解析 主从复制 自域授权 视图
一、DNS基本原理

1.1 什么是DNS?BIND又是什么?
DNS:Domain Name Service,它是一个基于应用层的协议,是C/S构架的,监听在 53/udp和 53/tcp。
BIND: Berkerley Internet Name Domain, 它是DNS域名解析的一种实现方式。

1.2 DNS发展
早期的域名解析方式:

但是随着互联网的普及,全世界的电脑太多了,要解析就很不容易,所以现在的互联网是分层树状结构的去解析,结构图如下

二、DNS基本概念

2.1 DNS服务器的类型有哪些?
    有主DNS服务器、辅助DNS服务器、缓存DNS服务器、转发器

2.2 解析类型有哪些?
    有正向区域解析和反向区域解析,正向解析为name --> IP, 反向解析为IP--> Name

2.3 主DNS服务器和从DNS服务器有什么区别?
    主DNS服务器:维护所负责解析的域内解析库服务器;解析库由管理员维护
    从DNS服务器:从主DNS服务器或其他的从DNS服务器那里复制(区域传递)一份解析库

2.4 区域传送有哪些?
    全量传送:传送整个解析库
    增量传送:传送解析库变化的那部分内容

2.5 DNS查询类型有哪些?
    递归查询: 一次请求就得到正确答案
    迭代查询: 一次请求得到一个答案,然后根据答案再去发送请求,经过多次请求后得到正确答案的过程 

2.5 一次完整的查询请求经过的流程
    client --> hosts文件 --> dns service
         (local cache --> dns server)(recursion递归) --> server cache --> iteration(迭代)
    
2.6 bind是什么?
    bind是dns协议的一种实现

2.7 bind如何进行解析?
     bind解析是通过区域解析库来实现

2.8 区域解析库是什么?
     区域解析库表现形式是由众多RR(Resource Record )组成,RR在配置文件中进行定义
 
2.9 资源记录
    2.9.1 资源记录类型有哪些?
       记录类型有: A、AAAA、PTR、SOA、NS、CNAME、MX

    2.9.2 资源记录各类型含义?
       SOA: Start Of Authority, 起始授权记录:一个区域解析库有且仅能有一个SOA记录,而且必须为解析库的第一条记录。
       A: internet Address, 作用就是提供正向解析: FQDN --> IP
       AAAA: ipv6地址正向解析: FQDN --> IPv6
       PTR:  PoinTeR, 反向解析:Ip --> FQDN
       NS: Name Server,  标明当前区域的DNS服务器
       CNAME: Canonical Name, 别名记录
       MX:Mail eXchanger, 邮件服务器

     2.9.3 资源记录定义的格式及定义示例    
            语法: name [TTL] IN rr_type value
            注意: a. TLL可从全局继承
                      b. @可用于引用当前区域的名字

        SOA:    
               name: 当前区域的名字,如“baidu.com.”
               value: 有多部分组成
                        1. 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字
                        2. 当前区域管理员的游戏地址,地址中不能使用@符号,一般用.替换,如 alen.chengkaihua.com
                        3. (主从服务协调属性的定义以及否定的答案的统一TTL值)
            例如:
                  alen.com.        IN        SOA      ns1.alen.com. nsadmin.alen.com. (
                                2015042201     ; 序列号
                                2H                  ;刷新时间
                                10M                 ;重试时间
                                1W                   ; 过期时间
                                1D                    ;否定答案的TTL值

                   )
            
            NS:
                 name: 当前区域的名字
                 value: 当前区域的某DNS服务器的名字
                   注意: 一个区域可以有多个NS记录
                 例如:
                        alen.com.        IN        NS        ns1.alen.com.
                        alen.com.        IN        NS        ns2.alen.com.
                    注意:1.相邻的两个资源记录的name相同时,后续的可省略
                             2. 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
                
            MX:
                   name: 当前区域的名字
                   value: 当前区域的某邮件服务器的主机名
                        一个区域内,MX记录可有多个;但每个记录的value之前应该有一个数字(0-99),表示此服务器的优先级,数字越小优先级越高。
                例如:
                         alen.com.    IN        MX    10         mx1.alen.com.
                         alen.com.    IN        MX    20         mx2.alen.com
                        注意: 对MX记录而言,每一个MX记录后面的服务器名字,都应该在后续有一个A记录
            A:
                name: 某主机的FQDN
                value: 主机名对应主机的IP地址
                    例如:
                          ns1.alen.com.        IN    A    1.1.1.1
                          ns2.alen.com.        IN    A    1.1.1.2
                          MX1.alen.com.        IN    A    1.1.1.3
                          MX2.alen.com.        IN    A    1.1.1.4
                   注意:
                        *.alen.com.         IN        A        1.1.1.5
                       避免用户写错答案时给错误答案,可通过泛域名解析进行解析至某特定地址

            AAAA:
                    name: FQDN
                    value: IPv6
            
             PTR:
                    name: IP,有特定格式,IP地址反过来写,1.1.1.2要写成2.1.1.1.in-addr.arpa.
            
                    value: FQDN
                    例如:    
                        4.3.2.1.in-addr.arpa.        IN    PTR    www.alen.com.

             CNAME:
                    name:  别名的FQDN
                    value:   正式名字的FQDN
                    例如:
                            web.alen.com.    IN    CNAME    www.alen.com.

三、前期准备

3.1 实验目标

以域名alen.com.为例,配置一台主DNS服务器一台从服务器:
192.168.1.102 主DNS服务器
192.168.1.103 从DNS服务器
实现正反向解析、主从同步功能

3.2 安装包及配置文件
        查看bind服务相关包,安装所需要的包即可:
              # yum list bind* 
        安装bind服务及其依赖包,主要安装这三个包: bind、bind-libs、bind-utils
              # yum install bind bind-libs bind-utils
        bind相关配置文件:
                服务脚本:/etc/rc.d/init.d/named
                主配置文件: /etc/named.conf, /etc/named.rfc1912.zones
                解析库文件:/var/named/ZONE_NAME.ZONE(需要自己定义)
                日志文件: /var/log/messages

四、首先搭建一台主DNS服务器

4.1 主DNS实现正向解析和反向解析
    4.1.1 配置缓存名称服务器
            4.1.1.1 监听外部地址即可
            4.1.1.2 dnssec: 建议测试时关闭dnssec
                cp /etc/named.conf{,.bak}
                vim /etc/named.conf
                    options {
                //      listen-on port 53 { 192.168.1.102; 127.0.0.1; };    //可以设置ip也可以直接注释整行
                //      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; };        //可以设置为any也可以直接注释掉
                         recursion yes;
                //关闭dnssec
                //      dnssec-enable yes;    
                //      dnssec-validation yes;
                /* Path to ISC DLV key */
                //      bindkeys-file "/etc/named.iscdlv.key";
                //      managed-keys-directory "/var/named/dynamic";
            };

    4.1.2 在缓存dns服务器的基础上,配置主DNS服务器
            cp /etc/named.rfc1912.zones{,.bak}
            vim /etc/named.rfc1912.zones
    
        4.1.2.1 在最后一行添加正向解析区域和反向解析区域:
                 zone "alen.com" IN {
                    type master;    // 正向区域类型
                    file "alen.com.zone";    //相对于/var/named而言,输入区域相对路径
                 };
            
                zone "1.168.192.in-addr.arpa" IN {    //反向解析区域
                    type master;            
                    file "192.168.1.zone";
                 };
            定义区域正向解析库文件
                在/var/named创建 alen.com.zone正向解析库文件并配置
                    $TTL 86400
                    $ORIGIN alen.com.
                    @       IN      SOA     ns1.alen.com.   admin.alen.com. (
                                                  2010010101      ;序列号
                                                  1H              ;刷新时间
                                                  5M              ;重试时间
                                                  7D              ;七天过期
                                                  1D )            ;否定答案的统一TTL值
                                IN      NS         ns1
                                IN      NS         ns2
                                IN      MX 10    mx1
                                IN      MX 20    mx2
                     ns1       IN      A        192.168.1.102
                     ns2       IN      A       192.168.1.103
                     mx1       IN      A       192.168.1.104
                     mx2      IN      A       192.168.1.105
                     www     IN      A       192.168.1.102
                     www     IN      A       192.168.1.103
                     ftp        IN      CNAME   www
                     alen.com.    IN    A    192.168.1.102
                     *           IN    A        192.168.1.102    ;泛域名解析
            定义区域反向解析库文件
                在/var/named目录下创建 192.168.1.zone反向解析库文件并配置    
                    $TTL    1D
                    $ORIGIN    1.168.192.in-addr.arpa.
                    @       IN      SOA     ns1.alen.com.   admin.alen.com. (
                            2015041101      ;序列号
                            2H              ;刷新时间
                            5M              ;重试时间
                            1W              ;过期时间一周
                            1D )            ;否定答案的统一TTL值
                            IN      NS      ns1.alen.com.
                            IN      NS      ns2.alen.com.
                    102     IN      PTR     ns1.alen.com.
                    103     IN      PTR     ns2.alen.com.
                    102     IN      PTR     www.alen.com.
                    103     IN      PTR     www.alen.com.
                    104     IN      PTR     mx1.alen.com.
                    105     IN      PTR     mx2.alen.com.

五、测试

5.1 测试工具介绍
    5.1.1 dig的使用
           dig [-t type] name [@SERVER] [query options]
                用于测试DNS系统,不会查询hosts文件进行解析
                   比如: dig -t A ns1.alen.com    @192.168.1.102
                
                查询选项:
                       +[no]trace: 跟踪解析过程
                       +[no]recurse: 递归解析

                测试反向解析:
                        dig    -x    IP    @SERVER
                              比如: dig -x 192.168.1.102 @ 192.168.1.102

                模拟区域传送:
                        dig -t axfr ZONE_NAME @SERVER

     5.1.2 host命令
            host  [-t type] name [SERVER]
                比如: host -t A ns1.alen.com 192.168.1.102

     5.1.3 nslookup命令
            nsloopup [-option] [name | - ] [server]
                    交互式模式:
                        server IP: 指明使用哪个DNS server 进行查询
                        set q=RR_TYPE: 指明查询的资源记录类型
                        NAME: 要查询的名称
                比如: nsloopup 
                           > server 192.168.1.102 
                           > set q=A
                           > ns1.alen.come

5.2 测试
       修改 alen.com.zone和192.168.1.zone文件属组
              # chown   :named    alen.com.zone
              # chown    :named    1.168.192.zone
       修改 alen.com.zone和192.168.1.zone权限
             # chmod 640 alen.com.zone
             # chmod 640 192.168.1.zone
       检查区域配置文件有无错误:
              # named-checkconf    //检查主配置文件 
              # named-checkzone "alen.com"    alen.com.zone
              # named-checkzone    "1.168.192.in-addr.arpa" 192.168.1.zone
       重启named服务
              # service named restart
       测试资源记录
            #   dig -t    NS    alen.com    @192.168.1.102
            #   dig -t     A    ns1.alen.com    @192.168.1.102
            #   dig -t     A    www.alen.com    @192.168.1.102
            #   dig -t    A     pop.alen.com    @192.168.1.102
            #   dig -t A      alen.com        @192.168.1.102
            # host -t A  ns2.alen.com    192.168.1.102
            测试反向解析:
               # dig -x  192.168.1.102 @192.168.1.102  
    至此,一台主DNS服务器就配置好了,且支持正反向解析功能。

六、主从复制

上面我们配置了一台主DNS服务器,下面把192.168.1.103这台电脑作为辅助DNS服务器,来实现两台电脑的主从架构
从服务器上进行配置:
1. 先模拟传送测试是否可以正常传送
         # dig -t axfr alen.com    @192.168.1.102

2.如果可以正常传送,再进行配置从服务器
    # yum install bind    //centos6默认安装了libs和utils包,所以只需要安装bind包就可以
3. 从服务只需要配置区域,不需要配置资源记录
    vim /etc/named.conf
    配置缓存服务器,和上面一样
     options {
            listen-on port 53 { 192.168.1.103; 127.0.0.1; };    //监听对外ip
    //     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 yes;
   //      dnssec-validation yes;
    /* Path to ISC DLV key */
    //      bindkeys-file "/etc/named.iscdlv.key";
    //      managed-keys-directory "/var/named/dynamic";
     };

    vim /etc/named.rfc1912.zones
        zone "alen.com" IN {
            type slave;
                masters { 192.168.1.102; };
                file "slaves/alen.com.zone";
            };

        zone "1.168.192.in-addr.arpa" IN {
                type slave;
                masters { 192.168.1.102; };
                file "slaves/192.168.1.zone";
            };
    
        配置完后检查语法错误
            # named-checkconf
        重载服务
            # rndc reload
        查看日志
            # tail /var/log/messages
        传送成功后在/var/named目录下会自动创建一个192.168.1.zone文件和alen.com.zone文件
    
    rndc工具总结
        rndc COMMAND
            reload: 重载主配置文件和区域解析库文件
            reload zone: 重载区域解析库文件
            retransfer zone: 手动启动区域传送过程,而不管序列号是否增加
            notify zone:重新对区域传送发通知
            reconfig:重载主配置文件
            querylog:开启或关闭查询日志,注意只在定位错误的时候开启
            trace:递增debug使用的级别,生产环境中切莫开启,很影响性能
            trace LEVEL:指定使用的级别

七、子域授权

1.1 自域授权架构

1.2 为何要转发?
从上面的架构图中可以看到:客户端 --> ns1
客户端请求解析的主机在alen域内的ns1主机, 客户端给父域ops发送请求,但是ops是找不到alen域内的ns1的,它只会从根域进行迭代去找,所以这种情况就要考虑转发。从而让客户端可以直接向alen域发送请求找到ns1主机。

1.3 如何定义转发服务器:
    7.3.1 全部转发: 凡是对非本机所有负责解析的区域的请求,都转发给指定服务器
            options {
                    forward { first|only }
                    forwarders
             }
    1.3.2 区域转发:仅抓发对特定区域的请求至某服务器
            zone "ZONE_NAME" IN {
                            type forward;
                            forward { first|only };
                            forwarders
            }
    要点: first:   先转发,没有得到响应结果就自己去寻找根域
              only: 转发后没有响应结果就放弃继续寻找根域

1.4 定义子域并实现转发功能实例
    1.4.1 定义子域
            在父域(192.168.1.102)中:
                        vim /var/named/alen.com.zone
                            ops         IN    NS    ns1.ops
                            ns1.ops    IN    A    192.168.1.103

            在子域(192.168.1.103)中:
                    添加子域:
                        vim /etc/named.rfc1912.zones
                        zone "ops.alen.com"    IN {
                                type master;
                                file "ops.alen.com.zone";
                        };
                    添加子域的资源记录
                        vim /var/named/ops.alen.com.zone
                        $TTL 1d
                        $ORIGIN ops.alen.com.
                                @       IN      SOA     ns1.ops.alen.com.       admin.ops.alen.com. (
                                                    2015041001
                                                        1H
                                                        10M
                                                        3D
                                                        1D )
                                           IN      NS      ns1
                                  ns1     IN      A       192.168.1.103
                                www     IN      A       192.168.1.103
                                   *       IN      A       192.168.1.103

    1.4.2 实现转发
            1. 全部转发
                    在 父域192.168.1.102上实现
                        vim /etc/named.conf
                        在options中添加两行:
                                forward first;
                                forwarders { 192.168.1.1; };
              测试:
                    # dig -t A www.baidu.com @192.168.1.102
                      注意:
                             关掉dnssec验证机制
                                 dnssec-enable no;
                                 dnssec-validation no
                             /*include "/etc/named.root.key";       
                            此配置保存根域名服务器的私钥文件,根域名解析服务器为了防止DNS劫持,采用一种DNSSEC安全扩展技术,采用证书认证机制保证数据安全。
                            如果注释此配置则DNS服务器与根域名服务器之间传递解析不需要经过认证。
                            如果开启此配置如果根的私钥不匹配则无法正常解析,所以有时候我们配置缓存转发服务器的时候可以选择注释此项。
           2 区域转发
                    在子域 192.168.1.103上实现
                           vim /etc/named.rfc1912.zones
                            在最后一行添加:
                                    zone "alen.com" IN {
                                        type forward;
                                        forward only;
                                        forwarders { 192.168.1.102; };    //子域指向父域
                                    };
                            关掉dnssec验证机制
                                 dnssec-enable no;
                                 dnssec-validation no
    
    1.5 bind中安全相关的配置
            acl: 把一个或多个ip地址归并为一个集合,并通过一个统一的名称进行调用
                示例:   
                          acl mynet {
                                192.168.1.102;
                                192.168.1.103;
                                192.168.1.0/24;
                            }
    1.5.1 bind中四个内置的acl
               none: 没有一个主机
                any: 任意主机
                local: 本机
                localnet: 本机的IP同掩码运算后得到的网络地址  
    1.5.2 访问控制的命令
            allow-query {} : 允许查询的主机,白名单,注意:定义在zone中只控制一个zone,定义在options中控制所有的zone
            allow-transfer {}: 允许区域传送的主机: 白名单
            allow-recursion {}: 允许递归的主机
            allow-update {}: 允许更新区域数据库的内容
                        
    1.5.3  实例:
         1.5.3.1 192.168.1.102:
                vim /etc/named.conf
                        添加acl
                            acl slaves {    //定义访问控制列表slaves
                                192.168.1.103;
                                192.168.1.102;
                                1127.0.0.1;
                            }
                在/etc/named.rfc1912.zones中:
                 zone "alen.com" IN {
                        type master;
                        file "alen.com.zone";
                        allow-query { 127.0.0.1;  };    //只允许本机查询
                 };
                        # dig -t A www.alen.com    @127.0.0.1    // 其他任何ip都不能进行查询 
    
             1.5.3.2
                   添加:
                    allow-transfer { slaves; };  
                        # dig -t axfr alen.com @192.168.1.103    //只允许本机及子域传送 
              
               1.5.3 
                    全局配置中:
                    vim /etc/named.conf
                            注释 recursion {};
                        添加我们自己定义的允许递归的主机
                                allow-recursion { 192.168.1.102; 127.0.0.1; };    //只允许本机进行递归
                
                1.5.3.4 为了安全,一般allow-update都设为none
                        vim /etc/named.rfc1912.zones
                               zone "alen.com" IN {
                                        type master;
                                        file "alen.com.zone";
                               //      allow-query { 127.0.0.1;  };    //只允许本机查询
                                        allow-update { none; };    // 不允许任何主机更新
                                 };        

二、视图

2.1 view是什么?
    view是bind配置逻辑上的一个容器

2.2 为什么要使用视图?
    不同网络(比如联通和电信),或者不同区域(客户的来源距离),为了更好的客户体验,所以根据不同客户来源进行不同的zone配置,进而得到不同的请求结果。简单点说,为了实现不同客户请求得到不同的结果,所以用到view这个功能。
    
2.3 view的特点
            一个bind服务器可定义多个view,每个view中可定义一个或多个zone;
	每个view用来匹配一组客户端
	多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件

2.4 view的示例
        view VIEW_NAME {
		match-clients { };        //匹配不同的客户来源                     
                    zone;
    }
            注意:
		1. 一旦启用了view,所有的zone都只能定义在view中
		2. 仅有必要在匹配到允许递归请求的客户所在view中定义根区域
		3.客户端请求到达时,是自上而下检查每个view所服务的客户端列表

2.5 如何实现view的不同客户来源
     使用acl来实现:
          比如:acl  inet {
                        192.168.0.0/24;
                        127.0.0.1/8;
                    };

至此,DNS基本知识点介绍这些。DNS的常用架构不单单是一个主一个从,还有其他架构方式,应该在实际应用中视情况选择。

原文地址:https://www.cnblogs.com/ckh2014/p/10741950.html