Linux运维实战之DNS综合实验

本次博文主要是对Linux系统中DNS知识的总结。

DNS的基础知识(参见http://sweetpotato.blog.51cto.com/533893/1596973

DNS的基础配置(参见http://sweetpotato.blog.51cto.com/533893/1598225

DNS的高级配置(参见http://sweetpotato.blog.51cto.com/533893/1607383

【本次博文的主要内容】

1、以一个综合案例总结Linux系统中DNS的配置

2、BIND的日志功能


一、Linux系统中的DNS综合实验:

【项目案例】
1、在第一台Linux主机上实现根域服务器,并完成对.com, .net, .org三个子域的授权;不允许递归;
2、在第二台Linux主机上实现一级域.com, .net, .org的正向及反向解析;并完成magedu.com, test.net, magelinux.org三个子域的授权;不允许递归;
3、在第三台Linux主机上实现以上两台DNS服务器的辅助DNS;
4、第四台Linux主机上实现magedu.com, test.net和magelinux.org域的解析;给本地客户端(win7物理机)递归;

要求:给出规划拓扑图
1、每台DNS服务器的根服务器named.ca文件的内容中,根要指向第一台DNS服务器建立的根;
2、本地客户端把服务器指向任一台,要能实现全网解析;

  • 实验拓扑:

    技术分享

    实验步骤:

    【准备工作】:按照上面的网络拓扑部署好虚拟机,并为每台虚拟机配置好网络,保证网络的互联互通;

    1、配置根域DNS:

    (1)在IP地址为192.168.80.11的Linux主机上,用yum安装bind服务(详见上一篇博文http://sweetpotato.blog.51cto.com/533893/1598225,此处不再赘述);

    (2)修改主配置文件:

    [root@Centos ~]# cat /etc/named.conf
    
    options {
        directory "/var/named";
        recursion no;      //不允许递归
    };
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
    
    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 "." IN {                 
        type master;              //我们自己建根域,所以类型为master
        file "root.zone";
    };

    (3)创建根域的区域文件(/var/named/root.zone):

    [root@Centos ~]# cat /var/named/root.zone 
    $TTL 3600
    @     IN    SOA    root.   admin. (
            2015010701
            5H
            2H
            7D
            1D )
          IN    NS    root.
    root.    IN    A    192.168.80.11

    (4)修改主配置文件和区域文件的权限:

     

    [root@Centos ~]# chgrp named /etc/named.conf
    [root@Centos ~]# chmod 640 /etc/named.conf
    [root@Centos ~]# ll /etc/named.conf
    -rw-r-----. 1 root named 1025 Jan  7 20:09 /etc/named.conf
    [root@Centos ~]# chown :named /var/named/root.zone 
    [root@Centos ~]# chmod 640 /var/named/root.zone 
    [root@Centos ~]# ll /var/named/root.zone
    -rw-r-----. 1 root named 128 Jan  7 19:58 /var/named/root.zone

    (5)用dig命令验证配置的正确性:

    技术分享

    2、配置一级域DNS(实现一级域.com, .net, .org的正向及反向解析):

    【配置正向解析】:

    (1)在IP地址为192.168.80.12的Linux主机上,用yum安装bind服务;

    (2)修改主配置文件“/etc/named.conf”;

  • 技术分享

    (3)在”/etc/named.rfc1912.zones”文件中定义区域(com、net和org):

    技术分享

    (4)将“/var/named/named.ca”文件的内容改为我们自建的根DNS的内容:

    技术分享

    (5)在“/var/named/”目录下新建三个区域文件(com.zone,net.zone,org.zone):

    技术分享

    技术分享

    技术分享

    (6)修改com.zone,org.zone和net.zone的权限及属组,并检查语法:

    技术分享

    (7)在根域DNS(192.168.80.11的主机)上对刚刚创建的三个域做子域授权:

    【子域授权】

    子域授权的基本理论在我的前两次博文中具体介绍过了,这里不再赘述(参见http://sweetpotato.blog.51cto.com/533893/1596973)。

    子域授权创建步骤:

    第一步:划分子域(例如上面即是对根域.划分了三个子域com./net./org.)。

    第二步:完成授权

    在主DNS(192.168.80.11主机)上完成子域的授权,即添加子域相应的NS记录和粘附A记录:

    技术分享

    (8)用rndc reload命令重新载入根域DNS和一级域DNS的配置文件和区域文件;

    (9)用dig命令在根域DNS(192.168.80.11主机)服务器上测试:

    技术分享

    技术分享

     

    【配置反向解析】

    下面配置反向解析区域,使得一级域DNS(192.168.80.12主机)既能够实现正向解析也能够做反向解析。

    (1)修改主配置文件“/etc/named.rfc1912.zones”,加入以下内容:

    技术分享

    说明:

    反向解析的子域授权比较麻烦,在内网做的话, 基本上都是整段授权, 所以比较容易。而对于不满一个网段的授权,就很复杂了, 差不多有两种方法, 第一种是一个IP一个zone, 另外一种是CNAME 。

    这里不做过深的研究,只以com域为例演示反向区域的解析,并把实验适当简化(朋友们做相关实验的时候,最好每个一级域用一个网段实现)

    (2)在/var/named/目录下创建区域文件“name.com.zone”:

    技术分享

    这里我们只配置com域的反向解析哈,其他两个就不做了。

    (3)设置好权限和属组并重新加载配置文件和区域文件;

    (4)用dig命令检验配置结果:

    技术分享

     

    3、在192.168.80.13Linux主机上实现根域和一级域DNS服务器的辅助DNS:

    (1)安装bind服务并编辑主配置文件/etc/named.conf:

    技术分享

    (2)编辑/etc/named.rfc1912.zones,添加如下记录:

    技术分享

    (3)在根域DNS(192.168.80.11主机)的区域文件/var/named/root.zone中添加辅助DNS的NS记录和相应的粘附A记录,并重新加载区域文件:

    技术分享

    用dig命令测试:

    技术分享

    (4)在辅助DNS(192.168.80.13主机)上,编辑/var/named/named.ca文件,将上图中用dig命令查询的结果复制到/var/named/named.ca中:

    技术分享

    (5)在一级域DNS(192.168.80.12主机)的区域文件/var/named/root.zone中添加辅助DNS的NS记录和相应的粘附A记录(注意修改序列号),并重新加载区域文件:

    技术分享

    (6)在辅助DNS上启动named服务;

    (7)在辅助DNS上查看相应的区域文件是否已经同步过来:

    技术分享

    (8)用dig命令验证:

    技术分享

    技术分享

    4、在192.168.80.14Linux主机上实现magedu.com, test.net和magelinux.org域的解析,并给本地客户端(win7物理机)递归:

    (1)修改主配置文件:

    技术分享

    (2)创建区域文件:

    技术分享

    其它两个区域文件参照写即可,篇幅限制,不在赘述!

    (3)编辑/var/named/named.ca文件,将根域的NS记录和A记录添加进去:

    技术分享

    (4)检查配置文件和区域文件的属主、属组,并检查语法错误;

    (5)在一级域DNS(192.168.80.12主机)上,完成子域授权,并重新载入区域文件:

    技术分享

    其它二个子域的授权参照即可。

    (6)回到二级域DNS(192.168.80.14主机),启动named服务;

    (7)在win7物理机上测试:

    技术分享

    5、配置ACL:

    在上面的案例中,二级域DNS服务器允许所有客户端递归查询(只要网络通信没问题),例如在一级域DNS服务器上查询:

    技术分享

    我们可以定义ACL,只允许我们指定的主机来查询。ACL的基础知识参见上篇博文http://sweetpotato.blog.51cto.com/533893/1607383

    【配置ACL】

    在二级域DNS服务器上配置ACL,只允许本机回环地址127.0.0.1查询:

    (1)先定义acl:

    技术分享

    (2)acl定义后需要应用在区域文件中:

    技术分享

    (3)重新载入配置文件;

    (4)验证结果:

    上面用192.168.1.3这台win7物理机查询是可以查到的,现在再次做查询:

    技术分享

    拒绝查询哈!


    二、BIND的日志功能:

  • 1、BIND的日志系统基础:

    在默认情况下,bind服务把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。bind日志配置是非常灵活,可以详细记录服务运行状况,自定义某些敏感信息、日志滚动等等。

    【BIND的日志定义】

    对bind来讲他的所有日志功能都是在主配置文件named.conf中的logging段中来记录的,而bind系统非常灵活,是由2组来定义:

    (1)定义一个channel,channel主要定义日志被发送到的位置;

    (2)定义哪些日志发送至channel或channel的日志发送到哪个位置;

    语法格式如下:

    logging{
    
           channel default_debug {              #定义channel;这里的defualt_debug 为自定义的channel名称
    
                   file"data/named.run";          #记录日志保存的位置
    
                   severity dynamic;              # severity定义日志级别;
           };
    
    };

    2、日志定义流程:

    (1)定义channel,主要定义日志被发送到哪里去;

    (2)category:比如启动一次区域传送,区域传送本身会产生日志或发送了一次区域查询也会产生日志,这是2个所谓不同的功能所产生的日志;

    (3)事实上bind一共内置15种category,在定义日志信息产生日志位置的时候也只能使用其中一种;

    (4)产生的信息可以被发往channel中去,由channel来决定发往哪个位置;

    (5)同一个category可以发往多个channel,但是一个channel只能记录一个category发来的信息;

    3、日志级别:

    所谓日志级别是所产生的信息有些是纯粹的调试信息,有些是说明信息,有些是警告,有些是紧急信息,所以这些信息的紧急程度也是有级别的。

    rsyslog总共定义了7种日志级别:

    critical   :紧急的,最高级别

    error

    warning :警告信息

    notice :需要引起注意

    info :默认级别

    debug[level]

    dynamic

    当我们指定日志级别之后包括这个级别以及比这个级别高的所有信息都会记录,而critical 是最高级别

    query日志级别共15个,分别为:

    default   #default类别匹配所有未明确指定通道的类别,但是不匹配不属于任何类别的消息。这些不属于任何类别的消息属于下面列出的这些类别。
    general   #包括所有未明确分类的BIND消息。
    client    #处理客户端请求。
    config    #配置文件分析和处理。
    database  #同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
    dnssec    #处理DNSSEC签名的响应。
    lame-servers  #发现错误授权。
    network       #网络操作
    notify        #异步区变动通知。
    queries       #查询日志
    resolver      #名字解析,包括对来自解析器的递归查询的处理。
    security      #认可/非认可的请求。
    update        #动态更新事件xfer-in       #从远程名字服务器到本地名字服务器的区传送。
    xfer-out      #从本地名字服务器到远程名字服务器的区传送。

    4、定义日志

    编辑主配置文件,找到logging段:

    [root@Centos ~]# cat /etc/named.conf
    
    logging{ 
    
           channel default_debug {
    
                   file"data/named.run";
    
                   severity dynamic;
    
           };
           channel querylog {                    #定义channel
                   file"/var/log/bind_query.log" versions 10 size 10M ;    #定义日志文件保存绝对路径,指定vsersions版本为10 日志大小为10M,超过10M则自动滚动
    
                     severity dynamic;              #定义日志级别为dynamic (动态)
    
                   print-time yes;                #记录额外信息
    
                   print-category yes;            #记录category信息
    
                   print-severity yes;            #记录日志级别信息
    
           };
    
           category queries { querylog; };     #query必须是15个级别中的其中一个,将query日志信息保存至刚定义的querylog组里去,
                                               #category日志可以发送至多个channel,但一个channel只能接收一个category信息
    };

    特别注意:

    query必须是15个级别中的其中一个,将query日志信息保存至刚定义的querylog组里去,category日志可以发送至多个channel,但一个channel只能接收一个category信息。

    最开始是没有日志文件的,方便起见,来手动创建配置文件,并授权:

    [root@Centos ~]# touch /var/log/bind_query.log
    
    [root@Centos ~]# chown named.named /var/log/bind_query.log
    
    [root@Centos ~]# named-checkconf
    
    [root@Centos ~]# rndc reload

    测试:

    我们使用另外一台测试机来对其使用dig命令查询解析

    [root@Centos ~]# dig -t A www.test.com @192.168.80.11

    再来查看其日志文件:

    [root@Centos ~]# tail /var/log/bind_query.log
    
    Jan 24 17:41:38  queries: info: client 192.168.80.11#32960: view internal: query:www.test.com IN A + (192.168.80.11)

    这里是使用query来实现日志的定义,如果将日志发往syslog的话,syslog会自动记录时间。

    小结:

    1、bind日志通过named.conf中的logging段来自定义的

    2、“channel”用来定义日志信息记录在何处,一般有两种形式:file 或syslog

    3、“category”记录哪个功能产生的日志信息,内置有15种category,不能自定义,只能使用其中一个,一个category产生的日志可以发往多个channel;而一个channel只能为一个category记录日志。



    本次博文的内容就这么多,欢迎各位指出错误之处!~~

    本文出自 “技术日志” 博客,请务必保留此出处http://sweetpotato.blog.51cto.com/533893/1607730

    郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。