参考ISC BIND9 - 最详细、最认真的从零开始的 BIND 9 - DNS服务搭建及其原理讲解
一、conf文件中字段详解
1. acl
一般来说,ACL模块用来承担控制主机可以访问域名解析服务器的角色,其设置不会让控制文件的配置非常冗余和庞大。采用这个配置可以有效防范DOS以及Spoofing攻击。一般来说定义这部分的内容来规定IP是否能够被接入以及Blacklist来阻止某些特定的IP地址介入到域名解析服务器中。
ACL匹配客户端是否能够接入到域名服务器基于三个基本的特征:
- 客户端的IPv4或者IPv6地址
- 用于签署请求的 TSIG 和 SIG(0) 密钥
- 在DNS客户端子网选项中编码的前缀地址
匹配 acl 定义以及使用规则如下:
string 是用来命名IP地址集的一个变量名,可以随意地被命名;
acl <string> { <address_match_element>; ... };
举一个在 named.conf.options 文件中被定义的例子:
acl bogusnets {
0.0.0.0/8; 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;
}; // 这个部分
// Set up an ACL called our-nets. Replace this with the
// real IP numbers.
acl our-nets { 172.16.2.11/24; 172.16.2.12/24; }; //子网的名称
2.logging
logging 部分的配置为DNS解析服务器提供了日志记录的功能,DNS服务器上的所有日志记录被存储到了指定的文件中。其通用的配置文件为:
logging {
category <string> { <channel_name_string>; ... };
channel <string> {
buffered <boolean>;
file <quoted_string> [ versions ( unlimited | <integer> ) ]
[ size <size> ] [ suffix ( increment | timestamp ) ];
null;
print-category <boolean>;
print-severity <boolean>;
print-time ( iso8601 | iso8601-utc | local | <boolean> );
severity <log_severity>;
stderr;
syslog [ <syslog_facility> ];
};
};
从上边的通用配置格式可以看出来,logging 模块分为两个部分,category 和 channel,channel的作用是指定输出的方式、日志格式的选项和事件的严重性,每一个channel 可以指定一个 category 来指定记录的事件类型。其中 category 用来区分不同的事件产生的类别或者场景,比如:客户端请求-client request、配置文件解析处理-Configuration file parsing and processing。
如果在 named.conf.options 文件中没有指定 logging 模块系统会给出一个默认的配置
logging {
category default {
default_syslog;
default_debug;
};
category unmatched {
null;
};
};
channel 的配置规则:
所有的日志输出都需要 channel 来指定输出格式,BIND9 对于创建 channel 的数量没有限制。
每一个 channel 都需要为该通道的日志信息指定一个 destination clause - 目的句柄,目的句柄在 channel 阶段被配置,这个目的句柄用来区分:
- 输出到具体的文件的名字 - file;
- 输出到具体的系统日志工具中(syslog/syslogd)- syslog;
- 输出到终端显示- 标准错误流(standard error stream);
- 或者该错误消息直接被丢弃 - null。
其次,channel 的配置可以规定每一个错误日志消息的响应级别,默认的响应级别是info ,channel 可以规定接受错误消息的级别;此外,channel 还可以控制输出错误日志消息的格式,可以包含:响应时间戳、category名字、严重等级等。
channel 的配置参数:
- buffered: 用来规定是否刷新错误日志的文件,其参数值为,在 BIND9 中 值的参数值为 yes / no,如果设置成为 yes 那么日志消息流(一般每一个错误日志消息都是一个 Log Entry)就不会刷新,而是被保存在缓冲区中了,不会刷新到文件中。
- file:类似于Linux的通道概念,file 将日志输出流通过通道直接输出给文件,从上边的通用配置可以看出来可以为 file 指定文本文件的大小 - size ;指定 log 文件的版本号 - version;指定用于命名备份版本的格式 - suffix
- size 用来限制log文件的大小,如果log文件的大小设置超过了设定的阈值,那么系统会自动停止输出内容到文件中;
- versions:用于指定新创建的 log文件数存储到本地的上限值,默认的参数值为unlimited,当指定的文件的大小超过设定的size值得时候,如果没有指定 versions,那么系统就不会继续写进log;如果制定了versions,那么就会继续写入;
- suffix :设定用来命名log文件的方式;好像没啥用,我添加这个参数没有什么反应…;
- syslog:将通道定向到系统的日志文件流中; 常用的支持日志文件服务为:dameon、syslog、local6、local7;
- severity:用来承担定义日志严重级别的定义角色,相当于 syslog - priorities。比如说定义了日志的严重级别为 Debug,那么会输出日志事件 Debug 以上的错误到文件中。一般常用的严重等级: debug[level]、notice、warning、dynamic - 与当前服务器的日志保持一致;一般的 DNS服务器的日志等级调成 info即可;
- stderr:将通道指向服务器的标准错误流。这是为了在服务器作为前台进程运行时使用;
- print-time:yes / no / local / iso8601 / iso8061-utc 可以设定不同的输出到日志文件的时间格式;
- print-category:打印日志消息配置category 的信息;
- print-severity:打印日志的严重等级
category词组配置规则:
category <config_string> { <channel_name_string>; ... };
- client:客户端请求;
- cname:由于是CNAME而不是a /AAAA记录 的域名服务器;
- config:配置文件解析和处理过程;
- database:与名称服务器内部用于存储区域和缓存数据的数据库相关的消息;
- general:没有被归类的 category 类别的其他种类的日志文件信息;
- lame-servers:远程服务器中的错误配置,BIND 9在解析期间试图查询这些服务器时发现;
- network:网络操作;
- notify:通知协议;
- queries:记录所有查询 DNS服务器的 query;
- query-errors:关于导致某些失败的查询的信息;
- xfer-in:区域传输服务器正在接收;
- xfer-out:区域传输服务器正在发送的信息;
- zoneload:加载区域和创建自动空区域;
配置的 logging 服务会创建指定的日志文件,该日志文件从服务挂起的时候被创建,用于记录DNS服务中的相关的配置信息以及交换信息。在 Debian9 的默认存储目录为 /var/cache/bind/*。你也可以为其指定存储的位置。
如果你想要配置成一个自己的目录,首先你需要创建一个自定义的目录,比如说我指定了我想要存放日志的文件的目录: /var/log/bind,如果不为这个文件使用chown命令指定权限的话会出现 isc_stdio_open ‘/var/log/example.log’ failed 的报错。解决方法是: sudo chown bind:root /var/log/bind
现在我们已经基本上了解了 logging 的工作原理,其工作机制简单地来说就是,首先你需要创建一个 channel 来规定输出日志流的格式还以及日志文件名、文件版本,每一个 channel 可以被多个 category 调用使用,每一个 category 相当于一个 BIND9 内嵌的服务模块,服务模块去调用日志配置模最后输出格式化日志。
3.options
options 的参数设置会影响整个 BIND9 DNS环境的配置,具体各部分常用到的配置参数如下:
- listen-on:用于配置监听的端口以及IPv4地址,默认的监听端口为:53;
- listen-on-v6:用于监听 IPv6 地址以及端口;
- directory: 用于指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/cache/bind;
- dump-file:选项用来设置域名缓存数据库文件的位置,可以自己定义。默认的存储文件为:named_dump.db;
- statistics-file:选项用来设置状态统计文件的位置,可以自己定义。;
- memstatistics-file :选项用来设置服务器输出的内存使用统计信息。默认保存在 /var/named/data 目录下,文件名为 named.memstats;
- allow-query:选项用来设置允许DNS查询的客户端地址,默认值为localhost, 可以设置为某个网段、任意地址、具体的某台主机三种情况。例如,要修改为任意地址,就在括号内的加入 any,也可以引用之前创建的 acl 内的所有地址;
- recursion:用于设置递归查询,一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出查询请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。此选项有yes和no两个值。这个选项用于设置 Failover 非常有用;
- dnssec-enable: 选项用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
- dnssec-validation:选项用来设置是否启用DNSSEC确认,默认值为yes,可以选择 auto。
- bindkeys-file : 用来设置内置信任的密钥文件,其默认值为 /etc/named/iscdlv.key;
- managed-keys-directory: 选项用于指定目录中的文件存储位置,跟踪管理 DNSSEC 密钥, 这部分的内容在后边会有介绍;
- forwarders:DNS转发器。用于设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址,其中 8.8.8.8 和 8.8.4.4 是谷歌的免费DNS服务器的网络地址;233.5.5.5 和 233.6.6.6 是阿里云的免费DNS地址。当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发都设置的DNS转发器,由DNS转发器 完成转发操作。因此这台转发器的缓存中就记录了丰富的域名信息。因此如果遇到非本域的查询,转发器的缓存就可以做到查询,从而减少了向外部的查询流量。
forward: 选择默认的IP地址即可; - rrset-order:
在 BIND 9 提供的负载均衡策略建立在一个名称(域名 - Name)使用多个资源记录 ( Records ) 的情况下,其实现的轮询机制并不是传统的负载均衡服务器实现的轮询机制 - 即追踪和记录每一次应答的资源顺序;
BIND 9 实现了一个类似 List 的数据结构,将所有的资源记录填入到 一个顺序表中,这个填入的次序随机,或者根据设定的参数随机;
格式:[class class_name] [type type_name] [name “domain_name”] order ordering
如果参数没有被赋值,那么默认的赋值为: class: ANY type: ANY Name: *
参数:
- fixed : 根据 zone 文件定义资源记录的顺序按照顺序逐个进行解析;
- random: 根据 zone 文件资源记录随机返回解析记录;
- cyclic: 创建一个循环,循环输出资源记录;
- none: 完全随机的资源返回形式;
4.controls
controls语句声明了系统管理员用于管理名称服务器远程操作的控制通道。rndc使用这些控制通道向名称服务器发送命令,并从名称服务器检索非dns结果。