概念部分

linux客户端默认的dns查找顺序:

   本地DNS缓存→本地hosts文件→首选的DNS服务器(递归)

linux的DNS服务器查找顺序:

首选服务器的DNS缓存→首选服务器自己所负责的域→向外迭代查询信息。

DNS缓存:

    ttl:time to live

    就是被请求的域名或主机名等对应的IP条目在客户端本地的有效时间。

    这个时间由被请求域的 主DNS服务器根据其条目的变化频率自行决定,而非本地可以定义。

    但是客户端本地可以查看和清除。例如:

    windows上:ipconfig/displaydns查看DNS缓存,ipconfig/flushdns清除DNS缓存。

迭代查询:

    一般由缓存DNS服务器向其他DNS服务器发起,从根"."开始,然后顶级域".com.",直到找到目标域。

递归查询:

    一般由客户端向缓存DNS服务器(首选DNS服务器)发起,然后由其向外进行迭代查询,返回给客户端的则是最终的答案。

权威应答:

    由被请求域的 DNS服务器 返回的答案。

非权威答案:

    由缓存服务器提供的答案,

缓存DNS服务器:

    直接响应客户端请求,为其从根开始直到返回答案,或者提供客户端已经被缓存过的条目。

转发DNS服务器:

    下层的DNS请求提交给转发DNS服务器时,它会根据配置将请求转发给更上层的DNS服务器

主DNS服务器:

    由管理员手动完成新条目的添加、删除及修改的服务器。同时向外提供权威DNS答案。

从DNS服务器:

    为了实现负载均衡、冗余等功能而设计的服务器。

    但是在主DNS服务器宕机一定时间后,从服务器也会停止响应服务。

DNS解析类型:

    正向解析:FQDN→IP,由FQDN查找IP。

              正向根:"."

    反向解析:IP→FQDN,由IP查找FQDN。

              反向根:".in-addr.arpa."

   提 示 域 :hint,当服务器在自己的服务器中找不到被请求的信息时,就去指定的"."去查找。


DNS服务器软件:

   bind:linux端软件

   powerdns:windows端软件。

下面以bind为例:

名称解析库:

    位于/var/named/,其中的部分".zone"结尾的文件中就存储我们需要查询的条目。

资源记录格式:

   /var/named/*.zone文件中存储条目的一种固定格式:

   [domain]    IN    [[RR type]     [RR data]]

   域名.       IN    SOA            管理此域的7个重要参数

   域名.       IN    NS             管理这个域的服务器的主机名字

   域名.       IN    MX   优先级    邮件服务器的主机名字

   主机名.     IN    A              IPv4的IP地址

   主机名.     IN    AAAA           IPv6的IP地址

   主机别名.   IN    CNAME          实际的主机名字


   IP          IN    PTR            实际的主机FQDN(这里必须是FQDN,不能有任何省略)

RR  data:

(注意:这里的主机名不是指hostname命令看到内容,而是DNS查询中所定义使用的主机名)

SOA:

   通常是第二行($TTL等为第一行),用于查询管理域名的服务器的管理信息。

   1、确定此域的 主DNS服务器 是哪个。

   2、管理员的Email地址。

      在创建资源记录时,会使用"@"代替"域名.",也就是配置文件中的zone后的"baidu.com."。

      所以由于@具有其他意义,所以这里使用"."替代。例如"root.baidu.com."。

   3、序列号,数字是越大越新,在从DNS服务器要判断是否主动下载新的资源记录条目时的依据。

   4、刷新频率,就是Slave(从DNS服务器)每隔多长时间主动向Master(主DNS服务器)发起更新。

      但在序列号没有增大时,就不会进行下载更新。

   5、重试时间,在上一次连接Master刷新失败的情况下,Slave会再隔一个"重试时间"重试刷新。

   6、失效时间,当重试一直在失败,直到达到"失效时间",那么Slave就不会重试刷新,

      而且停止DNS的响应服务器,等待管理员的处理。

      刷新时间 >=  重试时间*2

      刷新时间 + 重试时间 < 失效时间

      失效时间 >= 重试时间*10

      失效时间 >=  7天


   7、如果当资源记录内容中没有我们要求的条目,那么就会以此值作为查询端的TTL值。

NS:

   Name Server,指定当前域的DNS服务器有哪些。

   如果此域有从DNS服务器,就必须也写上。否则Mster不会主动通知Slave数据已经改变。

   后面必须同时指定NS记录中的服务器的A记录,也就是IP地址。

MX:

   查询当前域的邮件服务器的主机名。

   其数字部分表示优先级,数字越小,优先级越高。

   后面同样需要跟上其A记录。

注意:

   在域名相同的情况下,除第一个,其他的域名都是可以省略的,

   所以格式上习惯将SOA、NS、MX记录连续记录。

   而SOA又可以使用"@"符号进一步简化。

A:

   用来指定主机名对应的IPv4地址的。

AAAA:

   用来指定主机名对应的IPv6地址的。

CNAME:

   用来附加表示旧的主机名。


下面是一个以yy.com域为例的正向解析资源记录:

$TTL 600  ;使用宏定义了ttl值,前面不能有空白行
@       IN      SOA     dns1.yh.com.    root.yh.com. (
                        20140310 ;Serial
                        1H  ;Refresh
                        5M  ;Retry
                        7D  ;Expire
                        1M) ;Minumum TTL
        IN      NS      dns1  ;调用配置文件zone后的'yh.com.'域名
        IN      NS      dns2
        IN      MX  99  mail  ;此三行都借用SOA行的@,表示'yh.com.'
dns1    IN      A       192.168.25.11  ;dns1表示'dns1.yh.com.'
dns2    IN      A       192.168.25.12
mail    IN      A       192.168.25.17 ;这里是MX的A记录,否则MX记录无效
www     IN      A       192.168.25.13
pop     IN      A       192.168.25.13 ;一个IP可以对应多个主机名,但是更改时费事,建议用CNAME
ftp     IN      A       192.168.25.15
ftp     IN      A       192.168.25.16 ;一个主机可以对应多个IP,起到负载均衡的作用bind的配置文件

下面是yy.com域的反向解析资源记录:

$TTL 600
@       IN      SOA     dns1.yh.com.    root.yh.com. (
                        20140310 ;Serial
                        1H
                        5M
                        7D
                        1M)
        IN      NS      dns1.yh.com. //这里一定要写全,因为@不同了
        IN      NS      dns2.yh.com.
11      IN     PTR      dns1.yh.com.
12      IN     PTR      dns2.yh.com.
13      IN     PTR      www.yh.com.
13      IN     PTR      pop.yh.com.
15      IN     PTR      ftp.yh.com.
16      IN     PTR      ftp.yh.com.
//在反向资源记录中没有CNAME、MX记录

   注意:在正向和反向资源记录中可以使用$ORGIN这个宏,使得在value列也可以简写。


bind的配置文件:

rpm -ql  bind-utils

   /usr/bin/dig    现在主流DNS测试工具。

   /usr/bin/host   在不联网的情况下,可能会与dig产生不同答案。

   /usr/bin/nslookup 通用于windows的工具


下面是dig的使用方法:

dig -t 资源记录类型 名称 [@dns_server_ip]
dig -x IP    反向解析
dig +trace   显示全部解析的追踪过程
dig -t axfr yh.com  对yh.com域进行完全区域传送
dig -t NS   yh.com  查询yh.com的NS记录
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
注意:
    dig命令不会使用本地DNS缓存和hosts文件进行查询,而是直接询问首选DNS服务器
    dig命令的结果行中flag中如果有aa表示权威回答。


下面是nslookup在windows上的使用方法:

nslookup
server 192.168.25.11 使用指定的dns_server_ip
set q=a
www.yh.com  查询www.yh.com的A记录
set q=NS
yh.com    查询yh.com的ns记录


rpm -ql  bind:

   /etc/named.conf    主配置文件

   /etc/named.rfc1912.zones    定义了本地配置文件。被包含在named.conf中


在/etc/named.conf中:

   //    表示注释单行内容

   /* 多行内容 */    表示注释多行内容

options 表示全局配置:

   directory       "/var/named"; //表示named进程工作的目录,其区域文件存放就是以此                                         //作为相对目录的

   allow-transfer { none; };     //在全局配置中定义表示哪些主机进行全部区域的传送。

                                 //在zone中定义则表示可以哪些主机可以对此区域传送

                                 //none,表示所有的不可以。还可以使IP地址

   recursion  yes;              //表示允许递归

   allow-query { IP; };          //表示允许进行DNS查询的IP

   forwarders  {

                   IP1;

                   IP2;

   }

   forward  only|first;           //only表示只等待上层DNS服务器的结果,即使是错误结果

                                  //first表示如果上层没有查到结果,转发服务器自己从头查

   allow-update { IP; };         //表示进行DDNS。

                                 //如果当主DNS服务器写好资源记录文件后,但是下面的各个

                                 //主机却使用的DHCP得到IP,那么下次分配就会无效。

                                 //所以DDNS就是使DNS服务器与DHCP服务器进行互动。一般禁用

   注意1:以上内容有部分是可以写入区域配置中的,以增加策略的可控性。

   注意2:上面内容中提到的none、any、local是bind软件内置的访问控制列表,方便下面引用。

           而我们自己也可以定义,但是必须写到options前面:

例子:定义192.168.25.12这个地址到一个acl自定义列表,方便引用和修改:
acl aclip {
            192.168.25.12;
};


下面是主、从区域配置文件定义的格式:

主DNS服务器的区域配置:
zone "yh.com" IN {
    type master;
    file "yh.com.zone";
    allow-transfer { aclip; }; //只允许aclip中定义的IP可以传送
};
zone "25.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.25.zone";   //这里的名字做好见名知义就好
};
从DNS服务器的区域配置:
zone "yh.com" IN {
    type slave;
    file "slaves/yh.com.zone"; //注意slaves文件的属主、属组、权限
    allow-transfer { none; };  //不允许对Slave完全区域传送
    masters { 192.168.25.10;   //注意master的复数,所以可以写多个
              192.168.25.11;   //无论有多少个Mster,都要有分号。
            };
};
转发DNS服务器的区域配置:
zone "baidu.com" {            //这里专门定义转发区域,为了精确控制
    type forward;
    forward only;
    forwarder {
                8.8.8.8;
                202.106.0.20;//防止8.8.8.8宕掉而断线。


配置文件检查工具:

   named-checkconf

       检查named.conf这个主配置文件的正确性。

       在未按照chroot的情况下,直接使用此命令即可,否则需要指定路径。

       正常情况没有任何输出,表示没有错误。

区域文件检查工具:

   named-checkzone  "zone"  /PATH/TO/zone_file

       例如:named-checkzone  "yh.com"  /var/named/yh.com.zone


配置文件及其所在目录的属主、属组和权限:

目录名
属主属组默认权限
/var/named/rootnamed750
/var/named/slave/named
named770
/var/named/zone_fileroot
named640
/var/named/slaves/zone_filenamed
named644

注意:在实验时,由于使用root登录创建的/var/named/zone_file文件,

           所以需要修改其属组为named,权限为640。

日志查看:

主DNS服务器的日志变化:
#tail  -f  /var/log/messages
reloading configuration succeeded //重载配置成功
reloading zones succeeded         //重载区域文件成功
zone yh.com/IN: loaded serial 20140311 //载入新序列号
zone yh.com/IN: sending notifies (serial 20140311) //发送通知
client 192.168.25.12#39235: transfer of 'yh.com/IN': AXFR-style IXFR started            
                                 //开始完全区域传送
client 192.168.25.12#39235: transfer of 'yh.com/IN': AXFR-style IXFR ended              
                                //完全区域传送成功结束
从DNS服务器的日志变化:
#tail  -f  /var/log/messages
client 192.168.25.11#46123: received notify for zone 'yh.com'
                               //接受Master的通知
zone yh.com/IN: Transfer started.
                               //区域传送开始
transfer of 'yh.com/IN' from 192.168.25.11#53: connected using 192.168.25.12#39235
zone yh.com/IN: transferred serial 20140311
transfer of 'yh.com/IN' from 192.168.25.11#53: Transfer completed: 1 messages, 15 records, 354 bytes, 0.002 secs (177000 bytes/sec)


rndc:

   Remote Name Domain Contoller,远程名称控制器

   选项:

       reload   重新载入配置文件和区域资源记录文件

       reconfig 只重读配置文件

       stats    显示区域状态信息

       stop     停止工作

       flush    清空DNS缓存

       querylog 打开查询日志,在使用service named restart就会被关闭,包括调试级别。

       trace    多次重复执行此命令,依次增加调试级别,

       notrace  关闭调试

       trace  LEVEL  直接跟上调试级别,0表示关闭,1,2,3表示最高


   下面是rndc显示的信息:

#rndc  status
version: 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1
CPUs found: 8
worker threads: 8
number of zones: 20
debug level: 3    调试级别
xfers running: 0  正在进行区域传送的个数
xfers deferred: 0 区域传送发生延迟的个数
soa queries in progress: 0   从DNS定期进行刷新时需要查询SOA序列号
query logging is ON          客户端查询的记录,调试用,一般关闭
recursive clients: 0/0/1000  正在进行递归查询的客户端的个数
tcp clients: 0/100           TCP连接的个数,比如进行区域传送时
server is up and running     状态


   注意:当使源码包进行安装时rndc.conf是不提供的,需要手动生成:

         #rndc-confgen > /etc/named/rndc.conf

         然后将/etc/rndc.conf的后半部分按照提示剪切到named.conf文件中


DNS的转发:

   就是将所有本机不负责的区域的解析请求转发到其他的DNS服务器上,比如转发到8.8.8.8

   设置方法有两种:

   一:在全局设置中定义:

       forward only;只转发DNS请求。

       forward first;先匹配本地的DNS域,如果没有,再进行转发。与上面二选一。

       forwarders { 8.8.8.8; 4.4.4.4;};这里指定上层的DNS服务器。

   二:仅转发特定区域的请求。(优先级高于全局配置)

       zone "baidu.com" IN {

               type forward;

               forwarders { 8.8.8.8;  4.4.4.4; };

       };

子域授权:

   就是将子域的管理任务分配到子域的DNS服务器,以减轻父域的压力。

   授权方式步骤:

   父域是yh.com(Master:192.168.1.210,Slave:192.168.1.215)

   子域是ziyu.yh.com(Master:192.168.1.212,Slave:192.168.1.214)


   (1)主配置文件中的区域zone仍然不变。依然是父域的名字。

zone "yh.com" IN {
    type master;
    file "yh.com.zone";
    allow-transfer { 192.168.1.215; };
};

   (2)创建父域的资源记录文件:

$TTL 600
$ORIGIN yh.com.
@       IN      SOA     dns.yh.com.     root.yh.com. (
        2014031201
        10M
        3M
        7D
        5M )
        IN      NS      dns
        IN      NS      dns2
dns     IN      A       192.168.1.210
dns2    IN      A       192.168.1.215
www     IN      A       192.168.1.210
$ORIGIN ziyu.yh.com.  ;后面的@表示统配前面的$ORIGIN
@       IN      NS      dns  ;这里需要添加子域DNS服务器的NS
dns     IN      A       192.168.1.212 ;子域DNS的A记录

   (3)修改父域资源记录文件属主、属组及权限。

# chmod 640 /var/named/yh.com.zone
# chown root.named /var/named/yh.com.zone
# ls -lh /var/named/yh.com.zone
-rw-r----- 1 root named 265 Mar 12 22:15 /var/named/yh.com.zone

   (4)创建父域的Slave的主配置文件

   (5)将Master和Slave的首选DNS改为自己的IP,否则在创建好子域后,使用named-checkzone

       检查时仍然报错。

   (6)创建子域的主配置文件、资源记录文件,并修改资源记录文件的属主、属组及首选DNS。

$TTL 600
$ORIGIN ziyu.yh.com.
@       IN      SOA     dns.ziyu.yh.com.        root.ziyu.yh.com. (
        2013031301
        10M
        3M
        7D
        5M )
        IN      NS      dns
        IN      NS      dns2
dns     IN      A       192.168.1.212
dns2    IN      A       192.168.1.214
www     IN      A       192.168.1.212

  (7)测试。

DNS服务器端打开:
#rndc trace 3
#rndc querylog
#tail -f /var/named/RR_NAME
客户端打开:
#dig

DNS服务器的VIEW功能:

   就是依据不同接口给予不同的DNS主机名:

   就是将来自联通网络接口的DNS请求发送到具有联通IP的网络服务器上面

   将来自电信网络接口的DNS请求发送到具有电信IP的网络服务器上面

   更细致的划分可精确到省、市,以提高对客户端的相应效率。
定义VIEW的方法:

view "liantong" {
    match-clients { 192.168.1.0/24; };
    zone "yh.com" IN {
        type master;
        file "liantong.yh.com.zone";
    };
};
view "dianxin" {
    match-clients { 192.168.20/24; };
    zone "yh.com" IN {
        type master;
        file "dianxin.yh.com.zone";
    };
};
view "qita" {
    match-clients { any; };
    zone "yh.com" IN {
        type master;
        file "qita.yh.com.zone";
    };
};
注意:view在匹配顺序是自上而下,所以any必须卸载最后面。
    而且如果定义内网、外网客户端时,需要注意允许递归的问题。

   注:当view过多时,比如为全球的各个区域都划分一个view,那么这个配置文件将会变的非常大,

       而bind工作特性是在启动时就将配置文件都读入内存,那么bind将非常耗费资源,而且在

       启动和reload都非常耗时,所以这时就需要使用数据(比如mysql)了。

dns的测试工具:

   dnstop:需要编译安装。

  dnssec:

   queryperf:需要编译安装,在BIND9中的contrib目录有。需编译安装。

           -d:指定一个包含被查询资源名称和资源类型。例如www.yh.com  A

           -s:指定DNS服务器的IP地址。

        在实际使用时,如果查询包含PTR记录,那相应速度会很慢,因为不支持PTR测试。

        而且开启和关闭querylog也会极大的影响结果。

   注意:测试需要在线下进行,否则IDC机房管理员会因为流量异常,将其服务器强制下线。

日志:

   channel categroy

   categroy:记录bind的哪个功能(比如区域传送、查询)产生的日志信息。一般内置15种category。

            一个categroy产生的日志可以发送到多个channel中。

   channel:将日志记录到什么地方,一般有两种。

           一:file,比如是写入到自己/var/log/query.log中。

           二:rsyslog,将日志发送到专门的日志服务器中,需要指定日志级别。

                       性能上比第一种纯粹的写入到文本文件中要好很多。

           一个channel只能记录一个categroy产生的日志。

bind的日志级别:

   1、critical:最高级别报警。

   2、error   :出现一些必须处理的问题,

   3、warning:警告信息。

   4、notice :需要关注的。

   5、info   :默认的,正常运行中缠身的信息。

   6、debug  :调试信息

   7、dynamic:


日志滚动:

   对于某些日志文件,每天会有大量的日志写入。

   随着时间增加,这些文件将会变的很大,那么存储、备份和分析就变的很困难。

   所以需要定时将以前的日备份。

   version  3  size  10K;

   version:表示日志滚动。

   10K    :表示当日志达到10K时就将其重命名另存,但是这里的10K并不是准确的。

   3      :表示在日志第一次另存时命名为log1,而第二次则将log1改名为log2,将新文件存log1.

            如此循环,旧的文件就会被压缩保存。