如何安装设置Bind9 DNS服务器

本指南是写给那些想学习如何配置和维护DNS服务器的人,例如为某个网络或者DNS zones(DNS域)提供 Domain Name(域名)服务

软件库

BIND9 已经包含在 Ubuntu 核心库中,BIND9 并不需要启用其它附加库。

在我们开始之前,您应该熟悉 RootSudo。

安装 BIND9

服务器

1
$ sudo apt-get install bind9

有用的工具(测试用)

1
$ sudo apt-get install bind9-host dnsutils

文档(可选)

1
$ sudo apt-get install bind9-doc

BIND9 Scenarios

BIND9 可以安装配置成许多类型。

最常用的配置有:

缓冲服务器

这对于宽带连接的主机或小网络来说是有用的。通过缓冲 DNS 队列,您可以减少带宽的消耗,或者说有望减少您带宽的使用(甚至有望减少您宽带费用)。

主服务器

BIND9 可以用于为已注册或虚拟的(仅用于受限网络中)域名提供 DNS 记录(指向域的记录组)。

从服务器

从服务器用于提供一个在主服务器中配置域的完整备份。如果您想要支持一个注册的域名,建议将从服务器用在较大的机构(较大的网络或在因特网上)。因为这样做可以确保您的 DNS 域甚至在您主服务器没有在线的情况下依然可用。

混和模式

您甚至可以将 BIND9 同时配置成一个缓冲和主服务器,一个缓冲服务器和一个从服务器,甚至是一个缓冲、主、从服务器。而所有这一切只需将本文档中不同配置简单的合并在一起就可以了。 What's this?

私密服务器

还有另外两种常用的 DNS 服务器的安装(使用注册域名运行):私有主服务器和私有从服务器。它们的作用与主、从 DNS 服务是相同的,但在组织结构上有所不同。

例如,您有3个DNS服务器:A、B 和 C。
A 是主服务器,B和C是从服务器。

如果您将 A 和 B 配置成您的域 DNS 服务器,然后 C 是一个私密从服务器。它也是个从服务器,但您为互联网提供服务的 A 和 B 不会去询问其中的域。

如果您将 B 和 C 配置成您的域 DNS 服务器,然后 A 是一个私密主服务器。任何附加的记录或对区域的编辑都做在 A 上,但在互联网上的计算机只会询问 B 和 C 中的域。

DNS 记录类型

DNS 记录类型是有很多不同的,但对于阅读本文档的人来说,您只需要处理以下这些记录类型

地址记录

最常用的记录类型

1
www      IN    A      1.2.3.4

别名记录

常用于为一个已有的 A 记录创建别名。您不能创建一个CNAME记录指向另一个CNAME记录。

1
2
mail     IN    CNAME  www
www IN A 1.2.3.4

邮件交换记录

常用于定义邮件发往何处。必须指向一个 A 记录,不能是 CNAME。

1
2
3
IN    MX      mail.example.com.
[...]
mail IN A 1.2.3.4

域名服务器记录

常用于定义哪个服务器提供该区域的拷贝。它必须指向一个 A 记录,不能是 CNAME。

这是定义主、从服务器的地方。私密服务器被有意省略。

1
2
3
IN    NS     ns.example.com.
[...]
ns IN A 1.2.3.4

配置 BIND9

BIND9 配置文件被保存在

1
/etc/bind/

主配置文件被保存在下列文件中

1
2
3
/etc/bind/named.conf
/etc/bind/named.conf.options
/etc/bind/named.conf.local

缓冲服务器

缺省状态下默认是当作缓冲服务器来配置安装的。

所有的要求只是简单的添加您ISP的DNS 服务器的 IP 而已。

只需反注释并编辑下列内容:

1
2
3
4
5
6
7
named.conf.options:
[...]
forwarders {
1.2.3.4;
5.6.7.8;
};
[...]

其中 1.2.3.4 和 5.6.7.8 是您 ISP 商 DNS 服务器的 IP。

主服务器

要添加 DNS 域到 BIND9,让 BIND9 成为主服务器,您只需如下所示:

1
2
3
4
5
6
7
named.conf.local:
[...]
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
};
[...]

现在使用一个已有域文件作为模板

1
$ sudo cp /etc/bind/db.local /etc/bind/db.example.com

现在,编辑我们的域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db.example.com:

;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1

编辑 localhost. 指向您服务器的 FQDN,在其后有一个附加的 "."。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db.example.com:

;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA box.example.com. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1

编辑 root.localhost 指向你的邮件地址,不过要用 "." 代替 "@",另一个 "." 放在末尾。

例如:
johndoe@exmaple.com 将使用 johndoe.example.com. 的形式添加。

增加序列号(您必须在您每次对域文件做更改并通过重启 BIND9 重新引导域时增加您的序列号。如果您在重启 BIND9 之前做了多处改变,只需增加一次序列号即可)。

技巧:许多人喜欢使用最新的日期作为域的序列号,例如以 yyyymmddss 的形式 2005010100

现在,您可以将 DNS 记录添加在域的底部。记住在您添加条目之后要增加序列号。

从服务器

首先,在主服务器上,您必须允许域可以传输。这个在 /etc/bind/named.conf.local 中域定义的示例如下所示:

1
2
3
4
5
6
7
8
9
10
[...]
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
allow-transfer {
@ip_slave;
};
};

[...]

在从服务器上,您还必须象主服务器上一样做同样处理。然后编辑 /etc/bind/named.conf.local 并为域添加下列声明:

1
2
3
4
5
6
7
8
9
[...]

zone "example.com" {
type slave;
file "/etc/bind/db.example.com";
masters { @ip_master; };
};

[...]

重启服务器,您将在 /var/log/syslog 类似下面的提示:

1
2
syslog.5.gz:May 14 23:33:53 smith named[5064]: zone example.com/IN: transferred serial 2006051401
syslog.5.gz:May 14 23:33:53 smith named[5064]: transfer of 'example.com/IN' from 10.0.0.202#53: end of transfer

Chrooting BIND9

Chrooting BIND9 从安全角度来说是被推荐的安装。在 chroot 环境中,BIND9 可以访问所有它所需的文件和硬件,但不能访问它所不需要的。

要 chroot BIND9,只需为它创建一个 chroot 环境并在下面添加额外配置。

Chroot 环境

创建下面目录结构

1
2
3
$ sudo mkdir -p /chroot/named
$ cd /chroot/named
$ sudo mkdir -p dev etc/namedb/slave var/run

为 chroot 环境设置权限

1
2
3
4
$ sudo chown root:root /chroot
$ sudo chmod 700 /chroot
$ sudo chown bind:bind /chroot/named
$ sudo chmod 700 /chroot/named

Create or move the bind configuration file.
创建或移动 bind 配置文件。

1
$ sudo touch /chroot/named/etc/named.conf

or

1
$ sudo cp /etc/named.conf /chroot/named/etc

将 /chroot/named/etc/namedb/slave 目录的写权限赋予 bind 用户。

1
$sudo chown bind:bind /chroot/named/etc/namedb/slave

所有的从域将放置在此处。这样可以增强安全性,如果攻击者得到了 bind 用户的权限,他们也没有办法修改您的主域文件。因此在 /chroot/named/etc/named.conf 文件中的所有的从文件名都必须带着指向从目录的目录名。下面列出了一个域定义的示例:

1
2
3
4
5
6
7
zone “my.zone.com.” {
type slave;
file “slaves/my.zone.com.dns”;
masters {
10.1.1.10;
};
};

创建 BIND9 的环境

1
2
$ sudo mknod /chroot/named/dev/null c 1 3
$ sudo mknod /chroot/named/dev/random c 1 8

给 bind 用户访问 /chroot/named/var/run 目录的权限,该目录用于保存 PID 和状态数据

1
$ sudo chown bind:bind /chroot/named/var/run

BIND9 的配置

在 /etc/default/bind9 中编辑 bind 启动选项。原来选项如下:

1
2
3
/etc/default/bind9:

OPTIONS=”-u bind”

现在改为

1
2
3
4
/etc/default/bind9:


OPTIONS="-u bind -t /var/named -t /chroot/named -c /etc/named.conf"

选项 -t 将 bind 操作的根目录改成 /chroot/named,选项 -c 则告诉 bind 配置文件在 /etc/named.conf。记住用 -t 设置的是相对路径。

named.conf 文件也必须接受额外的选项以便正常运行,下面是最小的选项集:

1
2
3
4
5
6
7
/chroot/named/etc/named.conf:

options {
directory "/etc/namedb";
pid-file "/var/run/named.pid";
statistics-file "/var/run/named.stats";
};

Ubuntu 的 syslogd 守护进程配置

1
2
3
4
5
/etc/init.d/sysklogd:

[...]
SYSLOGD="-u syslog -a /chroot/named/dev/log"
[...]

注意:检查该配置

重启 syslog 服务及 BIND9

1
2
$ sudo /etc/init.d/sysklogd restart
$ sudo /etc/init.d/bind9 restart

这里,您要检查 /var/log/messages 是否有 bind 引起的错误。

开始、停止和重启 BIND9

使用下列命令开始 BIND9:

1
$ sudo /etc/init.d/bind9 start

停止它,使用:

1
$ sudo /etc/init.d/bind9 stop

最后,要重启它,运行:

1
$ sudo /etc/init.d/bind9 restart

状态

要检查您的 BIND9 安装状态:

1
$ host $record localhost

1
$ dig $record @localhost

在这里 localhost 是您安装 BIND9 的系统。如果不要 localhost,那么使用适当的 IP 地址。

提示与技巧

附加功能

您可以从 Universe 库中安装 bindgraph 包(要激活 Universe 库 - 请参见 AddingRepositoriesHowto),并用它来监视您的 BIND9 服务器的使用,配置细节可以在 bindgraph README 文档中找到。

更多信息

在线资源

"ISC's BIND9 Manual"

TLDP's "DNS HOWTO" (For General Overview)

"Chroot BIND Howto"

印刷资源

"DNS & BIND" - Paul Albitz & Cricket Liu - 4th Editi