最近遇到问题,在防火墙上看到的预警信息内容只限于访问某某域名,但现实情况是需要查到是哪个IP地址的设备访问这个域名,算是一个痛点。

1 定位访问某个域名的IP和时间信息

首先分析配置文件 named.conf。

// named.conf
options {
......
            logging {
                    channel queries_info {
                            file "/var/named/log/Query.log";
                            severity info;
                            print-category yes;
                            print-severity yes;
                            print-time yes;
                    };

                    category queries {
                            queries_info;
                            default_debug;
                    };

                    category resolver {
                            queries_info;
                            default_debug;
                                };
            };

......

可见,日志文件配置创建了一个名为 "queries_info" 的日志通道,并将日志级别设置为 "info"。此外,它还定义了两个类别: "queries" 和 "resolver"。其中 "queries" 类别使用了 "queries_info" 通道和默认的调试级别,而 "resolver" 类别也使用了 "queries_info" 通道和默认的调试级别。这些类别可以帮助管理员对 DNS 服务器进行故障排除和监控。最后,这些日志条目包含时间戳、类别和级别信息。

print-category、print-severity 和 print-time 是三个用于定义日志记录格式的参数。其中,print-category 参数表示是否在日志中记录类别信息;print-severity 参数表示是否在日志中记录日志级别信息;print-time 参数表示是否在日志中记录时间戳信息。在这个配置中,这些参数都被设置为 "yes",因此日志信息中将包含类别、级别和时间戳等元数据信息。

cat /var/named/log/Query.log

呈现结果如下:

DNS服务器中BIND服务的生产案例——日志分析_日志输出

查找访问百度的IP有哪些

grep "query: www.baidu.com" /Query.log

结果如下:

DNS服务器中BIND服务的生产案例——日志分析_日志输出_02

2 Log日志按天备份,只保留一年的日志

分析发现,直接修改named.conf难以实现该功能(https://www.zytrax.com/books/dns/ch7/logging.html

下面是一个通用模板。

logging {
   [ channel channel_name {
     ( file path name
         [ versions ( number | unlimited ) ]
         [ size size_spec ]
       | syslog syslog_facility
       | stderr
       | null );
     [ severity (critical | error | warning | notice |
                 info | debug [ level ] | dynamic ); ]
     [ print-category yes | no; ]
     [ print-severity yes | no; ]
     [ print-time yes | no; ]
   }; ]
   [ category category_name {
     channel_name ; [ channel_name ; ... ]
   }; ]
   ...
};

让我们逐个分析每个部分的含义:

  • logging:这是一个日志记录的主要块(block),其中包含了一些 channel 和 category 块用于配置和定义日志信息。
  • channel: 这个块用于定义一个日志记录渠道,指定日志的输出位置。可以通过 file 参数将日志记录到文件中,也可以使用 syslog 参数将日志发送到系统日志服务或其他日志处理器。如果需要将日志输出到控制台,则可以使用 stderr 参数,而如果不需要进行记录,则可以使用 null 参数。
  • channel:表示当前块定义的是一个 channel。
  • channel_name:是所定义的 channel 的名称,可以自定义命名以便区分不同的日志信息。
  • file:是将日志输出到文件的标识符。
  • path name:表示日志输出到哪个文件。name 部分表示文件名称,path 部分表示文件路径,可以是相对路径或绝对路径。
  • versions:指定日志文件保留的历史版本数,可以限制日志文件数量,设置为 unlimited 表示无限制。
  • size:表示日志文件的大小限制。size_spec 为数字,可以是 bytes、kilo-bytes、mega-bytes 等单位。
  • syslog:将日志输出到系统日志服务的标识符。
  • syslog_facility:表示日志输出到系统日志服务使用的设备类型,通常为 auth、cron、daemon、user、local0 到 local 7 等。
  • stderr:将日志输出到控制台窗口。
  • null:表示不进行日志记录。
  • severity:这个参数用于指定日志级别,用来决定哪些日志信息应该被记录。可以设置为 critical、error、warning、notice、info、debug 或 dynamic,其中 dynamic 表示将根据运行时情况动态地调整日志级别。level 参数用于指定 debug 级别运行的具体程度。
  • print-category、print-severity 和 print-time:这些参数用于定义日志的元数据信息(例如类别、级别和时间戳),并且指定是否将它们包含在日志信息中。

另外,还有 category 块,该块用于将多个 channel 绑定到一个类别中。通过这种方式,可以轻松地控制不同类型的日志信息记录到何处,并进行更好的管理和排查。

由上分析可知,只有logrorate服务才能满足这个要求。

logrorate用于管理日志文件轮换(log rotation)。日志文件轮换是指对日志文件进行周期性地备份、压缩或删除,以避免单个日志文件变得过大和占满磁盘空间。logrorate 可以根据预先定义的条件(如文件大小、时间间隔等)自动轮换日志文件,并在轮换过程中执行一些后续操作(如压缩、重命名、发送通知等)。

logrorate 可以读取和解析配置文件,其中包括定义轮换条件的规则。这些规则通常包含以下内容:

  • 文件路径:指定要轮换的日志文件路径。
  • 轮换条件:例如每天、每周或每个月,或者当日志文件达到一定大小时进行轮换。
  • 轮换操作:指定在轮换过程中要执行的操作(如备份、重命名、删除等)以及要执行的顺序。
  • 保留策略:定义要保留的历史轮换文件的数量和时间,以避免磁盘空间被占满。

因此,进入logrotate.d文件夹,创建一个Dnslog服务

cd /etc/logrotate.d/
vim Dnslog

内容如下

/var/named/log/Query.log
{
        rotate 400
        daily
        missingok
        notifempty
        dateext
    postrotate
        echo "Log file has been rotated!"
        rndc reload
    endscript
}

该配置文件指定了要轮换的日志文件路径为 /var/named/log/Query.log,同时定义了一些轮换选项:

  • rotate 400:表示要保留的历史轮换文件数目。在轮换时,会将当前日志文件重命名为 Query.log.0,以备份当前日志文件,然后将之前的日志文件 Query.log.0 依次重命名为 Query.log.1、Query.log.2,直到 Query.log.399。因此,在轮换完成后,将有 400 个历史轮换文件。
  • daily:表示按天轮换日志文件,每天结束时执行一次轮换操作。
  • missingok:表示如果日志文件不存在,则忽略轮换操作。
  • notifempty:表示如果日志文件为空,则忽略轮换操作。
  • dateext:表示在历史轮换文件名中添加日期后缀(例如 Query.log.20230513),以便更好地区分不同的历史文件。如果不添加此选项,则历史文件名将直接按数字编号(例如 Query.log.0、Query.log.1)命名。

让配置生效吧!

# 首先,设置log的路径权限为775
logrotate --verbose /etc/logrotate.conf
# 重置bind日志路径
# 玄学!!!  要先设置log的路径权限为777,让正常生成Query.log
systemctl restart named-chroot
systemctl status named-chroot.service
# 然后,设置log的路径权限为775,保证logrotate正常运行
rndc reload # 为了让写入句柄更新
# 两个都试一下,看看情况
logrotate -f /etc/logrotate.conf
logrotate --verbose /etc/logrotate.conf

看看效果

DNS服务器中BIND服务的生产案例——日志分析_日志输出_03

如下效果才正确。Query.log还处于写入状态!也能切分log。

DNS服务器中BIND服务的生产案例——日志分析_日志记录_04

3 总结

cd /.../log # log目录要设置权限 775
grep "query: www.baidu.com" Query.log-20230512

今后有条件可以基于此,写一个查询网页,Enjoy~