1.简单的实现日志功能—打开DNS的日志系统只需在主配置文件中添加querylog字段即可;
1.1主配置文件:
[root@localhost ~]# cat /etc/named.conf
acl innet_acl {
192.168.85.0/24;
};
acl outnet_acl {
122.207.210.0/24;
};
options {
directory "/var/named";
allow-recursion { innet_acl; };
querylog yes;
};
重启服务
1.2 测试
[root@localhost ~]# dig -t A @192.168.85.128
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t A @192.168.85.128
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49397
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;. IN A
;; ANSWER SECTION:
. 600 IN A 192.168.85.133
;; AUTHORITY SECTION:
mageedu.com. 600 IN NS ns1.mageedu.com.
;; ADDITIONAL SECTION:
ns1.mageedu.com. 600 IN A 192.168.85.128
;; Query time: 5 msec
;; SERVER: 192.168.85.128#53(192.168.85.128)
;; WHEN: Tue Aug 4 04:42:19 2015
;; MSG SIZE rcvd: 83
测试日志:
[root@localhost ~]# tail /var/log/messages
Aug 4 04:36:46 localhost dhclient[5952]: bound to 192.168.85.128 -- renewal in 830 seconds.
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> (eth0): DHCPv4 state changed renew -> renew
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> address 192.168.85.128
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> prefix 24 (255.255.255.0)
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> gateway 192.168.85.2
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> nameserver '192.168.85.2'
Aug 4 04:36:46 localhost NetworkManager[1719]: <info> domain name 'localdomain'
Aug 4 04:36:50 localhost named[6868]: invalid command from 127.0.0.1#35270: bad auth
Aug 4 04:36:51 localhost nm-dispatcher.action: Script '/etc/NetworkManager/dispatcher.d/13-named' exited with error status 1.
Aug 4 04:42:19 localhost named[6868]: client 192.168.85.128#44657: view innet: query: IN A + (192.168.85.128)
2.主配置文件中使用logging字段
在默认情况下,BIND把日志消息写到/var/log/messages文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错
误的消息,所以要详细记录服务器的运行状况需要自己配置服务器的日志行为。也就是要在配置文件named.conf中使用logging语句来定制自己
在日志中主要有两个概念:通道(channel)和类别(category)
通道channel:指定了将日志保存在哪,是发送给syslog,还是写在一个文件里,或是发送给named的标准错误输出,还是发送到位存储桶(bitbucket);
类别category:规定了哪些数据需要记录即通过category定义日志来源,来源包括查询的,区域传送的等;
注意:一个category可以被定向到多个channel,但是一个channel只能属于一个category;
和syslog或者rsyslog一样,DNS日志系统也有级别,其级别由channel来定义,简单的例子比如:
channel channel_name” {日志方式 由谁来记录;级别;}
channel default_syslog { syslog daemon; severity info; }
channel default_debug { file “named.log”; severity dynamic; }
channel default_stderr { stderr; severity info; };
channel null { null; };
其中,severity指定记录消息的级别(默认是info),而
在bind中主要有以下几个级别(按照严重性递减的顺序):
critical
error
warning
notice
info
debug [ level ]
dynamic
如果需要记录到文件当中,还可以定义额外的信息如:
print-time:设定在日志中是否写入时间;
print-severity:设定在日志中是否写入消息级别;
print-category:设定在日志中是否写入消息的category;
注意:
定义了某个级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息即该级别和其上面的级别。比如定义级别为error,则会记录critical和error两个级别的信息;
综上所述,综合的logging语句的语法为:
logging {
channel channel_name {
file “文件”; | syslog daemon; | null; | stderr;
severity level;
print-time ;
print-severity ;
print-category ;
};
category { ; ... };
};
下面介绍category:
category语句指定哪一种类别的数据源使用哪个channel或者哪个已定义的channel。
在bind中类别有15个:
default
:匹配所有未明确指定通道的类别,但是不匹配不属于任何类别的消息,这些不属于任何类别的消息属于下面列出的这些类别。
我看的资料上是这么说的:为所有的category定义默认的channel,当然实际上定义的是category;
general
:包括所有未明确分类的BIND消息。
client
:处理客户端请求。
config
:配置文件分析和处理即配置文件产生的问题信息。
database
:同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
dnssec
:处理DNSSEC签名的响应。
lame-servers
:发现错误授权。
network
:网络操作
notify
:异步区变动通知。
queries
:查询相关的内容;
resolver
:名字解析,包括对来自解析器的递归查询的处理。
security
:认可/非认可的请求。
update
:动态更新事件。
xfer-in
:从远程名字服务器到本地名字服务器的区域传送信息。
xfer-out
:从本地名字服务器到远程名字服务器的区域传送的信息。
例如:要记录queries消息,就可以如下配置(把以下语句添加到named.conf中就可以了):
logging {
channel query_log {
file "/var/named/query.log" versions 3 size 20m;
severity info;
print-time
yes;
print-category
yes; #注意这里的yes
};
category queries { query_log; };
};
这样服务器会在指定的工作目录(directory语句所指定的目录,通常为:/var/named)下创建query.log这个文件,并把运行过程产生的queries消息写如到query.log文件中,
如下:Nov 28 16:04:55.516 queries: client 192.168.0.113#32770: query: dns.andy.com IN A
另外解释一下versions 3 size 20m语句中“version”和“size”的意义:
version:指定允许同时存在多少个版本的该文件,比如指定3个版本(version 3),bind会保存query.log、query.log0、query.log1和query.log2三个文件,这就是日志滚动功能;
size:指定文件大小的上限,如果只设定了size而没有设定version的话,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version的话,服务器会进行循环,比如把query.log变成query.log1,query.log1变成query.log2等,然后建立一个新的query.log进行写入;
下面是标准格式,不会写的可以查看:
3.配置并测试
3.1 要求是在/var/named/log目录下的bind_query.log文件中产生查询消息的日志
3.1.1 配置主配置文件/etc/named.conf(只有logging部分)
logging {
channel query_log {
file "/var/named/log/bind_query.log"
versions 3
size 10M; #是versions不是version
severity dynamic;
print-category yes; #记得加上yes
print-severity yes;
print-time yes;
};
category queries { query_log; };
};
3.1.2 验证语法并重启服务:
[root@localhost named]# named-checkconf
[root@localhost named]# service named restart
Stopping named: .[ OK ]
Starting named: [ OK ]
注意:
因为运行该进程的用户是named用户,而named用户对log目录没有写权限,所以可以将log的属组属主改为named,权限为774
[root@localhost named]# chown named.named log/
[root@localhost named]# chmod 774 log/
drwxrwxr-- 2 named named 4096 Aug 5 01:50 log
3.2 测试
3.2.1 在192.168.85.133主机上查询的A记录
[root@localhost ~]# dig -t A @192.168.85.128
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A @192.168.85.128
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5360
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;. IN A
;; ANSWER SECTION:
. 600 IN A 192.168.85.133
;; AUTHORITY SECTION:
mageedu.com. 600 IN NS ns1.mageedu.com.
;; ADDITIONAL SECTION:
ns1.mageedu.com. 600 IN A 192.168.85.128
;; Query time: 10 msec
;; SERVER: 192.168.85.128#53(192.168.85.128)
;; WHEN: Wed Aug 5 02:10:48 2015
;; MSG SIZE rcvd: 83
3.2.2 在服务器上查看是否有查询日志记录
[root@localhost named]# cd /var/named/log/
[root@localhost log]# ll
total 4
-rw-r--r-- 1 named named 256 Aug 5 02:11 bind_query.log
3.2.3 查看日志记录信息(我总共查了两次,都是A记录)
[root@localhost log]# cat bind_query.log #三个print结果都存在
05-Aug-2015 02:10:48.556 queries: info: client 192.168.85.133#60772: view innet: query: IN A + (192.168.85.128)
05-Aug-2015 02:11:59.075 queries: info: client 192.168.85.133#41521: view innet: query: IN A + (192.168.85.128)
感兴趣的可以添加一个传送channel再配置一下主从复制和区域传送,在区域传送时产看相应的文件和记录是否存在;