提供:ZStack云计算
系列教程
本教程为DNS管理介绍系列七篇中的第七篇。
内容介绍
即使对于经验丰富的管理员而言,设置一套DNS服务器以支持域名仍是一项相当复杂的任务。DNS区管理极为重要,然而其实现难度也必须加以关注。
Bind DNS服务器等软件极具良好的灵活性,但这种灵活性亦意味着其未针对任何任务做出优化,而这将带来一系列副作用。
这意味着我们可能会配置大量不需要的功能组件。这种额外的复杂性会令管理工作更加困难,同时也意味着软件本身对任何特定任务不够敏感。
为了解决这一难题,NSD作为替代性DNS服务器应运而生,并作为理想的仅权威DNS服务器为大家所喜爱。无需再担心递归或者缓存机制,该服务器即拥有高性能与小体积等实际优势。
在本篇教程中,我们将探讨如何在Ubuntu 14.04服务器上安装并配置NSD,从而安全地实现DNS区管理。
前提与目标
在开始本教程前,请大家参阅DNS基本概念与术语。如果大家需要了解仅权威DNS服务器的用途,可参阅各类DNS服务器区别说明。
作为一套仅权威DNS服务器,NSD并不提供任何缓存、转发或递归功能。其只会响应控制下各区的迭代请求,同时亦可作为其授权的其它域名服务器的引用解析器。
作为示例,我们将利用NSD软件配置两套服务器,分别作为区内的主服务器与从服务器。我们还将提供配置数据,允许客户端接入第三台主机上的Web服务器。
本教程中我们使用example.com域名。大家可以替换为自己的实际域名。该设备将拥有以下属性:
PurposeDNS FQDNIP Address
Master name server ns1.example.com. 192.0.2.1
Slave name server ns2.example.com. 192.0.2.2
Web Server www.example.com. 192.0.2.3
在完成教程后,大家应当拥有两套由NSD配置的服务器,其作为区内的仅权威服务器。大家将能够使用我们配置的主机名称通过互联网接入服务器,同时查询IP地址以找到主机名称。
在域名服务器上设置主机名称
首先,我们需要确保域名服务器能够正确解析其主机名称。
在首套DNS服务器上,编辑/etc/hosts文件以设置该计算机的FQDN:
sudo nano /etc/hosts
这里我们将192.0.2.1 IP地址映射至首套域名服务器的完整名称,即ns1.example.com.我们可以将利用公共IP地址指定主机名称的行进行替换,并缩短主机别名:
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服务器已经配置就绪。下面在第二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。
在两套域名服务器上安装NSD
接下来在域名服务器上安装该软件。
在开始之前,我们需要完成另一项工作。库中的NSD软件包能够安装该软件,配置部分组件,同时尝试启动该服务。此服务应由nsd用户进行运行,但软件包实际上并不会创建此用户账户。
要避免安装中发生错误,我们将创建此用户,而后再安装软件。在各设备上,创建nsd系统用户:
sudo useradd -r nsd
现在我们需要安装NSD软件。Ubuntu 14.04库中包含NSD,因此我们可以直接使用apt进行提取。下面更新本地软件包目录而后下载对应的软件包:
sudo apt-get update
sudo apt-get install nsd
这样软件将得到安装,进行部分初始配置,而后启动服务。
配置主NSD服务器
我们首先设置ns1服务器,其会被配置为区内的主DNS服务器。
我们首先要做的是确保全部必要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。
首先在server部分内配置DNS服务器的基本属性。我们将在默认DNS端口53上处理基本IPv4流量。我们将使用nsd用户。其中大部分为默认值,但我们需要取消部分行的注释使其值起效。
我们还需要明确设置用于容纳区数据的目录,外加日志与pid文件位置。这里也有其它众多配置选项可以设置,但我们出于简化教程的考虑不再加以发动。
我们的server部分应如下所示:
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=="
接下来,我们设置一套简单模式,因为来自服务器的信息中存在部分重复。我们每次都会将区通知并转移到相同的从节点,因此创建这样一套模式能够简化流程。
这里调用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处理各特定区及其相关文件的具体方式。
首先配置forward区。我们需要将该区设置为我们的example.com区。这一步骤非常简单,只需要将该域本身在name参数内进行指定,同时指定我们用于区文件的名称,并包含此前用于转移至从服务器的模式即可。
我们演示中的forward区如下所示:
zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "toslave"
下面处理反向区。反向区基本上属于一个区文件,允许DNS软件为客户端将IP地址映射回主机名称。总体而言,在DigitalOcean这样的托管平台上,其由托管供应方负责管理。
例如,在DigitalOcean中,大家无需委派IP地址范围来设置反向映射。相反,DigitalOcean会自动创建必要的反向映射。
大家可以参阅Bind仅权威指南一文内的“关于反向区”章节了解更多相关细节。我们将演示如何为NSD设置反向区,从而实现信息化效果及灵活性。
在反向区中,我们取IP地址的前三个字节,进行反向处理而后将其作为子域代表添加至in-addr.arpa当中。通过这种方式,DNS系统能够利用与普通域相同的查找方法搜索IP地址。在本示例中,我们的反向区将定义2.0.192.in-addr.arpa映射。其内容与forward区规范比较类似:
zone:
name: "2.0.192.in-addr.arpa"
zonefile: "192.0.2.zone"
include-pattern: "toslave"
完成后保存并退出。
创建Forward区文件
现在我们需要创建了forward区文件。在本配置中,我们将其命名为example.com.zone。我们需要使用此名称在/etc/nsd目录内创建该文件。
使用sudo权限打开该文件:
sudo nano /etc/nsd/example.com.zone
这里首先设置部分参数。我们将$ORIGIN参数设置为指向以FQDN格式(以.结尾)配置的域。我们还需要设置默认的time-to-live——其初始值为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。
括号中的各值则定义了区的部分值。这里我们只提一项,即序列号。此值必须在每次对该区文件进行变更时加以递增。在这里,我们使用日期加版本号的构成方式。
下面,我们需要使用NS记录来定义此区中的权威域名服务器。请注意使用FQDN作为域名,且包含结尾处的.:
IN NS ns1.example.com.
IN NS ns2.example.com.
下面设置一条A记录,其会自动告知客户端如何接入我们指定的域名服务器。其负责将我们的主机名称映射至其实际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参数。这一次,注意将origin设置至区的in-addr.arpa子域。在本示例中,其内容如下:
$ORIGIN 2.0.192.in-addr.arpa.
$TTL 1800
下面是SOA记录,与之前提到的一样。我们可以在该文件中使用同样的值,因为两个区的邮箱与权限域名服务器并无区别。另外,各数字值也可直接沿用。不过要注意在每次执行变更时修改其序列号:
@ IN SOA ns1.example.com. admin.example.com. (
2014070201 ; serial number
3600 ; refresh
900 ; retry
1209600 ; expire
1800 ; ttl
)
完成后,文件应如下所示:
我们还需要定义作为区权威的域名服务器。这里继续使用同样的服务器:
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文件复制到从服务器的相同位置。
从服务器的文件应如下所示:
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中的secret部分则必须与主服务器的值相匹配,因此直接复制文件即可满足要求。
这里首先需要修改的就是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
如果存在错误,请按照提示进行修改。若无输出结果,则语法一切正常。
下面重启该服务:
sudo service nsd restart
检查日志以确保一切正常:
sudo tail -f /var/log/nsd.log
委派权威域名服务器
现在我们的仅权威NSD服务器已经配置完成,且能够用于支持域名的DNS信息。这里仍然需要配置域名以确保其了解所要使用的域名服务器。
这里我们只需要调整注册表中的部分设置,添加域名。不同注册表的具体术语与界面可能有所区别,但只要认真观察应该可以找到对应的设定选项。
在本示例中,我们使用Namecheap作为标准域名注册表。
接下来调整域名服务器,确保其允许我们在主域内设置glue记录。在域名服务器处于域本身中时,这种作法将非常必要。
在委派子域名时(例如com域中的example.com),大家必须指定作为该域权威的域名服务器。如果该域名服务器处于域内,我们还必须添加一条glue记录,其本质上属于A记录,存在于作为所委派区权威的各域名服务器内。
之所以要进行这项操作,是因为DNS会在不存在glue记录时不断查找并形成循环。客户端会不断查询注册表以查找example.com的权威域名,而我们的注册表(在配置后)会返回ns1.example.com与ns2.example.com。如果我们不添加A记录以将其解析为IP地址,则客户端将永远无法完成这部分查询。
注册表界面中的域名服务器与及相关IP地址配置位置具体取决于大家的实际选项。在Namecheap中,我们可以找到Nameserver Registration部分,其允许大家设置域名服务器的IP地址以创建glue记录:
在这里,大家可以设置域名服务器并将其映射至特定IP地址:
完成之后,大家还需要域本身所使用的实际域名服务器。Namecheap提供“Domain Name Server Setup”选项来完成这项工作:
在此界面中,大家选定该选项后即可输入域名服务器的主机名称:
注册表的各项变更可能需要一段时间才能广播完毕。其数据也将耗费一段时间以传播至世界范围内的各DNS服务器。一般来讲,这一流程可能需要24到48个小时。
总结
通过本教程,大家现在应该已经拥有了主与从仅权威DNS服务器,并可利用其提供与域名相关的DNS信息。与Bind不同,NSD针对高性能权威操作进行了优化,因此我们能够针对特定需求进行调整并获得理想的性能表现。
本文来源自DigitalOcean Community。英文原文:How To Use NSD, an Authoritative-Only DNS Server, on Ubuntu 14.04 By Justin Ellingwood
翻译:diradw
873

被折叠的 条评论
为什么被折叠?



