当前位置: 首页 > 工具软件 > BIND > 使用案例 >

BIND9配置文件详解

袁志专
2023-12-01

参考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结果。

 类似资料: