介绍
设置负责域名的DNS服务器可能是一项复杂的任务,即使对于经验丰富的管理员也是如此。 DNS区域管理是一项至关重要的职责,但可能令人迷惑,尤其是在尝试开始时。
像绑定 DNS服务器软件是非常灵活,并且可以配置在整个DNS层次操作尽可能多的组件。 然而,这种灵活性也意味着Bind没有针对任何一个任务进行优化。 这有一些副作用。
大多数时候,你的配置没有必要的大块功能。 这种额外的复杂性使管理更加困难。 这也意味着软件本身对任何一个任务的响应将更少。
为了解决这个问题,已经创建了专用于DNS解析的单个区域的备选DNS服务器。 一块被称为NSD软件,是理想的管理权威DNS区域的仅权威DNS服务器。 无需担心递归或缓存,此服务器具有高性能和低占用空间。
在本指南中,我们将演示如何安装和配置NSD以在Ubuntu 14.04服务器上安全地管理我们的DNS区域。
先决条件和目标
你本指南开始之前,您应该熟悉一些基本的DNS概念和术语 。 如果您需要帮助理解的仅权威DNS服务器用于什么,看看我们的指导上的DNS服务器类型之间的差异 。
作为一个权威的DNS服务器,NSD不提供任何缓存,转发或递归功能。 它只响应它控制的区域的迭代请求。 它还可以将解析器引用到已委派离开的区域的其他Nameservers。
为了本指南的目的,我们将使用NSD软件配置两个服务器,作为我们区域的主服务器和从服务器。 我们还将提供配置数据,让客户端访问第三台主机上的Web服务器。
我们将使用虚拟域example.com
本指南。 你应该替换你自己的域来跟随。 我们将要配置的机器将具有以下属性:
目的 | DNS FQDN | IP地址 |
---|---|---|
主Nameservers | ns1.example.com。 | 192.0.2.1 |
从属Nameservers | ns2.example.com。 | 192.0.2.2 |
网络服务器 | www.example.com 。 | 192.0.2.3 |
完成本指南后,应将前两个服务器配置为使用NSD作为区域的唯一权威服务器。 您将能够使用我们配置的主机名从互联网到达您的服务器,以及通过查询IP地址找出主机名。 任何能够到达我们的服务器的解析客户端都能够从我们的服务器获取域数据。
在Nameservers上设置主机名
我们需要采取的第一步是准备。 在担心DNS配置之前,我们需要确保我们的Nameservers可以按照我们需要的方式正确解析自己的主机名。
关于你的第一个DNS服务器,请编辑/etc/hosts
的文件来设置FQDN此计算机的:
sudo nano /etc/hosts
在我们的例子中,我们需要在地图192.0.2.1
IP地址,我们的第一个Nameservers的全名, ns1.example.com
。 我们可以通过用我们的主机的公共IP地址,FQDN和缩短的别名替换指定主机名的行:
127.0.0.1 localhost
192.0.2.1 ns1.example.com ns1
保存并在完成后关闭文件。
接下来,我们需要仔细检查/etc/hostname
的文件:
sudo nano /etc/hostname
这应该包含我们的非限定主机名的值。 如有必要,请修改:
ns1
保存并在完成后关闭文件。
如果修改了/etc/hostname
文件之上,让系统重新读取该文件:
sudo hostname -F /etc/hostname
我们现在就完成了我们的第一个DNS服务器。 在第二台服务器上重复这些步骤。
修改/etc/hosts
文件中指定的第二个DNS服务器的主机:
sudo nano /etc/hosts
127.0.0.1 localhost
192.0.2.2 ns2.example.com ns2
检查/etc/hostname
文件中。 这应该只有短的无限制名称:
sudo nano /etc/hostname
ns2
再次,如果你必须修改任何东西,让系统重新读取文件:
sudo hostname -F /etc/hostname
您的服务器现在可以解析自己的名称,而无需使用DNS。 您现在可以在服务器上设置NSD。
在两个Nameservers上安装NSD
下一步是在您的Nameservers上实际安装软件。
在我们开始之前,我们实际上必须再进行一个准备步骤。 repos中的NSD软件包安装软件,配置一些组件,并尝试启动服务。 该服务预计将作为一个叫做用户身份运行nsd
,但包不实际创建该用户帐户。
为了避免安装时出现错误,我们会在安装软件之前 ,创建该用户。 在每台机器上,创建nsd
通过键入系统用户:
sudo useradd -r nsd
这将创建成功完成安装所需的正确帐户。
现在,我们只需要安装NSD软件。 幸运的是,NSD包含在Ubuntu 14.04版本库,所以我们可以只使用apt
把它拉下来。 我们将更新我们的本地包索引,然后下载相应的包:
sudo apt-get update
sudo apt-get install nsd
这将安装软件并做一些初始配置。 它也将启动服务,即使我们还没有配置它来服务任何东西。
配置主NSD服务器
我们将通过建立我们开始ns1
服务器,这将被配置为我们区域的主DNS服务器。
我们应该做的第一件事是确保NSD用于在应用程序的守护程序部分和控制器之间安全通信的所有SSL密钥和证书。
为此,请键入:
sudo nsd-control-setup
有可能已经密钥和证书出现在/etc/nsd
目录,但该命令会产生任何缺失。
配置nsd.conf文件
对于NSD主配置文件是一个名为nsd.conf
位于/etc/nsd
目录。
有一个文件只包含几个注释已经在这个目录,但我们将使用一个更完整的注释示例文件作为我们的模板。 现在复制此文件以覆盖当前文件:
sudo cp /usr/share/doc/nsd/examples/nsd.conf /etc/nsd/nsd.conf
现在,使用sudo权限在文本编辑器中打开新文件:
sudo nano /etc/nsd/nsd.conf
在里面,你会看到一些注释的配置行组织成部分。 主要栏目有server
, remote-control
, key
, pattern
和zone
。 我们将使用这些大部分用于我们的配置。
首先,我们应该在配置我们的DNS服务器的基本属性server
部分。 我们将处理的默认DNS端口53上基本IPv4流量我们将使用nsd
之前设置的用户。 大多数将是默认值,但我们将取消注释相关行以使其值显式。
我们还要显式设置包含区域数据的目录,以及我们的log和pid文件位置。 还有许多其他配置选项,您可以为此部分设置,但我们将保持相对简单。 随时进行其他更改。
我们的服务器部分将如下所示:
server:
do-ip4: yes
port: 53
username: nsd
zonesdir: "/etc/nsd"
logfile: "/var/log/nsd.log"
pidfile: "/run/nsd/nsd.pid"
接下来,让我们来看看在remote-control
部分。 这个部分有点不当,因为它不仅用于远程控制我们的守护进程。 我们将配置它以在本地控制守护程序。
首先,我们需要启用资源并设置其接口和端口号。 这都可以通过取消注释相应行和改变来实现control-enable
指令为“yes”。
接下来,我们可以取消注释指定密钥和证书文件的行。 这些匹配,当我们运行生成的文件名nsd-control-setup
命令,不应需要进行修改,一旦他们注释。
我们对此部分的值应如下所示:
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/etc/nsd/nsd_server.key"
server-cert-file: "/etc/nsd/nsd_server.pem"
control-key-file: "/etc/nsd/nsd_control.key"
control-cert-file: "/etc/nsd/nsd_control.pem"
接下来,我们将配置的key
部分。 此部分将包含NSD将用于安全执行主服务器和从服务器之间的区域传输的密钥。
我们需要设置将使用的名称和算法。 我们将使用名称demokey
为我们的榜样。 我们也将使用默认的算法( hmac-sha256
,他们已经选择)。
对于秘密本身,我们将在评论中如何安全地生成一个建议。 退出文本编辑器。 在终端中,运行以下命令:
dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64
您将在命令的输出中接收到随机生成的密钥:
0+1 records in
0+1 records out
19 bytes (19 B) copied, 0.000571766 s, 33.2 kB/s
+kO0Vu6gC+9bxzMy3TIZVLH+fg==
将输出以上面的红色复制并再次打开您的配置文件。 使用复制输出作为值secret
参数。 此部分应如下所示:
key:
name: "demokey"
algorithm: hmac-sha256
secret: "+kO0Vu6gC+9bxzMy3TIZVLH+fg=="
接下来,我们将设置一个简单的模式,因为我们有一些重复的信息涉及我们的从服务器。 我们将每次通知和转移我们的区域到同一个Minion,所以创建一个模式是有道理的。
我们将调用我们的模式toslave
来描述该模式将被用于。 我们将为每个区域单独设置名称和文件,因此我们不需要在模式中担心。
我们要设置的notify
在我们的模式参数引用我们的从属服务器的IP地址。 我们还想使用我们指定的密钥来安全地使用TSIG传输区域。 我们将建立provide-xfr
参数完全相同的方式。
最终我们的pattern
部分应该是这样的:
pattern:
name: "toslave"
notify: 192.0.2.2 demokey
provide-xfr: 192.0.2.2 demokey
最后,我们对我们的zone
部分。 在这里,我们配置NSD将如何处理我们的特定区域及其相关文件。
首先,我们将配置我们的前进区。 我们需要建立区域我们example.com
区。 这是因为在指定域本身一样简单name
参数,指定我们将使用的区域文件的名称,包括我们为了这个传递给我们的从服务器上面创建的模式。
我们的演示的完成的向前区域应该看起来像这样:
zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "toslave"
接下来,我们可以照顾反向区。 反向区域基本上是一个区域文件,允许DNS软件将IP地址映射回客户端的主机名。 一般来说,像DigitalOcean的托管,这是由托管提供商照顾。
例如,使用DigitalOcean,您不需要委派一定范围的IP地址负责设置反向映射。 相反,如果将控制面板中服务器的主机名设置为您希望映射回的FQDN,DigitalOcean将自动创建必要的反向映射。
您可以通过阅读“一点关于反向区”的部分更多地了解反向映射绑定仅权威指南 。 我们将向您展示如何为NSD设置反向区域以用于信息目的和更大的灵活性,即使这仅在您已被委派控制IP块的反向映射的情况下才是相关的。
对于反向区域,我们把IP地址的前三个字节,扭转他们,并把它们添加为子代表团到特殊域in-addr.arpa
。 这是DNS系统使用与常规域相同的查找方法搜索IP地址的方式。 对于我们的情况,我们将作出定义一个反向区域2.0.192.in-addr.arpa
映射。 这将看起来非常类似于正向区域规范:
zone:
name: "2.0.192.in-addr.arpa"
zonefile: "192.0.2.zone"
include-pattern: "toslave"
保存并在完成后关闭文件。
创建前向区域文件
现在,我们需要创建正向区域文件。 在我们的配置中,我们将区域文件命名为“example.com.zone”。 我们必须建立一个档案,这个名字在我们/etc/nsd
目录。
使用sudo权限在文本编辑器中打开该文件:
sudo nano /etc/nsd/example.com.zone
我们需要做的第一件事是在顶部设置几个参数。 我们将设置$ORIGIN
指向我们配置FQDN格式的域名(完整的结束点)参数。 我们还想设置默认的生存时间。 我们将使用1800秒,或30分钟:
$ORIGIN example.com.
$TTL 1800
接下来,我们需要我们的SOA,或者开始授权记录。 这将看起来像这样:
@ IN SOA ns1.example.com. admin.example.com. (
2014070201 ; serial number
3600 ; refresh
900 ; retry
1209600 ; expire
1800 ; ttl
)
这定义了一些区域范围的值。 该ns1.example.com.
值用于指定该区域的权威的一台服务器的域位置。 该admin.example.com.
用于指定区域的管理员可以到达的电子邮件地址。
的电子邮件地址,在这种情况下是admin@example.com
。 在DNS区域文件中,“@”符号必须更改为点。 结束点也很重要,因为它们总是在指定FQDN时。
括号中的值定义了我们区域的一些值。 这里我们只提到的是序列号。 此值必须递增每次您更改到区域文件的时间。 在这里,我们使用此写作日期(2014年7月2日)加上修订版本号来演示。
接下来,我们需要使用NS记录来定义对此区域具有权威性的Nameservers。 请记住使用您网域的FQDN,包括结束点:
IN NS ns1.example.com.
IN NS ns2.example.com.
接下来,我们需要设置A记录,实际告诉客户端如何到达我们指定的Nameservers。 这是将我们的主机名映射到其实际IP地址:
ns1 IN A 192.0.2.1
ns2 IN A 192.0.2.2
最后,我们要为其他主机添加任何其他A记录。 在我们的例子中,我们将建立我们的基础域( example.com
)和www
主机名映射到我们的Web服务器:
@ IN A 192.0.2.3
www IN A 192.0.2.3
完成后,您完成的文件应如下所示:
$ORIGIN example.com.
$TTL 1800
@ IN SOA ns1.example.com. admin.example.com. (
2014070201 ; serial number
3600 ; refresh
900 ; retry
1209600 ; expire
1800 ; ttl
)
; Name servers
IN NS ns1.example.com.
IN NS ns2.example.com.
; A records for name servers
ns1 IN A 192.0.2.1
ns2 IN A 192.0.2.2
; Additional A records
@ IN A 192.0.2.3
www IN A 192.0.2.3
保存并在完成后关闭文件。
创建反向区域文件
接下来,我们将为我们的反向区域创建一个类似的文件。 请记住,这只有在您已被委派负责地址块的反向映射时才需要。
创建您在引用的反向区域文件nsd.conf
文件,并在文本编辑器sudo的权限打开它:
sudo nano /etc/nsd/192.0.2.zone
再有,我们会通过定义开始$ORIGIN
和$TTL
参数。 这一次,记得到原点设置为in-addr.arpa
为您的区域子域。 在我们的示例中,它将如下所示:
$ORIGIN 2.0.192.in-addr.arpa.
$TTL 1800
接下来,我们需要像以前一样设置SOA记录。 我们几乎可以使用这个文件的完全相同的值,因为相同的电子邮件和权威Nameservers负责两个区域。 此外,数值也应该在这种情况下工作。 每次进行更改时,请记住修改序列号:
@ IN SOA ns1.example.com. admin.example.com. (
2014070201 ; serial number
3600 ; refresh
900 ; retry
1209600 ; expire
1800 ; ttl
)
完成后,文件应如下所示:
同样,我们需要定义对区域具有权威性的Nameservers。 这些将是相同的服务器:
IN NS ns1.example.com.
IN NS ns2.example.com.
最后,我们需要通过使用PTR记录将每个IP地址的最后一个八位字节路由到相关主机的FQDN来提供实际的反向域映射:
1 IN PTR ns1.example.com.
2 IN PTR ns2.example.com.
3 IN PTR www.example.com.
完成后,文件应如下所示:
$ORIGIN 2.0.192.in-addr.arpa.
$TTL 1800
@ IN SOA ns1.example.com. admin.example.com. (
2014070201 ; serial number
3600 ; refresh
900 ; retry
1209600 ; expire
1800 ; ttl
)
; Name servers
IN NS ns1.example.com.
IN NS ns2.example.com.
; PTR records
1 IN PTR ns1.example.com.
2 IN PTR ns2.example.com.
3 IN PTR www.example.com.
保存并在完成后关闭文件。
测试文件并重新启动服务
现在我们已经配置了主服务器,我们可以继续测试我们的配置文件并实现我们的更改。
您可以通过使用附带的检查主配置文件的语法nsd-checkconf
工具。 只需将工具指向主配置文件:
sudo nsd-checkconf /etc/nsd/nsd.conf
如果此命令立即返回而没有输出,则意味着主配置文件的语法有效。 如果遇到错误,请检查配置文件的语法以修复任何错误。
在能够干净地执行检查后,您可以键入以下命令重新启动服务:
sudo service nsd restart
这将停止并启动NSD守护程序。
检查日志以查看任何消息:
sudo tail -f /var/log/nsd.log
您应该会看到以下类似的错误:
. . .
[1404333729] nsd[2142]: error: xfrd: zone 2.0.192.in-addr.arpa: received notify response error NAME ERROR from 192.0.2.2
[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证书和密钥都已生成并可用。 为此,请发出以下命令:
sudo nsd-control-setup
这将确保控制守护程序所需的所有凭据文件可供我们使用。
配置nsd.conf文件
该nsd.conf
为从服务器文件将是大致相同的主服务器。 只有少数事情需要我们修改。 通过复制主服务器的开始/etc/nsd/nsd.conf
文件到从服务器的/etc/nsd/nsd.conf
文件。
此从属服务器的文件现在应如下所示:
server:
do-ip4: yes
port: 53
username: nsd
zonesdir: "/etc/nsd"
logfile: "/var/log/nsd.log"
pidfile: "/run/nsd/nsd.pid"
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/etc/nsd/nsd_server.key"
server-cert-file: "/etc/nsd/nsd_server.pem"
control-key-file: "/etc/nsd/nsd_control.key"
control-cert-file: "/etc/nsd/nsd_control.pem"
key:
name: "demokey"
algorithm: hmac-sha256
secret: "+kO0Vu6gC+9bxzMy3TIZVLH+fg=="
pattern:
name: "toslave"
notify: 192.0.2.2 demokey
provide-xfr: 192.0.2.2 demokey
zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "toslave"
zone:
name: "2.0.192.in-addr.arpa"
zonefile: "192.0.2.zone"
include-pattern: "toslave"
这几乎正是我们需要的。
该server
, remote-control
,以及key
部分已经完全配置。 在“秘密”中的key
部分必须在主服务器的值相匹配,所以复制完整的文件内容可以很容易地满足这一要求。
我们将需要修改的第一件事是pattern
一节。 我们复制的部分是特定于主服务器的,所以我们要修改它以从从服务器的角度来解决问题。
首先,将名称更改为更具描述性的名称。 我们将使用相同的约定,并称之为frommaster
。 我们还需要更改这个设置的指令。 取而代之的是的notify
参数,从服务器需要一个allow-notify
参数,该参数指定允许通知它的服务器。 我们仍然会使用相同的密钥,所以我们只需要修改名称和相应的IP地址。
以类似的方式,我们需要改变provide-xfr
参数来request-xfr
。 其格式稍有变化。 我们需要指定我们想要一个AXFR转移(唯一的那种NSD大师能够),我们需要指定IP地址和主机的端口号。
该pattern
部分将看起来像这样当您完成:
pattern:
name: "frommaster"
allow-notify: 192.0.2.1 demokey
request-xfr: AXFR 192.0.2.1@53 demokey
对于zone
的部分,我们需要修改的唯一的事情就是include-pattern
,以配合我们,我们刚刚创建的新格局:
zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "frommaster"
zone:
name: "2.0.192.in-addr.arpa"
zonefile: "192.0.2.zone"
include-pattern: "frommaster"
完成后,保存并关闭文件。
测试文件并重新启动服务
由于我们的从服务器将通过从主服务器的传输接收其所有的区域数据,我们实际上不需要在此主机上配置区域文件。
同样,我们应该通过键入以下内容来检查我们的主配置文件的语法:
sudo nsd-checkconf /etc/nsd/nsd.conf
如果您收到任何错误,你需要再看看你的nsd.conf
文件来解决语法问题。 如果命令在没有任何输出的情况下返回,则意味着您的语法在文件中有效。
当您的配置文件通过测试时,您可以通过键入以下内容重新启动服务:
sudo service nsd restart
检查日志以确保事情正常:
sudo tail -f /var/log/nsd.log
向您的Nameservers委派权限
现在,您的只有权威的NSD服务器应该配置并准备好提供有关您的域的DNS信息。 我们仍然需要配置您的域,以便它知道使用您的Nameservers。
为此,您需要在您购买域名的注册商处调整一些设置。 一些术语,当然接口将不同,从注册商到注册商,但你应该能够找到设置,如果你仔细看。
我将展示如何使用做Namecheap ,一个相当标准的域名注册商。
我们需要的方式,将使我们能够在域的父设置粘合记录来调整你的域名服务器。 每当域名服务器是域本身这是必要的。
当你委托(如子域example.com
从com
域名),您必须指定Nameservers具有权威性的域。 如果Nameservers是域范围内, 还必须包括胶水记录,这简直就是为每个域名服务器的具有权威性的委派区域的A记录。
我们需要这样做,因为如果不包括胶水记录,DNS查找将被捕获在循环中。 客户会问我们的注册谁是权威域example.com
和我们的注册会(在我们这个配置)返回ns1.example.com
和ns2.example.com
。 如果我们不包括A记录来将这些解析为IP地址,那么客户端将永远不能超过这一点。 它将无法找到它所需要的Nameservers的IP地址,因为这些通常在Nameservers本身中定义。
在注册商的界面,你可以配置你的名字服务器及其关联IP地址的位置将取决于您的供应商。 使用Namecheap,有一个名为“Nameserver注册”的部分,允许您设置Nameservers的IP地址以创建粘贴记录:
在这里,您可以设置Nameservers并将其映射到特定的IP地址:
完成此操作后,您需要设置用于您的域的活动Nameservers。 Namecheap有一个称为“域名服务器设置”的选项,可以实现:
在选择该选项时获得的界面中,可以输入刚刚注册的Nameservers的主机名:
您对注册商所做的更改可能需要一些时间才能传播。 该数据还需要额外的时间才能传播到世界上其他DNS服务器。 通常,此过程应在接下来的24-48小时内完成。
结论
使用本指南,您现在应具有一个主从属权限的DNS服务器,可用于提供有关您的域的DNS信息。 与绑定不同,NSD针对高性能权威行为进行了优化,因此您可以获得更好的性能,特别适合您的需求。