BIND Version 8 功能

作者:Eddie Harari

BIND(伯克利Internet域名守护程序)的新版本中编译了许多新功能,包括安全漏洞修复和一些重大更改,这些更改为网络管理员提供了所需的工具和配置选项,以实现早期版本的BIND中不可或缺的任务。

配置语法

我们需要了解的第一件事是一些术语已更改。不再有主服务器或辅助服务器;这两个术语已被主服务器和从服务器取代。

您在BIND 8中注意到的第一个主要区别是配置文件语法完全不同。这在开始时会让人感到困惑。在您学习正确的语法和功能之前,您可以使用Perl脚本将旧式/etc/named.boot文件转换为新式/etc/named.conf文件。请注意,这些文件名是BIND 4和BIND 8的默认配置文件名。

列表 1

BIND 8配置文件语法具有模块化风格。每个部分都用“{ }”括起来,每行都以“;”结尾。每个区域在配置文件中都有自己的部分。列表 1 是一个非常简单的配置文件的示例。

文件和实用程序位置

使用BIND 8,可以更改某些命名文件的位置,例如named.pid、named.stats、named-xfer 和其他一些文件,方法是在配置文件的选项部分中使用以下语句

options {
   named-xfer "/
   };

此示例更改了名称服务器要进行区域传输时执行的命令的位置。

名称检查

BIND 8 还检查其数据库中的主机名。它检查是否符合 RFC 952。如果区域数据库中存在不符合 RFC 的主机名,BIND 8 会将此区域视为语法错误,并且不会加载它。这可能会给从早期版本的 BIND 升级并且具有不符合规范的主机名(例如带有下划线的名称)的用户带来问题。如果您是从早期版本的 BIND 升级,并且不希望 BIND 检查数据库中主机的名称,则可以使用以下选项

options {
             check-names master warn;
             check-names slave ignore;
             };

当服务器作为主服务器的区域中出现“坏名称”时,这将告诉服务器发送警告消息而不是错误,并忽略服务器作为从服务器的区域中的“坏名称”。您也可以忽略服务器中的坏名称,但这不是一件好事,因为 BIND 8 还会检查响应查询的名称。如果您是包含坏主机名的区域的主服务器,则某些 Internet 服务器将不接受您的服务器的回复。如果您希望服务器接受回复,即使主机名不符合 RFC,请在选项部分中使用以下行

check-names response ignore;
日志配置

与旧版本的 BIND 不同,BIND 8 使网络管理员可以完全控制其生成的日志消息。此日志记录不必通过 syslog 守护程序。错误、调试和其他消息可以配置为发送到 syslog、文件或标准错误 (STDERR)。这是通过两个方面完成的:通道和类别。通道在配置文件中配置,并告诉名称守护程序日志数据的去向。类别告诉名称守护程序应该将哪种数据发送到那里。消息严重性可以是以下一项或多项:dynamic、debug、info、notice、warning、error 和 critical。

这是名称守护程序配置文件中日志记录语句的示例

logging {
       channel my_new_logging_channel {
       file "named.messages";
       severity dynamic;
       };
};

此语句告诉名称服务器将所有当前调试级别的消息记录在一个名为“named.messages”的文件中。日志记录提供了一些不错的功能,包括日志文件版本、默认操作、日志消息格式等等。您应该参考 README 文件和 BIND 8 附带的文档,以充分了解日志记录语句的工作原理。

安全和隐私

系统和网络管理员现在可以决定哪些服务器和主机将查询其服务器以获取他们服务的每个区域。这是通过访问列表完成的。借助访问列表,我们可以告诉名称守护程序哪些主机或网络可以向特定区域发送查询。访问列表由名称守护程序配置文件中的名称定义。访问列表基本上是一组分配给区域部分中区域的 IP 主机或网络地址。访问列表可以从配置文件中定义的其他访问列表的名称构建。这是一个访问列表的示例

acl "MySlaveServers" {
            {192.168.1.1/32;};
            {192.168.2.0/24;};
            };

这意味着每当我们在配置文件中使用访问列表“MySlaveServers”时,我们都希望指定主机 192.168.1.1 和网络 192.168.2.0。/32 和 /24 是 IP 地址的位掩码中的位数。BIND 8 中预定义的访问列表为 None、Any、Localhost 和 Localnets。

  • Localhost:此主机的任何 IP 地址。

  • Localnets:此主机连接的任何 IP 网络。

定义访问列表后,我们可以在区域部分或选项部分中使用此访问列表
zone "myzone.mydomain.name"  {
   type master;
   file "mydomain.db";
   allow-query { any; }; // This is default,
                         // But good as an example
   allow-transfer { "MySlaveServers";};
   // Others cant zone transfer ...
   };
此配置示例允许任何人查询“myzone.mydomain.name”,但区域传输只能从 192.168.1.1 或 192.168.2.0 完成。我们可以将访问列表放在全局选项部分中,它将应用于配置文件中指定的所有区域。使用 allow-query 语句,即使在我们的外部 DNS 服务器上,我们也可以处理内部域;为此,我们只需设置我们的内部区域,以便只有我们的内部网络才能查询该区域的主机名。

守护程序通常以 root 权限运行。早期版本的 BIND 也是如此。使用 BIND 8,named 可以作为不同的用户运行。出于安全原因,最好不要以 root 权限运行 named。如果有人利用名称守护程序并告诉它运行任意代码,则此任意代码不应以 root 权限运行。最好的办法是为名称守护程序创建一个帐户和一个组。告诉名称守护程序以不同的 UID(用户 ID)运行的命令是

/usr/sbin/named -u named -g namedgrp

此命令将告诉名称守护程序以用户“named”的 UID 和组“namedgrp”的 GID(组 ID)运行。我们必须首先创建此用户和组。当以非 root UID 运行 named 时,我们必须确保名称守护程序数据库的权限和所有权设置正确。我们可以使用 chmod 命令更改权限,使用 chgrp 更改组,使用 chown 更改所有权。

通知消息

旧版本的 BIND 使用以下方法在主服务器和从服务器之间同步数据库。从服务器不时尝试使用正确的区域参数和区域数据库序列号调用 named-xfer。如果服务器具有更高的数据库序列号,它将向从服务器提供其新数据库并更新从服务器。数据库轮询间隔由主服务器在区域数据库 SOA(起始授权)记录中设置,称为刷新时间参数。这可能会导致更新我们的主服务器与数据在整个网络上可用之间存在很大的延迟。

BIND 8 还有另一种在主服务器和从服务器之间同步区域数据库的方法。此方法称为 DNS NOTIFY 消息。NOTIFY 消息基本上是主服务器在区域序列号更改时发送给其已知从服务器的消息。NOTIFY 消息只是一个 DNS QUERY 消息,消息内部带有操作码 NOTIFY。从服务器从服务器收到 NOTIFY 消息后,会向服务器回复 NOTIFY 响应,告诉主服务器停止向此特定从服务器发送 NOTIFY。然后,此从服务器可以继续向服务器发送 named-xfer 请求,以便更新区域信息。配置参数 notify 告诉服务器在区域数据库更改时是否应该发送 NOTIFY 消息,如以下示例所示

zone  "my.domain.sela.co.il" {
      type master;
      file "db.mydomain";
      notify yes;
      };

有时,我们的区域中存在 DNS 从服务器,但这些服务器未在我们的区域数据库中注册为 NS(名称服务器)记录。NOTIFY 消息仅发送给在区域数据库中注册为 NS 记录的从服务器。如果我们知道未注册的从服务器,并且希望我们的主服务器在区域数据库更改时向该从服务器发送 NOTIFY 消息,我们可以使用名称守护程序配置文件的区域部分中的 also-notify 关键字来实现。

zone  "my.domain.sela.co.il" {
                    type master;
                    file "db.mydomain";
                    notify yes;
                    also-notify 10.1.1.1;
                    };
此配置部分告诉名称守护程序在 my.domain.sela.co.il 更改时通知注册的从服务器,并通知 10.1.1.1 机器,即使它未在 my.domain.sela.co.il 区域数据库中注册为 NS 记录。
动态更新

BIND 8 允许授权主机向区域主服务器发送 UPDATE 消息。UPDATE 消息可以添加、删除或更改区域数据库中的记录信息。发送更新消息的机器尝试从区域的 NS 记录中查找区域的主服务器。如果从服务器而不是主服务器收到消息,则从服务器应将消息转发到主服务器。

对于从 RARP(反向 ARP)或 DHCP(动态主机配置协议)服务器动态获取其 IP 地址的主机来说,动态更新是一件好事。这些主机在从 DHCP/RARP 服务器获取其 IP 地址后,可以向 DNS 服务器发送更新消息。新的解析器库例程 ns_update 供程序用来向服务器发送 DNS 更新消息。BIND 8 附带了一个命令行实用程序 nsupdate,该实用程序使能够向区域的主服务器发送更新消息。默认情况下,没有人被允许动态更新区域;配置文件关键字 allow-update 使系统管理员能够配置可以为每个区域发送更新消息的主机。由于 WINS 也使用动态更新方法,因此此更新可以帮助 DNS 和 WINS 在同一网络上共存。

zone  "my.domain.sela.co.il" {
                    type master;
                    file "db.my.domain";
                    allow-update { 10.1.1.1;  };
                   };

此示例允许主机 10.1.1.1 发送包含有关 my.domain.sela.co.il 区域信息的更新消息。

结论

BIND 8 具有许多不错的功能,其中一些功能是许多网络管理员需要的。由于在早期版本的 BIND 中发现了重大安全漏洞,因此升级到 BIND 8 几乎是必须的。仍然存在稳定的旧版本,例如 4.9 及更高版本,但这些版本不支持此处提到的所有功能。

BIND Version 8 Features
Eddie Harari (eddie@sela.co.il) 在以色列的 Sela Systems & Education 工作,担任高级经理,并参与一些安全项目。他从事计算机黑客攻击已有 13 年。
加载 Disqus 评论