本文档摘录自《BIND9管理员手册》,如果有不对或者不清楚的地方,请大家告诉我,谢谢!
BIND配置文件详解(一)
BIND配置文件语法介绍
logging 和options 语句只在每个配置中出现一次。
1.acl语句
acl 语句的定义和使用
acl 语句给一个地址匹配表赋予了一个象征名称。它的名字来自于地址匹配列表的最基本功能:访问控制表列(ACLs)。
注意,一个地址表名必须首先在acl中定义了,然后才能在别处使用;提前调用是不允许的。
acl acl-name { address_match_list };
下列ACLs 组成:
localhost 和localnets 的ACLs 目前不支持IPV6(也就是说,localhost不匹配主机的IPV6地址,localnets不匹配连上IPV6 网络的主机),因为缺乏确定本地IPV6 主机地址的标准方法。
2.controls语句
控制语句 controls 的定义和使用
controls {
inet ( ip_addr | * ) [ port ip_port ] allow { address_match_list }
keys { key_list };
[ inet ...; ]
};
controls 语句定义了系统管理员使用的,有关本地域名服务器操作的控制通道。这些控制通道被rndc用来发送命令,并从域名服务器中检索非DNS的结果。
inet 控制通道是一个监听在ip_addr(可以是ipv4或ipv6地址)地址上的ip_port端口的TCP socket。ip_addr 是“*”的话,则说明是一个ipv4的通配符;允许接受系统上的任何IPV4地址上的用户连接。要想监听所有ipv6地址上的连接,则应该使用“::”作为ip_addr。如果仅想在本地主机上使用rndc,建议使用loopback 地址(127.0.0.1 或::1)以获得最大安全性。
allow和keys子语用来限制通过控制通道发出命令的能力。根据address_match_list中的定义,来监控控制通道上的用户连接。address_match_list中的key_id成员则被忽略,反之则根据key_list来单独的表示。每个在key_list中的key_id都允许用来鉴别通过控制通道传送的命令和响应,这些服务器和用户端之间的命令和响应都经过了数字签名的技术处理。所有经过控制通道的命令都必须使用设置的密匙进行加密。如果没有设置controls语句,named就会建立一个默认控制通道,监听loopback地址127.0.0.1 和对应的IPV6地址::1。当有一个controls 语句,但没有key子句时,named将会试着从文件/etc/rndc.key(或者任意在BIND编译时设定的sysconfdir)中读取命令通道密匙。用rndc-confgen –a 命令,创建一个rndc.key文件。
rndc.key是用来简化从BIND8系统上的升级过程,因为BIND8 在它的命令通道中没有使用数字签名,也就没有key子句。这样,在BIND9安装后执行rndc-confgen –a 命令,BIND9就可以继续使用和BIND8一样的配置文件,并仍然使用类似于BIND8中的ndc一样的工作方式。既然rndc.key 的特性只是用于兼容BIND8配置文件,所以它的配置就没有什么高难度。
当用户想修改加密的信息时,当然不能简单的修改密匙名称和加密程度,而应该用用户自己的密匙来生成新的rndc.conf文件。rndc.key文件也有自己的读取权限设置,只有文件的所有者(运行named的用户)可以访问。如果用户要求能有更多的用户能够使用rndc,则生成rndc.conf文件时,将文件属组的权限置为可读,并将这些用户归入这个组就可以了。
要想禁止掉命令通道,则使用一条空controls语句:controls { }; 即可。
3.include语句
include语句的定义和使用
include 文件名;
include语句通过允许对配置文件的读或写,来简化对配置文件的管理。例如,它可以包含多个只能由域名服务器读取的私人密匙(private key)。
4. key语句
key语句的定义和使用
key key_id {
algorithm string;
secret string;
};
key 语句定义了一个用于TSIG的共享密匙。
key 语句可以出现在配置文件的开始或者在一个view语句中。定义在开始的key语句可以在所有视图中应用。在controls语句中使用的key必须事先定义在文件的开始。
key_id,也叫做密匙名,是确认一个域名的唯一密匙。可以在一个“server”语句中使用,使得发给这个服务器的请求都会用这个密匙进行加密,或者用于确认来自于地址匹配列表中的主机的请求,是否已经用这个名字、算法和secret的密匙进行了加密。
algorithm_id 是一个标记安全/鉴定的字符串。目前唯一由TSIG鉴别支持的算法是hmac-md5。secret_string 是算法要使用的机密级,是一个64位编码的字符串。
5.logging语句
日志logging语句的定义和使用
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 or no; ]
[ print-severity yes or no; ]
[ print-time yes or no; ]
}; ]
[ category category_name {
channel_name ; [ channel_name ; … ]
}; ]
...
};
logging语句为域名服务器设定了一个多样性的logging选项。它的channel短语对应于输出方式、格式选项和分类级别,它的名称可以与category短语一起定义多样的日志信息。
只用一个logging语句就可以用来定义多个channel和category。如果没有logging 语句的话,logging设置就是:
logging {
category "unmatched" { "null"; };
category "default" { "default_syslog"; "default_debug"; };
};
在BIND9中,logging的配置只有在整个配置文件被读取后才被执行。而在BIND8中,logging部分被读取后就开始执行了。当服务器启动时,所有在配置文件中关于语法错误的logging信息都转到缺省通道(channel)中,或者使用”-g”选项,指定转成标准错误。
A.channel 短语
所有日志会输出到一个或多个channel中;你可以定义所有你想要的通道。每个通道的定义必须包括一个目的字句,用来确定所选的相关通道的信息,将会被输出到一个文件,或者到一个特殊的syslog工具,或者到一个标准错误流,或者被忽略。它也可以随意的限制通道能接受的信息级别(默认值info),定义是否包含一个由named产生的时间标记,或者是否包含分类的名称、级别等(默认是不包含任何内容)。
①目的子句为null时,会使所有发送给通道的信息被丢弃;那样的话,其他通道选项就没有意义了。
②目的子句为file 时,会使通道的内容输出到一个磁盘文件。它可以包含这个文件的大小和该文件可以保存多少个版本。
③如果使用versions日志文件选项,named就会自动保留多个版本的日志文件。例如,如果选择保存文件lamers.log的三个老版本,那么在它被打开的时候lamers.log.1被更名为lamers.log.2,lamers.log.0 被更名为lamers.log.1 ,lamers.log 被更名为lamers.log.0。也可以设置version unlimited,这样就没有备份版本的限制了。
④如果对日志文件设置了size选项,那么仅当此文件超过了设定的大小时,系统就会进行更名。默认情况下不储存备份文件;所有存在的日志文件被简单进行追加。文件的size 选项用来限制日志的增长。如果文件超过了限制,又没有versions选项,则named 就会停止写入文件。如果保留了备份版本,则备份文件如上所述进行滚动命名,然后开始创建一个新的文件。如果没有versions选项,也没有其它的机制来删除或减小日志文件,则系统就不会有数据继续写入日志中。默认状态是不限制文件的大小的。
size 和versions 选项的使用例子:
channel "an_example_channel" {
file "example.log" versions 3 size 20m;
print-time yes;
print-category yes;
};
⑤syslog 目的子句是把通道指向系统日志。它的参数是一个syslog的前缀,如syslog帮助中所述。syslog是怎样处理带有这些前缀的信息,可以参考syslog.conf 的帮助信息。
⑥severity子句象syslog中的”priorites”一样工作,唯一区别的是用户可以直接写入一个文件,而不是使用syslog写入一个文件。不到严重级的信息将不会被通道选择;高严重级的信息将会被接受。
如果用户正在使用syslog,那么syslog.conf 的优先级也会决定什么会最终通过。例如,将channel facility和severity定义成daemon和debug,就不会只记录通过syslog.conf的daemon.warning信息,后者会使severity是info和notice的信息被丢弃。如果情况相反,named就会只记录warning或更高级别的信息,而syslogd则会记录来自于通道的所有信息。
⑦stderr目的子句将通道输出到服务器的标准错误流。它用于服务器在前台运行的情况下,例如,当处于debug模式的时候,服务器能提供丰富的调试信息。如果服务器的全局debug级别(globe debug level)大于0,debug 模式将被激活。全局debug级别可以通过在启动named时设置“-d”参数加一个正数,或运行rndc trace来设置。如果要关闭debug模式,则将全局debug 级别设置成0,或运行rndc notrace。服务器中所有的debug信息有一个debug级别,高调试级给出更详细的输出。
例如,指定调试严重级别的通道:
channel "specific_debug_level" {
file "foo";
severity debug 3;
};
上例中,服务器在处于debug模式的时候都会收到3级和比3级小的级别的调试信息,全局的调试级别在这里不起作用。dynamic严重级别的通道将使用服务器全局debug级别决定打印哪些信息。
⑧如果使用了print-time参数,则日期和时间也将会记录下来。print-time也可以针对syslog的通道进行设置,但因为syslog也打印日期和时间,所以一般来讲,这没有什么意义。如果设置了print-category 参数,则信息的分类也会记录下来。如果设置了print-severity参数,则信息的严重级别也会记录下来。print-xxx 选项可以进行多重组合,单输出格式都是这个顺序:时间、分类、严重级别。
下面是一个当三个打印选项都设置的例子:
28-Feb-2000 15:05:32.863 general: notice: running
下面是named 提前定义的四个通道,用于指定缺省的日志。
channel "default_syslog" {
syslog daemon; // 发送给syslog 的daemon facility
severity info; //只发送此优先级和更高优先级的信息
};
channel "default_debug" {
file "named.run"; // 写入工作目录下的named.run 文件。注意:如果服务器用-f 参数启动,则"named.run"会被stderr 所替换。
severity dynamic; // 按照服务器当前的debug 级别记录日志
};
channel "default_stderr"{
stderr; //写到stderr
severity info; //只发送此优先级和更高优先级的信息
};
channel "null" {
null; // 丢弃所有发到此通道的信息
};
default_debug 通道有特殊的性质:只有当服务器的debug级别非0的时候,它才产生输出。一般来说,它会在服务器的工作目录中写入named.run文件。
因为安全原因,当在命令行选项中使用了“-u”参数后,只有当named使用了新的UID
后,named.run文件才会产生,以root身份启动和运行的named所产生的debug信息将会被丢弃。如果用户需要得到这些输出,则必须使用“-g”参数运行服务器,并重新将标准错误定向到一个文件中去。
一旦定义好一个通道,它就不能被重新定义。这样就不能修改内置的通道,但是可以通
过把分类指向你已经定义的通道,来修改默认的日志记录。
B. category 短语
这里存在许多分类,用户可根据需要定义想看到或不想看到的日志。如果你不将某个分
类指定到某些通道的话,那么在这个分类的日志信息就会被发送到default分类通道中。如
果用户没有设定缺省的分类,下列"default"则会被系统使用:
category "default" { "default_syslog"; "default_debug"; };
作为一个例子,假定你要在文件中记录安全事件,但您也要保留缺省的日志文件。最
好按照下面配置:
channel "my_security_channel" {
file "my_security_file";
severity info;
};
category "security" {
"my_security_channel";
"default_syslog";
"default_debug";
};
为了丢弃一个分类中的所有信息,可以设定null 通道:
category "xfer-out" { "null"; };
category "notify" { "null"; };
下面是可用的分类和相关的简明描述,以后的BIND版本中会包含更多的分类。