如何在 Ubuntu 14.04 上使用仅授权 DNS 服务器 NSD

介绍

设置一个 DNS 服务器来负责域名,即使对于经验丰富的管理员来说也是一个复杂的任务。

Bind DNS 服务器这样的软件非常灵活,可以配置以操作整个 DNS 层次结构中的许多组件,但这种灵活性也意味着 Bind 没有针对任何一个任务进行优化。

大多数情况下,你的配置不需要大量的功能,这种额外的复杂性使管理变得更加困难,这也意味着软件本身对任何一个任务都更不响应。

为了解决这个问题,已经创建了专注于一个单一的DNS分辨区的替代DNS服务器. 一个名为 NSD的软件是唯一权威的DNS服务器,非常适合权威地管理DNS区域。

在本指南中,我们将展示如何安装和配置NSD,以便在Ubuntu 14.04服务器上安全地管理我们的DNS区域。

前提和目标

在您开始使用本指南之前,您应该熟悉一些基本的DNS概念和术语(https://andsky.com/tech/tutorials/an-introduction-to-dns-terminology-components-and-concepts)。

作为一个只有权威性的DNS服务器,NSD不提供任何缓存、转发或复发功能,它只响应它所控制的区域的迭代请求,它还可以将解决程序引用到它已授权的区域的其他名称服务器。

对于本指南的目的,我们将配置两个使用NSD软件的服务器,以作为我们区域的主要和次要服务器,我们还将提供配置数据,使客户端能够访问第三方主机上的Web服务器。

我们将在本指南中使用 dummy 域名 example.com. 您应该替代自己的域名来跟随。

PurposeDNS FQDNIP Address
Primary name serverns1.example.com.192.0.2.1
Secondary name serverns2.example.com.192.0.2.2
Web Serverwww.example.com.192.0.2.3

在您完成本指南后,您应该使用 NSD 配置了前两个服务器,以便为您的区域发挥权威性服务器的作用. 您将能够使用我们配置的主机名称从互联网访问您的服务器,以及通过查询 IP 地址来找出主机名称。

在名称服务器上设置主机名称

在担心DNS配置之前,我们需要确保我们的名称服务器能够正确地以我们所要求的方式解决自己的主机名称。

在您的第一个 DNS 服务器上,编辑 /etc/hosts 文件,以设置该计算机的 FQDN:

1sudo nano /etc/hosts

在我们的情况下,我们需要将192.0.2.1 IP 地址与我们的姓名服务器的完整名称ns1.example.com进行映射,我们可以通过将指定我们的主机名称的行替换为我们的公共 IP 地址,FQDN,以及我们的主机的缩短口号:

1127.0.0.1 localhost
2192.0.2.1 ns1.example.com ns1

保存并关闭文件,当你完成。

接下来,我们需要对 /etc/hostname 文件进行双重检查:

1sudo nano /etc/hostname

这应该包含我们的 unqualified 主机名称的值. 如有必要,修改它:

1ns1

保存并关闭文件,当你完成。

如果您更改了上面的 /etc/hostname 文件,请告诉系统重新阅读该文件:

1sudo hostname -F /etc/hostname

我们已经完成了我们的第一个DNS服务器,目前,重复第二个服务器的步骤。

更改 /etc/hosts 文件以指定第二个 DNS 服务器的主机:

1sudo nano /etc/hosts
1127.0.0.1 localhost
2192.0.2.2 ns2.example.com ns2

檢查「/etc/hostname」檔案,此檔案只應包含短不合格的名稱:

1sudo nano /etc/hostname
1ns2

再次,让系统重新读取文件,如果你不得不修改任何东西:

1sudo hostname -F /etc/hostname

您的服务器现在可以解决自己的名称而不使用DNS,您现在已经准备好在您的服务器上设置NSD。

将 NSD 安装在两个名称服务器上

下一步是实际上在您的名称服务器上安装该软件。

在我们开始之前,我们实际上必须采取一个额外的准备步骤. NSD 包在 repos 中安装了软件,配置了一些组件,并尝试启动服务。

为了避免安装时出现错误,我们将创建此用户 _before_我们安装软件. 在您的每个机器上,通过键入创建nsd系统用户:

1sudo useradd -r nsd

这将创建正确的帐户,以成功完成安装。

现在,我们只需要安装NSD软件。幸运的是,NSD包含在Ubuntu 14.04存储库中,所以我们只能使用apt来拉下它,我们会更新我们的本地包索引,然后下载相应的包:

1sudo apt-get update
2sudo apt-get install nsd

这将安装软件并进行一些初始配置,它也将启动服务,尽管我们尚未配置它来服务任何东西。

配置主 NSD 服务器

我们将开始设置我们的ns1服务器,该服务器将被配置为我们区域的主要DNS服务器。

我们应该做的第一件事是确保NSD使用的所有SSL密钥和证书安全地在应用程序和控制器之间进行通信。

要做到这一点,类型:

1sudo nsd-control-setup

在 `/etc/nsd 目录中可能已经存在密钥和证书,但这个命令会生成缺少的任何东西。

设置 nsd.conf 文件

NSD 的主要配置文件是名为 nsd.conf 的文件,位于 /etc/nsd 目录中。

此目录中只包含几个评论的文件,但我们将使用一个更完整的评论示例文件作为我们的模板。

1sudo cp /usr/share/doc/nsd/examples/nsd.conf /etc/nsd/nsd.conf

现在,用 sudo 权限在文本编辑器中打开新文件:

1sudo nano /etc/nsd/nsd.conf

在内部,你会看到一些被评论的配置行,分为部分。主要部分是服务器,远程控制,钥匙,模式区域

首先,我们应该在服务器部分配置我们的DNS服务器的基本属性,我们将在默认DNS端口53上处理基本的IPv4流量,我们将使用我们之前设置的nsd用户。

我们还希望明确设置包含我们区域数据的目录,以及我们的日志和PID文件位置。您可以为本节设置许多其他配置选项,但我们将保持相对简单。

我们的服务器部分将看起来像这样:

1server:
2    do-ip4: yes
3    port: 53
4    username: nsd
5    zonesdir: "/etc/nsd"
6    logfile: "/var/log/nsd.log"
7    pidfile: "/run/nsd/nsd.pid"

接下来,让我们看看远程控制部分,这个部分有点误称,因为它不仅用于远程控制我们的大卫,我们会将此配置为局部控制大卫。

首先,我们需要启用资源并设置其界面和端口号,所有这一切都可以通过不评论相应的行并将控制允许指令更改为

接下来,我们可以删除指定密钥和证书文件的行,这些相匹配我们运行nsd-control-setup命令时生成的文件名,一旦没有评论,就不需要修改。

对于这个部分,我们的价值观应该是这样的:

1remote-control:
2    control-enable: yes
3    control-interface: 127.0.0.1
4    control-port: 8952
5    server-key-file: "/etc/nsd/nsd_server.key"
6    server-cert-file: "/etc/nsd/nsd_server.pem"
7    control-key-file: "/etc/nsd/nsd_control.key"
8    control-cert-file: "/etc/nsd/nsd_control.pem"

接下来,我们将配置密钥部分,该部分将包含NSD将使用的秘密密密钥,以安全地在我们的主要和次要服务器之间执行区域转移。

我们需要设置将使用的名称和算法,我们将为我们的示例使用名称‘demokey’,我们还将使用他们选择的默认算法(‘hmac-sha256’)。

对于秘密本身,我们将采取评论中的建议,如何安全地生成一个。 退出文本编辑器. 在您的终端中,运行以下命令:

1dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64

您将在命令的输出中收到随机生成的密钥:

10+1 records in
20+1 records out
319 bytes (19 B) copied, 0.000571766 s, 33.2 kB/s
4+kO0Vu6gC+9bxzMy3TIZVLH+fg==

上面用红色复制输出,然后再打开配置文件。使用复制输出作为秘密参数的值。

1key:
2    name: "demokey"
3    algorithm: hmac-sha256
4    secret: "+kO0Vu6gC+9bxzMy3TIZVLH+fg=="

接下来,我们将设置一个简单的模式,因为我们有一些重复的信息涉及我们的次要服务器. 我们将通知并每次将我们的区域转移到相同的次要,所以创建一个模式是有意义的。

我们将单独设置每个区域的名称和文件,所以我们不需要在模式中担心。

我们希望在我们的模式中设置通知参数以参考我们的二级服务器的 IP 地址. 我们还希望使用我们指定的密钥以安全地与 TSIG 传输区域。

最后,我们的模式部分应该是这样的:

1pattern:
2    name: "tosecondary"
3    notify: 192.0.2.2 demokey
4    provide-xfr: 192.0.2.2 demokey

最后,我们进入我们的区域部分,在这里,我们将配置NSD如何处理我们的特定区域及其相关文件。

首先,我们将配置我们的前进区域. 我们需要为我们的example.com区域设置区域. 这就像在名称参数下指定域名本身,指定我们将使用的区域文件的名称,并包括我们上面创建的模式,以便将其转移到我们的次要服务器。

我们的Demo的完工前进区应该是这样的:

1zone:
2    name: "example.com"
3    zonefile: "example.com.zone"
4    include-pattern: "tosecondary"

接下來,我們可以照顧反向區域。反向區域基本上是一個區域檔案,允許 DNS 軟件將 IP 位址轉到客戶的主機名稱。

例如,在 DigitalOcean 中,您对一系列 IP 地址的责任不被授权,以便设置反向映射,而如果您在控制面板中将服务器的主机名称设置为您希望将其映射回的 FQDN,则 DigitalOcean 会自动创建必要的反向映射。

您可以通过阅读 Bind authoritative-only guideA bit About Reverse Zones部分来了解更多有关反向映射的信息,我们将向您展示如何为信息目的和更大的灵活性设置NSD的反向映射,尽管这只适用于您已被授权对IP块的反向映射的控制的情况。

对于反向区域,我们采取IP地址的前三位,反转它们,并将它们添加到特殊域名in-addr.arpa上作为子域委托。这就是DNS系统使用与常规域名相同的搜索方法来搜索IP地址的方式。对于我们的案例,我们将创建一个反向区域,定义了2.0.192.in-addr.arpa地图。

1zone:
2    name: "2.0.192.in-addr.arpa"
3    zonefile: "192.0.2.zone"
4    include-pattern: "tosecondary"

保存并关闭文件,当你完成。

创建前方区域文件

在我们的配置中,我们将区域文件命名为example.com.zone。我们将不得不在我们的/etc/nsd目录中创建一个以这个名称的文件。

在您的文本编辑器中打开该文件,使用 sudo 特权:

1sudo nano /etc/nsd/example.com.zone

我们将设置$ORIGIN参数,该参数指向我们在FQDN格式中配置的域(与终点完结)。

1$ORIGIN example.com.
2$TTL 1800

接下来,我们需要我们的SOA,或权威记录的开始。

1@       IN SOA ns1.example.com. admin.example.com. (
2                        2014070201        ; serial number
3                        3600                    ; refresh
4                        900                     ; retry
5                        1209600                 ; expire
6                        1800                    ; ttl
7                        )

这定义了一些区域范围内的值. ns1.example.com. 值用于指定该区域的一个权威服务器的域位置. admin.example.com. 用于指定区域管理员可以访问的电子邮件地址。

电子邮件地址,在这种情况下是[email protected]. 在DNS区域文件中,必须将@符号更改为点。

窗口中的值定义了我们区域的某些值。我们这里只会提到序列号. 每当您对区域文件进行更改时,此值 ** 必须增加。

接下来,我们需要使用 NS 记录来定义该区域具有权威性的名称服务器. 请记住使用 FQDN 用于您的域名,包括终端点:

1IN NS ns1.example.com.
2                    IN NS ns2.example.com.

接下来,我们需要设置 A 记录,这些记录实际上会告诉客户如何访问我们指定的名称服务器。

1ns1 IN A 192.0.2.1
2ns2 IN A 192.0.2.2

最后,我们想为我们的其他主机添加任何额外的 A 记录. 在我们的情况下,我们将设置我们的基本域名 (example.com) 和 www 主机名称,以将其绘制到我们的 Web 服务器:

1@                   IN A 192.0.2.3
2www IN A 192.0.2.3

当你完成时,完成的文件应该是这样的:

 1$ORIGIN example.com.
 2$TTL 1800
 3@       IN SOA ns1.example.com. admin.example.com. (
 4                        2014070201        ; serial number
 5                        3600                    ; refresh
 6                        900                     ; retry
 7                        1209600                 ; expire
 8                        1800                    ; ttl
 9                        )
10; Name servers
11                    IN NS ns1.example.com.
12                    IN NS ns2.example.com.
13
14; A records for name servers
15ns1 IN A 192.0.2.1
16ns2 IN A 192.0.2.2
17
18; Additional A records
19@                   IN A 192.0.2.3
20www IN A 192.0.2.3

保存并关闭文件,当你完成。

创建反向区域文件

接下来,我们将为我们的反向区域制作类似的文件. 请记住,如果您已被授权对地址块的反向映射负责,则这只需要。

创建您在您的 nsd.conf 文件中引用的反向区域文件,并在文本编辑器中使用 sudo 权限打开它:

1sudo nano /etc/nsd/192.0.2.zone

再次,我们将通过定义$ORIGIN$TTL参数开始。这次,请记住为您的区域设置in-addr.arpa子域的起源。

1$ORIGIN 2.0.192.in-addr.arpa.
2$TTL 1800

接下来,我们需要设置 SOA 记录,就像以前一样。我们可以大致为此文件使用相同的值,因为相同的电子邮件和权威名称服务器对两个区域负责。

1@       IN SOA ns1.example.com. admin.example.com. (
2                        2014070201        ; serial number
3                        3600                    ; refresh
4                        900                     ; retry
5                        1209600                 ; expire
6                        1800                    ; ttl
7                        )

当你完成时,文件应该是这样的:

再次,我们需要定义该区域具有权威性的名称服务器,这些服务器将再次成为相同的服务器:

1IN NS ns1.example.com.
2                        IN NS ns2.example.com.

最后,我们需要通过使用 PTR 记录将每个 IP 地址的最后一个 octet 路由到相关主机的 FQDN 来提供实际的逆域地图:

11 IN PTR ns1.example.com.
22 IN PTR ns2.example.com.
33 IN PTR www.example.com.

当你完成时,文件应该是这样的:

 1$ORIGIN 2.0.192.in-addr.arpa.
 2$TTL 1800
 3@       IN SOA ns1.example.com. admin.example.com. (
 4                        2014070201        ; serial number
 5                        3600                    ; refresh
 6                        900                     ; retry
 7                        1209600                 ; expire
 8                        1800                    ; ttl
 9                        )
10; Name servers
11                        IN NS ns1.example.com.
12                        IN NS ns2.example.com.
13
14; PTR records
151 IN PTR ns1.example.com.
162 IN PTR ns2.example.com.
173 IN PTR www.example.com.

保存并关闭文件,当你完成。

测试文件并重新启动服务

现在我们已经配置了主服务器,我们可以继续测试我们的配置文件并实施我们的更改。

您可以使用包含的nsd-checkconf工具检查主配置文件的语法,只需将该工具指向您的主配置文件:

1sudo nsd-checkconf /etc/nsd/nsd.conf

如果此信息立即返回而无输出,则意味着您的主要配置文件的语法有效. 如果您收到错误,请检查您的配置文件的语法以修复任何错误。

在您能够清洁地执行检查后,您可以通过键入重新启动服务:

1sudo service nsd restart

这将停止并启动NSD大象。

查看日志查看任何消息:

1sudo tail -f /var/log/nsd.log

你应该看到一些错误,看起来像这样:

1. . .
2[1404333729] nsd[2142]: error: xfrd: zone 2.0.192.in-addr.arpa: received notify response error NAME ERROR from 192.0.2.2
3[1404333729] nsd[2142]: error: xfrd: zone 2.0.192.in-addr.arpa: max notify send count reached, 192.0.2.2 unreachable

这是因为NSD正在尝试将该区域转移到尚未配置的辅助服务器。

配置二级NSD服务器

现在我们已经设置了主服务器,我们可以继续前进,并准备好二级服务器。

再次,我们希望确保我们的SSL证书和密钥都生成并可用。

1sudo nsd-control-setup

这将确保控制戴蒙所需的所有凭证文件可供我们使用。

设置 nsd.conf 文件

二级服务器的nsd.conf文件将大多与主要服务器相同。我们只需要修改几件东西。 首先将主服务器的/etc/nsd/nsd.conf文件复制到二级服务器的/etc/nsd/nsd.conf文件中。

此次服务器的文件现在应该是这样的:

 1server:
 2    do-ip4: yes
 3    port: 53
 4    username: nsd
 5    zonesdir: "/etc/nsd"
 6    logfile: "/var/log/nsd.log"
 7    pidfile: "/run/nsd/nsd.pid"
 8
 9remote-control:
10    control-enable: yes
11    control-interface: 127.0.0.1
12    control-port: 8952
13    server-key-file: "/etc/nsd/nsd_server.key"
14    server-cert-file: "/etc/nsd/nsd_server.pem"
15    control-key-file: "/etc/nsd/nsd_control.key"
16    control-cert-file: "/etc/nsd/nsd_control.pem"
17
18key:
19    name: "demokey"
20    algorithm: hmac-sha256
21    secret: "+kO0Vu6gC+9bxzMy3TIZVLH+fg=="
22
23pattern:
24    name: "tosecondary"
25    notify: 192.0.2.2 demokey
26    provide-xfr: 192.0.2.2 demokey
27
28zone:
29    name: "example.com"
30    zonefile: "example.com.zone"
31    include-pattern: "tosecondary"
32
33zone:
34    name: "2.0.192.in-addr.arpa"
35    zonefile: "192.0.2.zone"
36    include-pattern: "tosecondary"

这几乎是我们所需要的。

服务器远程控制钥匙部分已经完全配置了,在钥匙部分中的秘密必须匹配主服务器的值,因此复制完整的文件内容可以轻松满足这一要求。

我们所复制的部分是主要服务器的特定部分,所以我们想修改它以从次要服务器的角度来解决问题。

首先,改名为更具描述性的东西,我们将使用相同的惯例,称之为从初级我们还需要更改这个设置的指令,而不是通知参数,二级服务器需要一个允许通知参数,它指定了允许通知的服务器,我们仍然会使用相同的密钥,所以我们只需要更改名称和适当的IP地址。

类似的方式,我们需要将 provide-xfr 参数更改为 request-xfr. 此格式略有变化. 我们需要指定我们想要一个 AXFR 传输(NSD 主机唯一可用的类型),我们需要指定 IP 地址 and 主端口号。

模式部分将在你完成后看起来像这样:

1pattern:
2    name: "fromprimary"
3    allow-notify: 192.0.2.1 demokey
4    request-xfr: AXFR 192.0.2.1@53 demokey

对于区域部分,我们唯一需要修改的是包括模式,以匹配我们刚刚创建的新模式:

1zone:
2    name: "example.com"
3    zonefile: "example.com.zone"
4    include-pattern: "fromprimary"
5
6zone:
7    name: "2.0.192.in-addr.arpa"
8    zonefile: "192.0.2.zone"
9    include-pattern: "fromprimary"

完成后,保存并关闭文件。

测试文件并重新启动服务

由于我们的二级服务器将通过从主服务器的传输接收所有区域数据,我们实际上不需要在这个主机上配置区域文件。

再次,我们应该通过键入我们主要配置文件的语法:

1sudo nsd-checkconf /etc/nsd/nsd.conf

如果您收到任何错误,您需要再次查看您的 nsd.conf 文件以解决语法问题. 如果命令返回没有任何输出,则意味着您的语法在文件中有效。

当您的配置文件通过测试时,您可以通过键入以下方式重新启动服务:

1sudo service nsd restart

检查日志,确保一切顺利:

1sudo tail -f /var/log/nsd.log

授权您的名称服务器

现在,您的专有NSD服务器应该配置并准备为您的域服务器提供DNS信息,我们仍然需要配置您的域,以便它知道如何使用您的名称服务器。

要做到这一点,您需要在您购买域名的注册表中调整一些设置. 部分术语和可能的界面将因注册表而异,但如果您仔细观察,您应该能够找到设置。

我将展示如何使用 Namecheap,一个相当标准的域名注册器。

我们需要以一种方式调整您的名称服务器,使我们能够在域的母域中设置 **glue 记录。

当您授权子域(如example.comcom域)时,您必须指定为该域权威的名称服务器. 如果名称服务器位于该域内,则您必须包含粘贴记录,这只是每个名称服务器的A记录,这些名称服务器对授权区域具有权威性。

我们需要这一点,因为如果粘贴记录不包含,DNS搜索将陷入循环中。客户会询问我们的注册商谁为域名example.com具有权威性,我们的注册商会(我们配置后)返回ns1.example.comns2.example.com

在注册器的界面中,您可以配置您的名称服务器 and 与其相关的 IP 地址的位置将取决于您的提供商。 使用 Namecheap,有一个名为Nameserver 注册的部分,允许您设置名称服务器的 IP 地址以创建粘贴记录:

Namecheap nameserver registration

在这里,您可以设置名称服务器,并将其绘制到特定IP地址:

Namecheap map name servers

完成此操作后,您将需要为您的域名设置正在使用的活跃名称服务器. Namecheap 有一个名为域名服务器设置的选项,可实现:

Namecheap set nameservers

在选择该选项时获得的界面中,您可以输入您刚刚注册的名称服务器的主机名称:

Namecheap input nameservers

您与注册表进行的更改可能需要一些时间来传播,数据还需要额外的时间来传播到世界其他DNS服务器,通常,这个过程应该在接下来的24到48小时内完成。

结论

使用本指南,你现在应该有一个主要和次要的权威的DNS服务器,可以用来服务有关你的域的DNS信息。

Published At
Categories with 技术
comments powered by Disqus