11.2. BIND

本小节论述了 BIND(Berkeley Internet Name Domain),Red Hat Enterprise Linux 包含的 DNS 服务器。着重介绍其结构和配置文件,并论述了如何对其进行本地和远程管理。

11.2.1. 空白区域

BIND 配置大量空白区域,以防止递归服务器向无法使用它们的互联网服务器发送不必要请求(因而造成进行查询的客户端的 SERVFAIL 响应延迟)。这些空白区域可保证返回即时且授权的 NXDOMAIN 响应。配置选项 empty-zones-enable 控制是否生成空白区域,还可同时使用 disable-empty-zone 选项在其使用的默认前缀列表中禁用一个或多个空白区域。
已增加为 RFC 1918 前缀生成的空白区域数,同时 BIND 9.9 或以上的用户会在未指定 empty-zones-enable(默认为 yes),以及特别将其设定为 yes 时都会看到 RFC 1918 空白区域。

11.2.2. 配置 DHCP 服务器

启动 named 服务后,它会如 表 11.1 “named 服务配置文件” 所述从文件中读取配置。

表 11.1. named 服务配置文件

路径描述
/配置文件
/etc/named/主配置文件中包含的配置文件辅助目录。
配置文件由带嵌套选项的语句集合组成,这些选项使用大括号 ({})括起来。注:编辑此文件时必须非常小心,以避免语法错误,否则将无法启动 named 服务。典型的 /etc/named.conf 文件类似如下:
statement-1 ["statement-1-name"] [statement-1-class] {
  option-1;
  option-2;
  option-N;
};
statement-2 ["statement-2-name"] [statement-2-class] {
  option-1;
  option-2;
  option-N;
};
statement-N ["statement-N-name"] [statement-N-class] {
  option-1;
  option-2;
  option-N;
};

注意

如果已安装 bind-chroot 软件包,BIND 就会在 chroot 环境中运行。在那种情况下,初始化脚本将使用 mount --bind 命令挂载上述配置文件,以便可以在这个环境以外管理该配置。不需要向 /var/named/chroot/ 目录复制任何内容,因为会自动挂载该目录。这样可简化维护服务,因为在 chroot 环境中运行时,不需要对 BIND 配置文件进行任何特别处理。可使用 BIND 管理所需的一切,而无需在 chroot 环境中运行。
如果 /var/named/chroot/ 中的对应挂载点为空,则以下目录会自动挂载至 /var/named/chroot/ 目录:
  • /etc/named
  • /etc/pki/dnssec-keys
  • /run/named
  • /var/named
  • /usr/lib64/bind/usr/lib/bind(视具体架构而定)。
如果在 /var/named/chroot/ 中不存在以下文件,则也会将其挂载到目标文件中:
  • /
  • /etc/rndc.conf
  • /etc/rndc.key
  • /etc/named.rfc1912.zones
  • /etc/named.dnssec.keys
  • /etc/named.iscdlv.key
  • /etc/named.root.key

重要

需要为每个挂载到 chroot 环境中的文件生成一个备用副本后,方可编辑原始文件。也可以使用禁用 edit-a-copy 模式的编辑器。例如:要使用 Vim 编辑在 chroot 环境中运行的 BIND 的配置文件 /etc/named.conf,请作为 root 运行以下命令:
~]# vim -c "set backupcopy=yes" /etc/named.conf

11.2.2.1. 在 chroot 环境中安装 BIND

要安装在 chroot 环境中运行的 BIND,请作为 root 运行以下命令:
~]# yum install bind-chroot
要启用 named-chroot 服务,首先请检查是否运行 named 服务,方法是运行以下命令:
~]$ systemctl status named
如果该服务正在运行,则必须将其禁用。
作为 root 运行以下命令,禁用 named
~]# systemctl stop named
~]# systemctl disable named
然后,作为 root 运行以下命令启用 named-chroot 服务:
~]# systemctl enable named-chroot
~]# systemctl start named-chroot
作为 root 运行以下命令,检查 named-chroot 服务状态:
~]# systemctl status named-chroot

11.2.2.2. 常用语句类型

以下是在 /etc/named.conf 中常用的语句类型:
acl
acl(访问控制列表)语句可让您定义主机组,这样可以允许或者拒绝对该名称服务器的访问。它使用以下格式:
acl acl-name {
  match-element;
  ...
};
acl-name 语句名称是访问控制列表名称,match-element 选项通常是独立 IP 地址(比如 10.0.1.1),或者无类别域际路由选择CIDR)网络标记(例如:10.0.1.0/24)。有关已经定义的关键字列表请查看 表 11.2 “预定义访问控制列表”

表 11.2. 预定义访问控制列表

关键字描述
any与所有 IP 地址匹配。
localhost与本地系统使用的 IP 地址匹配。
localnets与所有本地系统连接的网络中的 IP 地址匹配。
none与任何 IP 地址都不匹配。
acl 语句在与其他语句联合使用时特别有用,比如 options例 11.2 “联合使用 acl 和 Options” 定义两个访问控制列表,black-hatsred-hats。并在为 red-hats 赋予普通访问授权的同时,在 black-hats 中添加 black-hats

例 11.2. 联合使用 acl 和 Options

acl black-hats {
  10.0.2.0/24;
  192.168.0.0/24;
  1234:5678::9abc/24;
};
acl red-hats {
  10.0.1.0/24;
};
options {
  blackhole { black-hats; };
  allow-query { red-hats; };
  allow-query-cache { red-hats; };
};
include
include 语句可让您在 /etc/named.conf 中包含文件,这样就可将可能的敏感数据保存在有严格权限的独立文件中。其格式如下:
include "file-name"
file-name 语句名称是文件的绝对路径。

例 11.3. 在 /etc/named.conf 中添加文件

include "/etc/named.rfc1912.zones";
options
options 语句可让您定义全局服务器配置选项,也可让您设定其他语句的默认形式。您可使用它指定 named 工作目录位置,允许的查询类型等等。其格式如下:
options {
  option;
  ...
};
有关常用 option 指令列表请查看下面的 表 11.3 “常用配置选项”

表 11.3. 常用配置选项

选项描述
allow-query指定哪些主机可以在名称服务器中查询授权资源记录。它接受访问控制列表、IP 地址集合、或者 CIDR 标记中的网络。所有主机均默认有此功能。
allow-query-cache指定哪些主机可以在名称服务器中查询未授权数据,比如递归查询。默认只允许 localhostlocalnets
blackhole指定哪些主机不能查询名称服务器。这个选项可在某个主机或者网络向服务器提出过多请求时使用。默认选项为 none
directorynamed 服务指定工作目录。默认选项为 /var/named/
disable-empty-zone用于在使用的默认前缀列表中禁用一个或多个空白区域。可在 options 语句及 view 语句中指定。可多次使用该选项。
dnssec-enable指定是否返回与 DNSSEC 关联的资源记录。默认选项为 yes
dnssec-validation指定是否提供使用 DNSSEC 认证的资源记录。默认选项为 yes
empty-zones-enable控制是否生成空白区域。只能在 options 语句中指定。
forwarders为名称服务器指定有效 IP 地址列表,所有申请应转发到此地址进行解析。
forward
指定 forwarders 指令行为。它接受以下选项:
  • first — 解析该名称前,服务器将查询 forwarders 指令中列出的名称服务器。
  • only — 无法查询 forwarders 指令中列出的名称服务器前,该完全将不会自行解析该名称。
listen-on指定侦听查询的 IPv4 网络接口。在 DNS 服务器中还作为网关使用。可以使用这个选项回答来自只使用单一网络的查询。默认使用所有 IPv4 接口。
listen-on-v6指定侦听查询的 IPv4 网络接口。在 DNS 服务器中还作为网关使用。您可以使用这个选项回答来自只使用单一网络的查询。默认使用所有 IPv6 接口。
max-cache-size指定服务器缓存使用的最大内存数。达到极限后,该服务器可让记录永久过期,这样就不会超过极限。在使用多个 view 的服务器中,该极限分别适用于每个查看缓存。默认选项为 32M
notify
指定更新 zone 后是否通知辅名称服务器。它接受以下选项:
  • yes — 该服务器会通知所有辅名称服务器。
  • no — 该服务器不会通知任何辅名称服务器。
  • master-only — 该服务器只通知该区域的主服务器。
  • explicit — 该服务器只通知在 zone 语句的 also-notify 列表中指定的辅服务器。
pid-file指定由 named 服务生成的进程 ID 文件位置。
recursion指定是否作为递归服务器使用。默认选项为 yes
statistics-file为统计文件指定备选位置。默认使用 /var/named/named.stats 文件。

注意

已将 named 用于运行时数据的目录从 BIND 默认位置 /var/run/named/ 移动到新位置 /run/named/。结果是将 PID 文件从默认位置 /var/run/named/named.pid 移动到新位置 /run/named/named.pid。此外,已将 session-key 文件移动至 /run/named/session.key。需要在选项部分使用语句中指定这些位置。详情请查看 例 11.4 “使用 options 语句”

重要

要防止分布式拒绝服务(distributed denial of service,DDoS)攻击,建议您使用 allow-query-cache 选项只为客户端的特定子集限制递归 DNS 服务。
完整选项列表请参考 第 11.2.8.1 节 “已安装文档” 中提供的《BIND 9 管理员参考手册》named.conf manual page。

例 11.4. 使用 options 语句

options {
  allow-query       { localhost; };
  listen-on port    53 { 127.0.0.1; };
  listen-on-v6 port 53 { ::1; };
  max-cache-size    256M;
  directory         "/var/named";
  statistics-file   "/var/named/data/named_stats.txt";

  recursion         yes;
  dnssec-enable     yes;
  dnssec-validation yes;

  pid-file          "/run/named/named.pid";
  session-keyfile   "/run/named/session.key";
};
zone
zone 语句可让您定义区域的特点,比如其配置文件位置和具体区域选项,并可用来覆盖全局 options 语句。其格式如下:
zone zone-name [zone-class] {
  option;
  ...
};
表 11.4 “Zone 语句中的常用选项” 所述,zone-name 属性是区域的名称,zone-class 是区域的自选等级,optionzone 语句选项。
zone-name 属性特别重要,因为它是为 $ORIGIN 指令分配的默认值,该指令用于 /var/named/ 目录中的对应区域文件。named 守护进程可将区域名称附加到区域文件中列出的任意非全限定域名中。例如:如果 zone 语句定义了 example.com 名称空间,请使用 example.com 作为 zone-name,这样就可将其放在 example.com 区域文件主机名的最后。
有关区域文件的详情,请查看 第 11.2.3 节 “编辑区域文件”

表 11.4. Zone 语句中的常用选项

选项描述
allow-query指定哪些客户端可请求查询这个区域的信息。这个选项会覆盖全局 allow-query 选项。默认允许所有查询请求。
allow-transfer指定哪些辅服务器可请求传递区域的信息。默认允许所有传递请求。
allow-update
指定哪些主机可在其区域中动态更新信息。默认选项是拒绝所有动态更新请求。
注:允许主机更新其区域信息时应格外小心。不要在这个选项中设置 IP 地址,除非该服务器位于可信网络中。请如 第 11.2.6.3 节 “事务处理签名(Transaction SIGnatures,TSIG)” 所述使用 TSIG 密钥。
file指定 named 工作目录中包含区域配置数据的文件名称。
masters指定可请求授权 zone 信息的 IP 地址。只有将区域定义为 type slave 时方可使用这个选项。
notify
指定更新 zone 后是否通知辅名称服务器。它接受以下选项:
  • yes — 该服务器会通知所有辅名称服务器。
  • no — 该服务器不会通知任何辅名称服务器。
  • master-only — 该服务器只通知该区域的主服务器。
  • explicit — 该服务器只通知在 zone 语句的 also-notify 列表中指定的辅服务器。
type
指定区域类型。它接受以下选项:
  • delegation-only — 加强基础区域的授权状态,比如 COM、NET 或者 ORG。任何没有具体说明或暗示授权的回答都将被视为 NXDOMAIN。这个选项只可用于在递归或者缓存部署中使用的 TLD(顶级域,Top-Level Domain)或者 root 区域文件。
  • forward — 将所有关于这个区域信息的请求转发到其他名称服务器。
  • hint — 用来指向 root 名称服务器的特殊区域类型,root 名称服务器是用来解析使用其他方法无法了解的 zone。hint 区域的默认配置就足够。
  • master — 这个 zone 授权的专用名称服务器。如果某个区域的配置文件位于这个系统中,则应将该 zone 设定为 master
  • slave — 作为这个区域的专用从属服务器的名称服务器。在 masters 指令中指定主服务器。
主、辅名称服务器 /etc/named.conf 文件的更改包括添加、修改、或者删除 zone 语句,且让名称服务器可有效工作通常只需要 zone 语句选项的小子集。
例 11.5 “主名称服务器的 Zone 语句” 中,将区域识别为 example.com,类型设定为 master,并让 named 服务读取 /var/named/example.com.zone 文件。它还只允许一个辅名称服务器(192.168.0.2)转移到该 zone。

例 11.5. 主名称服务器的 Zone 语句

zone "example.com" IN {
  type master;
  file "example.com.zone";
  allow-transfer { 192.168.0.2; };
};
辅服务器的 zone 语句略微不同。类型设定为 slave,同时 masters 指令会通告 named 主服务器的 IP 地址。
例 11.6 “辅名称服务器的 Zone 语句” 中,将 named 服务配置为在 192.168.0.1 IP 地址向主服务器查询 example.com zone 的信息。然后会将接收到的信息保存在 /var/named/slaves/example.com.zone 文件中。注:必须将所有从属 zone 都放在 /var/named/slaves/ 目录中,否则该服务就无法转移到该 zone。

例 11.6. 辅名称服务器的 Zone 语句

zone "example.com" {
  type slave;
  file "slaves/example.com.zone";
  masters { 192.168.0.1; };
};

11.2.2.3. 其他语句类型

以下是在 /etc/named.conf 中不常用的语句类型:
controls
controls 语句可让您配置使用 rndc 命令管理 named 服务所需的各种安全要求。
有关 rndc 程序及其用法请参考 第 11.2.4 节 “使用 rndc 程序”
key
key 语句可让您根据名称定义具体密钥。密钥是用来认证各种动作,比如安全更新或者使用 rndc 命令。key 有两个选项:
  • algorithm algorithm-name — 使用的算法类型(例如:hmac-md5)。
  • secret "key-value" — 加密密钥。
有关 rndc 程序及其用法请参考 第 11.2.4 节 “使用 rndc 程序”
logging
logging 语句可让您使用各种类型的日志,也称频道。可以在该语句中使用 channel 选项,构建自定义日志类型,该类型可有自己的文件名(file)、大小限制(size)、版本号(version)以及重要程度(severity)。定义自定义频道后,可使用 category 选项将频道分类并在重启 named 服务后开始记录。
默认情况下,named 会向 rsyslog 守护进程发送标准信息,这些信息会保存在 /var/log/messages 文件中。BIND 中内置了几个使用不同安全等级标准频道,比如 default_syslog(处理信息日志消息)和 default_debug(具体处理 debug 消息)。默认分类称为 default,它使用内置频道进行一般日志记录,不需要任何特殊配置。
自定义日志记录过程会非常繁琐,且不在本章论述范围内。有关创建自定义 BIND 日志的详情请参考 第 11.2.8.1 节 “已安装文档” 中提供的《BIND 9 管理员参考手册》
server
server 语句可让您指定影响 named 服务响应远程名称服务器方式的具体选项,特别要考虑通知和区域传送。
transfer-format 选项控制每条信息附带的资源记录数。它可以是 one-answer(只有一个资源记录),也可以是 many-answers(多条资源记录)。备注:many-answers 选项更有效,但旧的 BIND 版本不支持。
trusted-keys
trusted-keys 语句可让您指定安全 DNS(DNSSEC)的分类公钥。有关这个主题的详情请参考 第 11.2.6.4 节 “DNS 安全扩展(DNSSEC)”
view
view 语句可让您根据正在进行主机查询的名称服务器所在网络生成特殊视图。这可让有些主机接收某个区域的回答,而其他主机接收完全不同的信息。另外,还可让某些区域只能用于具体的可信主机,而非可信主机只能查询其他区域。
只要名称是唯一的就可以尽量使用多视图。match-clients 选项可让您指定在具体窗口中使用的 IP 地址。如果在窗口中使用 options 语句,它会覆盖已经配置的全局 options 语句。最后,大多数 view 语句包含多个可在 match-clients 列表中使用的 zone 语句。
注:view 语句的排列顺序很重要,因为会使用第一个语句与具体客户端 IP 地址匹配语句。有关这个主题的详情请参考 第 11.2.6.1 节 “多窗口”

11.2.2.4. 注释标签

除这些语句外,/etc/named.conf 文件还包含注释。named 服务会忽略这些注释,但可为用户提供有价值的附加性信息。以下是有效注释标签:
//
// 字符后到该行结束的所有文本都视为注释。例如:
notify yes;  // notify all secondary nameservers
#
# 字符后到该行结束的所有文本都视为注释。例如:
notify yes;  # notify all secondary nameservers
/**/
所有 /**/ 之间的文本都视为注释。例如:
notify yes;  /* notify all secondary nameservers */

11.2.3. 编辑区域文件

第 11.1.1 节 “名称服务器区域” 所示,区域文件中包含有关名称空间的信息。默认是将其保存在位于 /var/named/named 工作目录中,同时每个区域文件都是根据 zone 语句中的 file 选项命名,通常在某种程度上与有问题的域关联,并将该文件识别为包含区域数据,比如 example.com.zone

表 11.5. named 服务区域文件

路径描述
/var/named/named 服务的工作目录。不允许该名称服务器写入这个目录。
/var/named/slaves/从属区域的目录。named 服务可写入这个目录。
/var/named/dynamic/其他文件的目录,比如动态 DNS(DDNS)区域,或者管理的 DNSSEC 密钥。named 服务可写入这个目录。
/var/named/data/各种统计和 debug 文件目录。named 服务可写入这个目录。
域文件由指令和资源记录组成。指令指定名称服务器执行任务或者在该区域中应用特殊设置;资源记录定义该区域的参数,并为每台主机分配身份识别。虽然指令是自选的,但要求使用资源记录以便为区域提供名称服务。
所有指令和资源记录都应单独使用一行。

11.2.3.1. 常用指令

指令以美元符号(即 $)开始,后接该指令名称,且通常是在该文件的开始。以下是区域文件中的常用指令:
$INCLUDE
$INCLUDE 指令可让您在出现其他文件的时候包括该文件,这样其他区域设置就可以保存在不同的区域文件中。

例 11.7. 使用 $INCLUDE 指令

$INCLUDE /var/named/penguin.example.com
$ORIGIN
$ORIGIN 指令可让您将区域名附加到不合格记录中,比如那些只有 hostname 的记录。注:如果在 /etc/named.conf 中指定该区域,则没有必要使用这个指令,因为默认使用该区域名称。
例 11.8 “使用 $ORIGIN 指令” 中,会将所有以点(即 . 符号)结尾的资源记录附加到 example.com

例 11.8. 使用 $ORIGIN 指令

$ORIGIN example.com.
$TTL
$TTL 指令可让您该区域的默认Time to Live(TTL)值,即区域记录可在多长时间内有效。每个资源记录都包含各自的 TTL 值,这些值可覆盖这个指令。
增大这些值可让远程名称服务器将区域 信息缓存更长时间,减小该区域的查询次数,并延长传播资源记录更改所需时间。

例 11.9. 使用 $TTL 指令

$TTL 1D

11.2.3.2. 常用资源记录

以下是经常在区域文件中使用的资源记录:
A
地址记录指定要为某个名称分配的 IP 地址。它使用以下格式:
hostname IN A IP-address
如省略 hostname 值,则该记录会指向最新指定的 hostname
例 11.10 “使用资源记录” 中,将 server1.example.com 请求指向 10.0.1.3 或者 10.0.1.5

例 11.10. 使用资源记录

server1  IN  A  10.0.1.3
         IN  A  10.0.1.5
CNAME
正规名称 记录将名称彼此配对。因此,这类记录有时是指别名记录。它使用以下格式:
alias-name IN CNAME real-name
CNAME 记录是使用常用命名方案服务最长指向的记录,比如 Web 服务器的 www。但其用法有很多局限:
  • CNAME 记录不应指向其他 CNAME 记录。这主要是避免可能的无线循环。
  • CNAME 记录不应包含其他资源记录类型(比如 A、NS、MX 等等)。唯一例外的是登录该区域后与 DNSSEC 相关的记录(即 RRSIG、NSEC 等)
  • 其他指向主机完全限定域名(FQDN)资源记录(即 NS、MX、PTR)不应指向 CNAME 记录。
例 11.11 “使用 CNAME 资源记录” 中,A 记录将主机名与 IP 地址绑定,而 CNAME 记录将常用 www 主机名指向它。

例 11.11. 使用 CNAME 资源记录

server1  IN  A      10.0.1.5
www      IN  CNAME  server1
MX
邮件互换记录指定发送到由这个区域控制具体名称空间的邮件应保存在哪里。它使用以下格式:
IN MX preference-value email-server-name
email-server-name 是完全限定域名(FQDN)。preference-value 可使用数字为名称空间将电子邮件服务器分级,为某些电子邮件系统赋予其他系统没有的属性。使用最小 preference-value 值的 MX 资源记录是首选系统。但多个电子邮件服务器可使用同一值以便平均分配邮件量。
例 11.12 “使用 MX 资源记录” 中,第一个 mail.example.com 电子邮件服务器是 mail2.example.com 电子邮件服务器在接收来自 example.com 域的邮件时的首选。

例 11.12. 使用 MX 资源记录

example.com.  IN  MX  10  mail.example.com.
              IN  MX  20  mail2.example.com.
NS
名称服务器 记录可为具体区域宣布授权名称服务器。它使用以下格式:
ssh username@penguin.example.net
nameserver-name 应该是完全限定域名(FQDN)。注:当有两个名称服务器都作为该域的授权服务器时,哪个是主服务器,哪个是辅服务器并不重要。它们都是授权的服务器。

例 11.13. 使用 NS 资源记录

IN  NS  dns1.example.com.
IN  NS  dns2.example.com.
PTR
指针记录指向该名称空间的另一部分。它使用以下格式:
last-IP-digit IN PTR FQDN-of-system
last-IP-digit 指令是 IP 地址的最后一个数字,且 FQDN-of-system 是完全限定域名(FQDN)。
PTR 记录主要用于逆向名称解析,因为它们将 IP 地址反向指回到具体名称。有关使用的 PTR 记录的更多示例请参考第 11.2.3.4.2 节 “逆向名称解析区域文件”
SOA
权限启动记录发布有关名称服务器的名称空间的重要授权信息。它在指令后面,是区域文件的第一个资源记录。它使用以下格式:
@  IN  SOA  primary-name-server hostmaster-email (
       serial-number
       time-to-refresh
       time-to-retry
       time-to-expire
       minimum-TTL )
正确的数值是:
  • @ 符号将 $ORIGIN 指令(如果没有设定 $ORIGIN 指令,即区域名称)作为这个 SOA 资源记录定义的名称空间。
  • primary-name-server 指令是为这个域授权的主名称服务器的主机名。
  • hostmaster-email 指令是与名称空间联络的个人电子邮件。
  • serial-number 指令是个数值,每次区域文件有变化时这个值就会增加,说明 named 现在应该重新载入这个区域。
  • time-to-refresh 指令是在该区域文件有任何修改时,辅名称服务器用来决定在询问主名称服务器前需要等待多长时间的数值。
  • time-to-retry 指令是在主名称服务器不响应的事件中,辅名称服务器用来决定在提交刷新请求前需要等待多长时间的数值。如果主服务器在 time-to-expire 指令规定的时间内没有回应刷新请求,那么辅服务器会停止响应,因为授权服务器对那个名称服务器有疑问。
  • 在 BIND 4 和 8 中,minimum-TTL 指令是其他名称服务器缓存该区域信息的时间。在 BIND 9 中,它定义为否定回答提供的缓冲时间长度。否定回答缓存最长可设定为 3 小时(即 3H)。
配置 BIND 时,所有时间都使用秒为单位。但在指定秒之外的时间单位时可使用缩写,比如分钟(M)、小时(H)、天(D)和周(W)。表 11.6 “秒与其他时间单位对比” 为您提供秒为单位的时间以及使用其他格式的对等时间。

表 11.6. 秒与其他时间单位对比

其他时间单位
601M
180030M
36001H
108003H
216006H
4320012H
864001D
2592003D
6048001W
31536000365D

例 11.14. 使用 SOA 资源记录

@  IN  SOA  dns1.example.com.  hostmaster.example.com. (
       2001062501  ; serial
       21600       ; refresh after 6 hours
       3600        ; retry after 1 hour
       604800      ; expire after 1 week
       86400 )     ; minimum TTL of 1 day

11.2.3.3. 注释标签

除资源记录和指令外,区域文件还包含注释。named 服务会忽略这些注释,但可为用户提供有价值的附加信息。分号之后到这一行结束前的所有文本都视为注释。例如:
   604800  ; expire after 1 week

11.2.3.4. 用法示例

以下解释了每个选项所配置的项目:
11.2.3.4.1. 简单区域文件
例 11.15 “简单区域文件” 演示了标准指令使用及 SOA 值。

例 11.15. 简单区域文件

$ORIGIN example.com.
$TTL 86400
@         IN  SOA  dns1.example.com.  hostmaster.example.com. (
              2001062501  ; serial
              21600       ; refresh after 6 hours
              3600        ; retry after 1 hour
              604800      ; expire after 1 week
              86400 )     ; minimum TTL of 1 day
;
;
          IN  NS     dns1.example.com.
          IN  NS     dns2.example.com.
dns1      IN  A      10.0.1.1
          IN  AAAA   aaaa:bbbb::1
dns2      IN  A      10.0.1.2
          IN  AAAA   aaaa:bbbb::2
;
;
@         IN  MX     10  mail.example.com.
          IN  MX     20  mail2.example.com.
mail      IN  A      10.0.1.5
          IN  AAAA   aaaa:bbbb::5
mail2     IN  A      10.0.1.6
          IN  AAAA   aaaa:bbbb::6
;
;
; This sample zone file illustrates sharing the same IP addresses
; for multiple services:
;
services  IN  A      10.0.1.10
          IN  AAAA   aaaa:bbbb::10
          IN  A      10.0.1.11
          IN  AAAA   aaaa:bbbb::11

ftp       IN  CNAME  services.example.com.
www       IN  CNAME  services.example.com.
;
;
在这个示例中,将授权名称服务器设定为 dns1.example.comdns2.example.com,并使用 A 记录分别将其绑定到 10.0.1.110.0.1.2 IP 地址。
使用 MX 记录配置的电子邮件服务器通过 A 记录指向 mailmail2。因为这些名称没有以点结尾,它们后面的 $ORIGIN 域会将其扩展到 mail.example.commail2.example.com
使用 CNAME 记录将可在标准名称中使用的服务,比如 www.example.comWWW)指向正确的服务器。
应使用 /etc/named.conf 中类似如下的 zone 语句将这个区域调入服务:
zone "example.com" IN {
  type master;
  file "example.com.zone";
  allow-update { none; };
};
11.2.3.4.2. 逆向名称解析区域文件
逆向名称解析区域文件是用来将 IP 地址转换称完全限定域名(FQDN)的具体名称空间。它与标准区域文件很相似,除了在连接 IP 地址和完全限定域名时使用 PTR 资源记录,如 例 11.16 “逆向名称解析区域文件” 所示。

例 11.16. 逆向名称解析区域文件

$ORIGIN 1.0.10.in-addr.arpa.
$TTL 86400
@  IN  SOA  dns1.example.com.  hostmaster.example.com. (
       2001062501  ; serial
       21600       ; refresh after 6 hours
       3600        ; retry after 1 hour
       604800      ; expire after 1 week
       86400 )     ; minimum TTL of 1 day
;
@  IN  NS   dns1.example.com.
;
1  IN  PTR  dns1.example.com.
2  IN  PTR  dns2.example.com.
;
5  IN  PTR  server1.example.com.
6  IN  PTR  server2.example.com.
;
3  IN  PTR  ftp.example.com.
4  IN  PTR  ftp.example.com.
在这个示例中,IP 地址 10.0.1.1 通过 10.0.1.6 指向对应的完全限定域名。
应使用 /etc/named.conf 中类似如下的 zone 语句将这个区域调入服务:
zone "1.0.10.in-addr.arpa" IN {
  type master;
  file "example.com.rr.zone";
  allow-update { none; };
};
这个示例与标准 zone 语句相比,除区域名称外太多什么不同之处。注:逆向名称解析要求区域文件中前三个逆向解析的 IP 地址块后接 .in-addr.arpa。这样可让在逆向名称解析区域文件中使用的单独 IP 块与这个区域关联。

11.2.4. 使用 rndc 程序

rndc 程序是可用来管理 named 服务的命令行工具,在本地机器和远程机器中都可使用,其用法如下:
rndc [option...] command [command-option]

11.2.4.1. 配置该工具

为防止对该服务的未授权访问,必须将 named 配置为侦听所选端口(默认为 953),同时必须在该服务和 rndc 程序中使用同一密钥。

表 11.7. 相关文件

路径描述
/etc/named.confnamed 服务的默认配置文件。
/etc/rndc.confrndc 程序的默认配置文件。
/etc/rndc.key默认密钥位置。
rndc 配置文件位于 /etc/rndc.conf。如果没有该文件,则该程序将使用 /etc/rndc.key 中的密钥,该文件是在使用 rndc-confgen -a 命令安装的过程中自动生成。
第 11.2.2.3 节 “其他语句类型” 所述,named 服务是使用 /etc/named.conf 配置文件中的 controls 语句配置的。除非使用这个语句,否则只能允许来自回送地址(127.0.0.1)的连接,并使用 /etc/rndc.key 中的密钥。
有关这个主题的详情请参考 第 11.2.8 节 “其他资料”《BIND 9 管理员参考手册》列出的手册页面。

重要

要防止非授权用户向该服务发送 control 命令,请确定只有 root 用户可以读取 /etc/rndc.key 文件:
~]# chmod o-rwx /etc/rndc.key

11.2.4.2. 检查服务状态

请使用以下命令检查 named 服务当前的状态:
~]# rndc status
version: 9.7.0-P2-RedHat-9.7.0-5.P2.el6
CPUs found: 1
worker threads: 1
number of zones: 16
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

11.2.4.3. 重新载入配置及 Zone

要重新载入配置文件及 zone,在 shell 提示下键入以下命令:
~]# rndc reload
server reload successful
这样将重新载入 zones,同时保证之前的所有缓存的响应,以便您可以在不丢失任何保存的名称解析的情况下修改 zones 文件。
请在 reload 命令后指定其名称即可重新载入单一 zone,例如:
~]# rndc reload localhost
zone reload up-to-date
最后,如果只想重新载入配置文件和新添加的区域,请输入:
~]# rndc reconfig

注意

如果您想要手动修改使用动态 DNS(DDNS)的区域,请确定首先运行 freeze 命令:
~]# rndc freeze localhost
完成后,请运行 thaw 命令再次允许 DDNS,并重新载入该区域文件:
~]# rndc thaw localhost
The zone reload and thaw was successful.

11.2.4.4. 更新区域密钥

请使用 sign 命令更新 DNSSEC 密钥并注册该区域。例如:
~]# rndc sign localhost
注:要使用上面的命令注册区域,则必须在 zone 语句中将 auto-dnssec 选项设定为 maintain。例如:
zone "localhost" IN {
  type master;
  file "named.localhost";
  allow-update { none; };
  auto-dnssec maintain;
};

11.2.4.5. 启用 DNSSEC 验证

请作为 root 运行以下命令启用 DNSSEC 验证:
~]# rndc validation on
同样,使用以下命令禁用这个选项:
~]# rndc validation off
有关如何在 /etc/named.conf 中配置这个选项的详情,请参考 第 11.2.2.2 节 “常用语句类型” 中的 options 语句。
《Red Hat Enterprise Linux 7 安全指南》中有关于 DNSSEC 的完整介绍。

11.2.4.6. 启用 Query Logging

请作为 root 运行以下命令启用(或禁用,假设目前处于启用状态)查询日志:
~]# rndc querylog
请作为 root 运行 status 命令检查当前设置。

11.2.5. 使用 dig 程序

dig 程序是一个命令行工具,可让您执行 DNS 查询和 debug 名称服务器配置。其常规用法如下:
dig [@server] [option...] name type
常用 type 列表请参考 第 11.2.3.2 节 “常用资源记录”

11.2.5.1. 查找名称服务器

请以如下格式使用该命令查找某个具体域的名称服务器:
dig name NS
例 11.17 “名称服务器查询示例” 中,使用 dig 程序显示 example.com 的名称服务器。

例 11.17. 名称服务器查询示例

~]$ dig example.com NS

; <<>> DiG 9.7.1-P2-RedHat-9.7.1-2.P2.fc13 <<>> example.com NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57883
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.                   IN      NS

;; ANSWER SECTION:
example.com.            99374   IN      NS      a.iana-servers.net.
example.com.            99374   IN      NS      b.iana-servers.net.

;; Query time: 1 msec
;; SERVER: 10.34.255.7#53(10.34.255.7)
;; WHEN: Wed Aug 18 18:04:06 2010
;; MSG SIZE  rcvd: 77

11.2.5.2. 查找 IP 地址

请以如下格式使用该命令查找为具体域分配的 IP 地址:
dig name A
例 11.18 “IP 地址查询示例” 中,使用 dig 程序显示 example.comIP 地址。

例 11.18. IP 地址查询示例

~]$ dig example.com A

; <<>> DiG 9.7.1-P2-RedHat-9.7.1-2.P2.fc13 <<>> example.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4849
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            155606  IN      A       192.0.32.10

;; AUTHORITY SECTION:
example.com.            99175   IN      NS      a.iana-servers.net.
example.com.            99175   IN      NS      b.iana-servers.net.

;; Query time: 1 msec
;; SERVER: 10.34.255.7#53(10.34.255.7)
;; WHEN: Wed Aug 18 18:07:25 2010
;; MSG SIZE  rcvd: 93

11.2.5.3. 查找主机名

请以如下格式使用该命令为具体 IP 地址查找主机名:
dig -x address
例 11.19 “主机名查询示例” 中,使用 dig 程序显示 192.0.32.10 分配的主机名。

例 11.19. 主机名查询示例

~]$ dig -x 192.0.32.10

; <<>> DiG 9.7.1-P2-RedHat-9.7.1-2.P2.fc13 <<>> -x 192.0.32.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29683
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 6

;; QUESTION SECTION:
;10.32.0.192.in-addr.arpa.      IN      PTR

;; ANSWER SECTION:
10.32.0.192.in-addr.arpa. 21600 IN      PTR     www.example.com.

;; AUTHORITY SECTION:
32.0.192.in-addr.arpa.  21600   IN      NS      b.iana-servers.org.
32.0.192.in-addr.arpa.  21600   IN      NS      c.iana-servers.net.
32.0.192.in-addr.arpa.  21600   IN      NS      d.iana-servers.net.
32.0.192.in-addr.arpa.  21600   IN      NS      ns.icann.org.
32.0.192.in-addr.arpa.  21600   IN      NS      a.iana-servers.net.

;; ADDITIONAL SECTION:
a.iana-servers.net.     13688   IN      A       192.0.34.43
b.iana-servers.org.     5844    IN      A       193.0.0.236
b.iana-servers.org.     5844    IN      AAAA    2001:610:240:2::c100:ec
c.iana-servers.net.     12173   IN      A       139.91.1.10
c.iana-servers.net.     12173   IN      AAAA    2001:648:2c30::1:10
ns.icann.org.           12884   IN      A       192.0.34.126

;; Query time: 156 msec
;; SERVER: 10.34.255.7#53(10.34.255.7)
;; WHEN: Wed Aug 18 18:25:15 2010
;; MSG SIZE  rcvd: 310

11.2.6. BIND 的高级性能

大多数 BIND 部署只使用 named 服务提供名称解析服务,或者作为具体域的授权。但 BIND 9 有大量高级功能,可提供更安全、有效的 DNS 服务。

重要

尝试使用高级功能前,比如 DNSSEC、TSIG 或者 IXFR(增量区域传送,Incremental Zone Transfer),请确定网络环境中的所有名称服务器都支持该功能,特别是当您使用旧的 BIND 版本或者非 BIND 服务器时。
第 11.2.8.1 节 “已安装文档” 中的《BIND 9 管理员参考手册》对所有提到的功能都有更详细的论述。

11.2.6.1. 多窗口

可根据请求的网络来源为客户端提供不同的信息,这个功能是自选的。它主要是用来拒绝来自本地网络以外的客户端的敏感 DNS 条目,同时允许本地网络内客户端的查询。
请在 /etc/named.conf 配置文件中添加 view 语句方可配置多视图。使用 match-clients 选项与 DNS 地址或者整个网络匹配,并为其提供特殊选项和区域数据。

11.2.6.2. 增量区域传送(IXFR)

增量区域传送IXFR)可让辅名称服务器只下载在主名称服务器中修改区域的更新部分。与标准传送过程相比,这可让通知和更新过程更有效。
备注:只有在使用动态更新修改主区域记录时方可使用 IXFR。如果手动编辑区域文件进行修改,则会使用自动区域传送AXFR)。

11.2.6.3. 事务处理签名(Transaction SIGnatures,TSIG)

事务处理签名 (TSIG)保证在允许传送前,主、辅名称服务器中都有共享密钥。这样就加强了根据标准 IP 地址方法进行的传送认证,因为攻击者不但需要访问要传送区域的 IP 地址,还需要知道密钥。
从版本 9 开始,BIND 还支持 TKEY,它是另一个认证区域传送的共享密钥方法。

重要

在使用不安全网络进行沟通时,请不要只依赖基于 IP 地址的认证方法。

11.2.6.4. DNS 安全扩展(DNSSEC)

域名系统安全扩展DNSSEC)提供 DNS 数据的原始认证,现有拒绝的认证以及数据完整性。当将某个具体域标记为安全时,会为每个验证失败的资源记录返回 SERFVAIL 响应。
注:可以如 第 11.2.5 节 “使用 dig 程序” 所述,使用 dig 程序调试使用 DNSSEC 签名的域或者可识别 DNSSEC 的解析程序。有用的选项有 +dnssec(设定 DNSSEC OK 字节请求与 DNSSEC 关联的资源记录),+cd (让递归名称服务器不要验证响应),和 +bufsize=512(将数据包大小改为 512B 以便通过某些防火墙)。

11.2.6.5. 互联网协议版本 6(IPv6)

使用 AAAA 资源记录和 listen-on-v6 指令可支持互联网协议版本 6IPv6),如 表 11.3 “常用配置选项” 所述。

11.2.7. 常见的要避免的错误

以下是如何避免用户在配置名称服务器时通常会犯的错误的建议列表:
正确使用分号和括号
/etc/named.conf 文件中省略的分号或者不匹配的括号可造成 named 服务无法启动。
正确使用句号(即 . 符号)
在区域文件中,域名结尾处的句号代表完全限定域名。如果省略,named 服务会添加区域名称或者 $ORIGIN 值完成它。
编辑区域文件时增加序列号
如果没有增加序列号,那么主名称服务器会有正确的新信息,但将永远无法将该更改通知辅名称服务器,也就不会尝试它们在那个 zone 中的数据。
要配置防火墙允许 NFS,请:
如果防火墙阻断 named 服务到其他名称服务器之间的连接,建议最好可随时修改防火墙设置。

警告

DNS 查询中使用固定 UDP 源端口是一个潜在的安全漏洞,这个漏洞可让攻击者更容易地执行缓存中毒攻击。为防止这个攻击,默认 DNS 发送随机短端口。将您的防火墙配置为允许来自随机 UDP 源端口的传出查询。默认的使用范围为 102465535

11.2.8. 其他资料

以下资源提供有关 BIND 的附加信息。

11.2.8.1. 已安装文档

BIND 有涉及广泛的安装的文档,覆盖很多不同主题,每个文档都保存在它自己的主题目录中。下面的每一项中,都可使用在系统中安装的 bind 软件包的版本替换 version
/usr/share/doc/bind-version/
主要目录中包含大多数最新的文档。该目录包含《BIND 9 管理员参考手册》,格式有 HTML 和 PDF,该文档详细介绍了 BIND 资源要求、如何配置名称服务器的不同类型;如何执行负载平衡;以及其他高级主题。
/usr/share/doc/bind-version/sample/etc/
该目录包含 named 配置文件示例。
rndc(8)
rndc 名称服务器控制程序的首页页中包含其用法的文档。
named(8)
互联网名称服务器 named 的手册页包含可用于控制 BIND 名称服务器守护进程的各类参数的文档。
lwresd(8)
轻加权解析程序守护进程 lwresd 的手册页中包含守护进程及其用法的文档。
named.conf(5)
该 man page 中有可在 named 配置文件中使用选项的完整列表。
rndc.conf(5)
该 man page 中有可在 rndc 配置文件中使用选项的完整列表。

11.2.8.2. 在线资源

https://access.redhat.com/site/articles/770133
有关在 chroot 环境中运行 BIND 的 Red Hat 知识库文章,其中包括与 Red Hat Enterprise Linux 6 的对比。
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/
《Red Hat Enterprise Linux 7 安全指南》有关于 DNSSEC 完整论述。
https://www.icann.org/namecollision
ICANN 有关域名冲突的常见问题