BIND 9 的高级配置.docx
《BIND 9 的高级配置.docx》由会员分享,可在线阅读,更多相关《BIND 9 的高级配置.docx(14页珍藏版)》请在冰点文库上搜索。
BIND9的高级配置
BIND9的高级配置
Tags:
ubuntu,dapper,netappsrv,bind,acl,view,logging,chroot
«sitemap
«dapper«netappsrv
BIND9的高级配置
内容提要
1.定义和使用访问控制列表
2.使用View配置分离的内外服务器
3.BIND9的日志配置
4.在chrootjail环境下运行BIND9
ACL
访问控制列表(ACL)就是一个被命名的地址匹配列表。
使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的IP地址而变得混乱。
定义ACL
要定义访问控制列表,可以在BIND的主配置文件/etc/bind/named.conf中使用acl语句来实现。
acl语句的语法为:
aclacl_name{
address_match_list;
};
BIND里默认预定义了4个名称的地址匹配列表,他们可以直接使用,分别为:
∙any:
所有主机
∙localhost:
本机
∙localnets:
本地网络上的所有主机
∙none:
不匹配任何主机
∙acl是named.conf中的顶级语句,不能将其嵌入其他的语句。
∙要使用用户自己定义的访问控制列表,必须在使用之前定义。
因为可以在options语句里使用访问控制列表,所以定义访问控制列表的acl语句应该位于options语句之前。
为了便于维护管理员定义的访问控制列表,可以将所有定义acl的语句存放在单独的文件/etc/bind/named.conf.acls中,然后在主配置文件/etc/bind/named.conf中如下语句
include"/etc/bind/named.conf.options";
之前添加如下的配置行
include"/etc/bind/named.conf.acls";
使用ACL
定义了ACL之后,可以在如下的子句中使用
子句
语句
说明
allow-query
options,zone
指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。
allow-transfer
options,zone
指定哪些主机允许和本地服务器进行域传输,默认值是允许和所有主机进行域传输。
allow-recursion
options
指定哪些主机可以进行递归查询。
如果没有设定,缺省是允许所有主机进行递归查询的。
注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。
allow-update
zone
指定哪些主机允许为主域名服务器提交动态DNS更新。
默认为拒绝任何主机进行更新。
blackhole
options
指定不接收来自哪些主机的查询请求和地址解析。
默认值是none。
上面列出的一些配置子句既可以出现在全局配置options语句里,又可以出现在zone声明语句里,当在两处同时出现时,zone声明语句中的配置将会覆盖全局配置options语句中的配置。
ACL使用举例
限制查询
假如要限制只有202.0.0.0/8和221.0.0.0/8查询本地服务器的所有区信息,可以在options语句里使用如下的allow-query子句
options{
......
allow-query{202.0.0.0/8;221.0.0.0/8;};
......
};
上面的配置没有使用ACL,若使用acl,需要以下的配置步骤:
S1在/etc/bind/named.conf.acls中添加如下的acl语句,对允许查询的主机列表命名
aclaqlist{
202.0.0.0/8;
221.0.0.0/8;
};
S2在/etc/bind/named.conf.options中使用定义的acl_name限制允许查询的主机列表
options{
......
allow-query{aqlist;};
......
};
限制区传输
假如要限制只有221.3.131.5和221.3.131.6可以从本地服务器传输“”的区信息,可以在zone语句里使用如下的allow-transfer子句
zone""{
typemaster;
file".hosts";
allow-transfer{221.3.131.5;221.3.131.6;};
};
上面的配置没有使用ACL,若使用acl,需要以下的配置步骤:
S1在/etc/bind/named.conf.acls中添加如下的acl语句,对允许查询的主机列表命名
aclatlist{
221.3.131.5;
221.3.131.6;
};
S2在/etc/bind/named.conf.local中使用定义的acl_name限制允许进行域传输的主机列表
zone""{
typemaster;
file".hosts";
allow-transfer{atlist;};
};
防止欺骗和拒绝服务攻击
为了防止欺骗和拒绝服务攻击,对于Internet上的每个DNS服务器至少应该有一个假地址的ACL和一个本地地址的ACL。
为此,需要执行如下的步骤
S1在/etc/bind/named.conf.acls中添加如下的acl语句
//创建一个名称为"bogusnets"的ACL来阻止经常用于欺骗性攻击的(RFC1918)地址空间
aclbogusnets{
0.0.0.0/8;
1.0.0.0/8;
2.0.0.0/8;
169.254.0.0/16;
192.0.2.0/24;
224.0.0.0/3;
10.0.0.0/8;
172.16.0.0/12;
192.168.0.0/16;
};
//创建一个名称为"our-nets"的ACL,并将其配置为实际本网的IP地址段。
aclour-nets{//用您的网络地址替换下面的地址列表
x.x.x.x/24;
x.x.x.x/21;
};
S2在/etc/bind/named.conf.options中使用定义的acl_name限制查询和响应
options{
......
allow-query{our-nets;};
allow-recursion{our-nets;};
blackhole{bogusnets;};
......
};
使用View分离内外服务器配置
关于分离内外服务器配置
许多站点希望DNS对于内网访问和外网(Internet)访问看起来不一样,这种类型的配置称为“分离DNS(SplitDNS)”。
这种配置可以用于如下的情况:
∙对内网用户公开整个区的所有主机;对Internet用户只公开几台主机,如www服务器等
∙对内外用户指定不同的RR,或对内网用户提供更多的RR
∙可以在内网使用RFC1918中定义的私有地址
View语句
在BIND9中可以使用view语句进行配置分离DNS。
view语句的语法为
viewview_name{
match-clients{address_match_list};
[view_option;...]
zone_statement;...
};
其中:
∙match-clients子句非常重要,它用于指定谁能看到本view。
∙可以在view语句中使用一些选项,详细信息请参考named.conf的手册页
∙zone_statement子句指定在当前view中可见的区声明
∙如果在配置文件中使用了view语句,则所有的zone语句都必须在view中出现。
∙对同一个zone而言,配置内网的view应该置于外网的view之前。
下面是一个使用view语句的例子,它摘自BIND9的文档。
view"internal"{
match-clients{our-nets;};//匹配内网客户的访问
recursionyes;//对内网客户允许执行递归查询
zone""{//定义内网客户可见的区声明
typemaster;
file".hosts.internal";
};
};
view"external"{
match-clients{any;};//匹配Internet客户的访问
recursionno;//对Internet客户不允许执行递归查询
zone""{//定义Internet客户可见的区声明
typemaster;
file".hosts.external";
};
};
接下来,需要在.hosts.internal中创建内网客户可见的区文件,并在.hosts.external中创建Internet客户可见的区文件。
可以根据您的实际情况编写这两个文件,此处从略。
BIND9日志
在默认情况下,BIND9把日志消息写到/var/log/messages文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入BIND服务器工作目录中的named.run文件。
BIND9的日志是可以灵活配置的,要详细记录服务器的运行状况,要在配置文件named.conf中使用logging语句来定制自己所需要的日志记录。
BIND日志的常用术语
在讲述logging语句的语法之前,先要熟悉一些常用术语
术语
含义
channel(通道)
日志输出方式,如:
syslog、文本文件、标准错误输出或/dev/null
category(类别)
日志的消息类别,如:
查询消息或动态更新消息等
module(模块)
产生消息的来源模块名称
facility(设备)
syslog设备名
severity(严重性)
消息的严重性等级
logging语句的语法
logging语句的语法为:
logging{
channelchannel_name{//定义通道
filelog_file[versionsnumber|unlimited][sizesizespec];|syslogoptional_facility;|null;|stderr;
//定义输出方式
severitylog_severity;//定义消息严重性
[print-timeboolean;]//是否在消息中添加时间前缀,仅用于file日志
[print-severityboolean;]//是否在消息中添加消息严重性前缀
[print-categoryboolean;]//是否在消息中添加消息类别名前缀
};
categorycategory_name{//定义类别
channel_name;
......
};
};
配置日志时,首先要定义通道,然后将不同的日志类别的数据指派到指定的通道上输出。
BIND9的默认配置是:
logging{
//由于使用了默认通道,所以没有通道定义部分
category"default"{"default_syslog";"default_debug";};
};
channel语句
channel语句用于定义通道。
∙指定应该向哪里发送日志数据,需要在以下四种之间则其一:
ofile:
输出到纯文本文件
▪log_file指定一个文件名
▪version指定允许同时存在多少个版本的该文件,比如指定3个版本(version3),就会保存query.log、query.log0、query.log1和query.log2。
▪size指定文件大小的上限,如果只设定了size而没有设定version,当文件达到指定的文件大小上限时,服务器停止写入该文件。
如果设定了version,服务器会进行循环,如把log_file变成log_file.log1,log_file.log1变成log_file.log2等,然后建立一个新的log_file.log进行写入。
osyslogoptional_facility:
输出到syslog,其中optional_facility是syslog的设备名,通常为以下几个
▪daemon
▪local0到local7
onull:
输出到空设备
ostderr:
输出到标准错误输出,默认为屏幕
∙severity语句用于指定消息的严重性等级,log_severity的取值为(按照严重性递减的顺序):
ocritical
oerror
owarning
onotice
oinfo
odebug[level]
odynamic是一个特殊的值,它匹配服务器当前的调试级别
∙定义了某个严重性级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。
比如定义级别为error,则会记录critical和error两个级别的信息。
∙对于系统管理员来说,一般记录到info级别就可以了。
BIND9预制了如下四个默认通道;
channel"default_syslog"{
syslogdaemon;//发送给syslog的daemon设备
severityinfo;//只发送此info及其更高优先级的信息
};
channel"default_debug"{//只有当服务器的debug级别非0时,才产生输出。
file"named.run";//写入工作目录下的named.run文件
severitydynamic;//按照服务器当前的debug级别记录日志
};
channel"default_stderr"{
stderr;//写到stderr
severityinfo;//只发送此info及其更高优先级的信息
};
channel"null"{
null;//丢弃所有发到此通道的信息
};
category语句
category语句是指定哪一种类别的信息使用哪个或者哪几个已经定义了的通道输出。
BIND9中可用的类别名(category_name)有:
类别
说明
client
处理客户端请求。
config
配置文件分析和处理。
database
同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
default
匹配所有未明确指定通道的类别。
dnssec
处理DNSSEC签名的响应。
general
包括所有未明确分类的BIND消息。
lame-servers
发现错误授权,即残缺服务器。
network
网络操作。
notify
区更新通知消息。
queries
查询日志
resolver
名字解析,包括对来自解析器的递归查询信息。
security
批准/非批准的请求。
update
动态更新事件。
xfer-in
从远程名字服务器到本地名字服务器的区传送。
xfer-out
从本地名字服务器到远程名字服务器的区传送。
例如要记录查询消息,可以在named.conf中添加如下配置:
logging{
channelquery_log{
file"query.log"versions3size20m;
severityinfo;
print-timeyes;
print-categoryyes;
};
categoryqueries{
query_log;
};
};
这样服务器会在工作目录(directory语句所指定的目录,Ubuntu为:
/var/cache/bind)下创建query.log文件,并把运行过程产生的queries消息写如到此文件中。
一般地,当BIND做了重大修改后,应该配置并监视日志,可能还要提高日志消息级别,一旦稳定后便可以还原配置。
因为日志会占用大量的磁盘空间,尤其是查询日志。
在chrootjail环境下运行BIND9
基于安全的考虑,应该在chrootjail环境下运行BIND9。
下面讲述将BIND9运行在/chroot/namedjail环境中的配置步骤。
停止bind服务器的运行
sudo/etc/init.d/bind9stop
创建chrootjail环境
创建chroot目录
sudomkdir-p/chroot/named
sudochmod-R700/chroot
sudomkdir/chroot/named/etc
sudomkdir/chroot/named/dev
sudomkdir-p/chroot/named/var/cache/bind
sudomkdir-p/chroot/named/var/run/bind/run
移动原始的/etc/bind目录到/chroot/named/etc
sudomv/etc/bind/chroot/named/etc
sudoln-s/chroot/named/etc/bind/etc/bind//为原位置创建符号链接,以便将来更新
创建设备并修改权限
sudomknod/chroot/named/dev/nullc13
sudomknod/chroot/named/dev/randomc18
sudochmod666/chroot/named/dev/null
sudochmod666/chroot/named/dev/random
sudochown-Rbind:
bind/chroot/named/var/*
sudochown-Rbind:
bind/chroot/named/etc/bind
修改BIND的默认启动参数
使用如下命令修改/etc/default/bind9
sudovi/etc/default/bind9
将如下的行
OPTIONS="-ubind"
改为
OPTIONS="-ubind-t/chroot/named"
添加BIND系统日志路径
使用如下命令修改/etc/init.d/sysklogd
sudovi/etc/init.d/sysklogd
将如下的行
SYSLOGD="-usyslog"
改为
SYSLOGD="-usyslog-a/chroot/named/dev/log"
重新启动bind9和sysklogd
sudo/etc/init.d/sysklogdrestart
sudo/etc/init.d/bind9start
进一步阅读
∙全面提升BINDDNS服务器安全(上)
∙全面提升BINDDNS服务器安全(下)
原文地址
发表于:
2007-02-27,修改于:
2007-02-2719:
00,已浏览277次,有评论0条