如何在Ubuntu14.04上的NSD名称服务器上设置DNSSEC
关于 DNSSEC
DNS 安全扩展 (DNSSEC) 是一种旨在保护应用程序和 DNS 解析器免于使用伪造或操纵的 DNS 数据的技术。
问题:攻击者有可能篡改DNS响应或毒害DNS缓存并将用户带到地址栏中具有合法域名的恶意站点。
解决方案: DNSSEC 配置的权威 DNS 服务器通过使用私钥对每个资源记录进行数字签名来防止此类攻击。 DNS 解析器使用公钥和数字签名验证区域记录的完整性。
关于 NSD
Name Server Daemon (NSD) 是由 NLNet Labs 开发的开源权威 DNS 服务器软件。 它使用 BIND 样式的区域文件以方便配置。
仅权威的 DNS 服务器为其负责的区域提供查询的答案。 在本文中,我们将为两个域名设置我们自己的权威 NSD 名称服务器。 我们将配置 NSD 为两个域名提供 DNSSEC 签名的回复。
先决条件
本文要求读者具备以下方面的知识:
本文将使用两个域名:
域名 | 域名服务器 |
---|---|
例子.com | master.example.com |
slave.example.com | |
foobar.org | master.example.com |
slave.example.com |
以下两个 Droplet 将运行 NSD:
主机名 | IP地址 |
---|---|
master.example.com | 1.1.1.1 |
slave.example.com | 2.2.2.2 |
在整个教程中,您应该将 1.1.1.1 替换为您的主域名服务器的 IP 地址,并将 2.2.2.2 替换为您的从属域名服务器的 IP 地址。
本文的目的是展示如何设置一个名称服务器,无论其自己的域的 DNSSEC 状态如何,它都可以为使用 DNSSEC 的域提供服务。 为方便起见,域 example.com 用于名称服务器; 不需要为名称服务器域名配置 DNSSEC。 名称服务器可以很容易地设置为 master.my-soa.com 和 slave.my-soa.com。
您还需要记住您希望域解析的 IP 地址。 如果您还没有为这些域设置 Web 主机,您可以创建另一个运行 Web 服务器的测试 Droplet。 在 Ubuntu 14.04 映像上选择 LAMP。
LAMP Droplet 的 IP 地址将为 3.3.3.3。 此 IP 将用作两个域名的 A 记录,以检查它们是否从 Web 浏览器解析。 在整个教程中,您应该将 3.3.3.3 替换为所需的 Web 主机 IP 地址。
DNSSEC 术语
DNSSEC 致力于 公钥密码学 的概念,并引入了新的 DNS 记录类型。 在本节中,我们将讨论本文中将使用的一些术语。
钥匙
- ZSK: Zone Signing Key 是一对私钥/公钥。 私钥为所有 DNS 记录创建数字签名,而公钥由 DNS 解析器用于验证它。
- KSK: Key Signing Key 是一对私钥/公钥。 私钥对 ZSK 进行签名,而公钥对其进行验证。
记录
- DNSKEY:包含KSK和ZSK的公钥。
- RRSIG:Resource Record Signature 存在于每个记录中,并提供该记录的数字签名。 RRSIG 记录基于记录本身和 ZSK。
- DS:Delegation Signer 记录用于验证 DNSKEY 记录的完整性。 此记录输入域注册商的控制面板并驻留在 TLD 的权威名称服务器上。
为域设置 DNSSEC 需要名称服务器和注册商的适当记录。
DNSSEC 的工作原理
首先,我们将从域所有者(就是你!)的角度来讨论 DNSSEC。 您要确保来自您的域名服务器的所有 DNS 记录都已签名。 这样,如果有人试图欺骗您的 DNS 记录,他们将被识别为虚假,您的访问者可以避免访问恶意站点。
那么如何设置呢? 首先,对于每个域,您必须在名称服务器上生成两对唯一的私钥/公钥。 域的公钥存储在 DNSKEY 记录中,这些记录列在该域的区域文件中。 从 DNSKEY 记录生成另外两种类型的记录,DS 记录和 RRSIG 记录。 这三种类型的记录都是加密链接的。 也就是说,一旦你看到了三个中的一个,你就可以判断另外两个是否有效。
(注意:为了清楚起见,虽然每个域的每种类型的记录都有多个,但在本说明的其余部分,我们将以单数形式引用它们。)
接下来,您将 DS 记录上传到您的注册商,注册商会将其发布到您域的 TLD 名称服务器。 由于发布 DS 记录的唯一方法是通过注册商,这证明了域所有者是发布 DS 记录的人,从而证明了该 DS 记录的有效性。 DS 记录的目的是在 TLD 名称服务器和您为域运行的名称服务器之间建立 身份验证链 。 这是因为 DS 记录基于 DNSKEY,因此任何 DNS 解析器都可以检查您的 DNSKEY 是否与 DS 记录匹配,因此它是域的正确记录。
RRSIG 记录是伴随其他类型的 DNS 记录(如 A、MX 等)的签名,它基于记录值本身(如 IP 地址)和 DNSKEY。
配置了 DNSKEY、DS 和 RRSIG 记录后,现在就为您的域设置了 DNSSEC。
接下来我们将从用户的角度来谈谈它。 假设用户想要访问您的域,因此他们向 DNS 解析器查询您域的 A 记录。 在此示例中,递归 DNS 解析器已经根据 TLD 名称服务器上的 DS 记录检查了此域的 DNSKEY 的有效性,尽管它也可以轻松地第一次检查。
这是此查询如何工作的说明:
- 用户发送对 A 记录的查询,该记录到达可识别 DNSSEC 的递归 DNS 服务器。
- DNS 服务器通过发现其 DS 记录发现查询域支持 DNSSEC。 它将带有 DO 位 的 A 记录的查询发送到您的权威名称服务器。
- 您的名称服务器使用 A 记录和相应的 RRSIG 记录进行响应。
- 递归 DNS 服务器计算 A 记录的值 + 它在文件中的 DNSKEY 记录,并根据解密的 RRSIG 记录检查它。 (它可以检查 DS 记录以首先验证 DNSKEY 记录,如果它不在文件中。)如果哈希匹配,DNS 服务器将 A 记录返回给用户,用户现在可以访问您的网站。
有关 DNSSEC 工作原理的更多信息,您可能需要阅读 这篇文章 。 如需更全面的 DNSSEC 术语列表,请阅读 this。
步骤零 - 检查域和注册商支持
在决定在您自己的 NSD 名称服务器上设置 DNSSEC 之前,请确保您的域扩展名(.com、.org 等)和注册商支持 DNSSEC。
要检查域扩展是否已准备好 DNSSEC,请使用以下命令查询其 DNSKEY 记录:
dig DNSKEY com. +short
这应该返回公钥,如下所示:
256 3 8 AQPbokupKUJ5LLAtDEs6R3nDOHxF2jQEFtJEFTiDcfbsZia4fg3EK9Wv D9ZIr+7t2n1ddqRGHnTTInHTjduaKFPqm2iKaDHdrc6095o1mzqojnd1 bTtI45XNu61QmT5IU4VPT7HDUSby+53gLAsjLPyNsNEMp7Cc52RVxCHD no9efw== 257 3 8 AQPDzldNmMvZFX4NcNJ0uEnKDg7tmv/F3MyQR0lpBmVcNcsIszxNFxsB fKNW9JYCYqpik8366LE7VbIcNRzfp2h9OO8HRl+H+E08zauK8k7evWEm u/6od+2boggPoiEfGNyvNPaSI7FOIroDsnw/taggzHRX1Z7SOiOiPWPN IwSUyWOZ79VmcQ1GLkC6NlYvG3HwYmynQv6oFwGv/KELSw7ZSdrbTQ0H XvZbqMUI7BaMskmvgm1G7oKZ1YiF7O9ioVNc0+7ASbqmZN7Z98EGU/Qh 2K/BgUe8Hs0XVcdPKrtyYnoQHd2ynKPcMMlTEih2/2HDHjRPJ2aywIpK Nnv4oPo/
没有输出表明该域扩展缺乏 DNSSEC 支持。
如果您的 TLD 支持 DNSSEC 是不够的; 域名注册商还必须在其控制面板中提供输入 DS 记录的选项。 这可以通过谷歌搜索“registrar name dnssec”或直接询问注册商来确认。 以下是一些支持 DNSSEC 的流行注册商:
一旦您确认您的 TLD 和域名注册商都支持 DNSSEC,您就可以开始设置您的自定义域名服务器了。
第一步——在两台服务器上安装和设置 NSD
在这一步中,我们将在主服务器和从服务器上安装和配置 NSD。 我们还将为域 example.com 设置 DNS 记录。 本节将作为 NSD 的快速设置。 有关设置 NSD 的详细说明,请阅读 这篇文章。
主服务器
除了 NSD 服务器软件包之外,主服务器还需要以下软件包:
- ldnsutils:用于 DNSSEC 密钥生成和区域签名。
- haveged:用于增加熵。 安装此软件包可加快密钥生成过程。
为了避免在安装过程中出错,请创建一个名为 nsd 的系统用户:
useradd -r nsd
-r 选项创建一个系统用户。 更新存储库并安装 NSD、ldnsutils 和 haveged。
apt-get update apt-get install nsd ldnsutils haveged
从主服务器到从服务器的 DNS 区域传输由共享密钥保护。 使用以下命令随机生成密钥:
dd if=/dev/random count=1 bs=32 2> /dev/null | base64
记下输出字符串。 我们将在主服务器和从服务器的配置文件中使用它。
sHi0avMk1bME89cnJdHkYzFBbvQmQ8YZ
为区域文件创建一个单独的目录:
mkdir /etc/nsd/zones
编辑 NSD 的配置文件:
nano /etc/nsd/nsd.conf
第一个是 server 部分,它指定区域文件、日志和 PID(进程 ID)文件的位置:
server: username: nsd hide-version: yes zonesdir: "/etc/nsd/zones" logfile: "/var/log/nsd.log" pidfile: "/run/nsd/nsd.pid"
当 CHAOS 类查询完成时,hide-version 指令防止 NSD 返回其版本 。
在 key 部分中,我们定义了一个名为 mykey 的密钥并输入之前生成的密钥。
key: name: "mykey" algorithm: hmac-sha256 secret: "sHi0avMk1bME89cnJdHkYzFBbvQmQ8YZ"
每个 zone 部分将包含其从服务器的域名、区域文件名和详细信息:
zone: name: example.com zonefile: example.com.zone notify: 2.2.2.2 mykey provide-xfr: 2.2.2.2 mykey zone: name: foobar.org zonefile: foobar.org.zone notify: 2.2.2.2 mykey provide-xfr: 2.2.2.2 mykey
notify: 和 provide-xfr: 行应该有从服务器 的 IP 地址。 保存文件并为 example.com 创建一个区域文件。
nano /etc/nsd/zones/example.com.zone
我们将以下数据添加到区域文件中。 变量未标记,因为您需要自定义所有条目:
$ORIGIN example.com. $TTL 1800 @ IN SOA master.example.com. email.example.com. ( 2014080301 3600 900 1209600 1800 ) @ IN NS master.example.com. @ IN NS slave.example.com. master IN A 1.1.1.1 slave IN A 2.2.2.2 @ IN A 3.3.3.3 www IN CNAME example.com. @ IN MX 10 aspmx.l.google.com. @ IN MX 20 alt1.aspmx.l.google.com. @ IN MX 20 alt2.aspmx.l.google.com. @ IN MX 30 aspmx2.googlemail.com. @ IN MX 30 aspmx3.googlemail.com.
保存此文件并为 foobar.org 创建一个区域文件。
nano /etc/nsd/zones/foobar.org.zone
第二个区域文件:
$ORIGIN foobar.org. $TTL 1800 @ IN SOA master.example.com. email.example.com. ( 2014080301 3600 900 1209600 1800 ) @ IN NS master.example.com. @ IN NS slave.example.com. @ IN A 3.3.3.3 www IN CNAME foobar.org. @ IN MX 0 mx.sendgrid.com.
保存文件并使用 nsd-checkconf 命令检查配置错误:
nsd-checkconf /etc/nsd/nsd.conf
一个有效的配置不应该输出任何东西。 重启 NSD 服务器:
service nsd restart
使用 dig 命令检查域的 DNS 记录是否有效。
dig ANY example.com. @localhost +norec +short
此命令的示例输出:
master.example.com. email.example.com. 2014080301 3600 900 1209600 1800 master.example.com. slave.example.com. 3.3.3.3 10 aspmx.l.google.com. 20 alt1.aspmx.l.google.com. 20 alt2.aspmx.l.google.com. 30 aspmx2.googlemail.com. 30 aspmx3.googlemail.com.
对第二个域重复 dig 命令:
dig ANY foobar.org. @localhost +norec +short
我们已经在主服务器上成功安装和配置了 NSD,并且还创建了两个区域。
从服务器
从服务器只需要 NSD 包,因为它没有生成或签名。
创建一个名为 nsd 的系统用户:
useradd -r nsd
更新存储库并安装 NSD:
apt-get update apt-get install nsd
为区域文件创建一个目录:
mkdir /etc/nsd/zones
编辑 NSD 配置文件:
nano /etc/nsd/nsd.conf
添加配置指令:
server: username: nsd hide-version: yes zonesdir: "/etc/nsd/zones" logfile: "/var/log/nsd.log" pidfile: "/run/nsd/nsd.pid" key: name: "mykey" algorithm: hmac-sha256 secret: "sHi0avMk1bME89cnJdHkYzFBbvQmQ8YZ" zone: name: example.com zonefile: example.com.zone allow-notify: 1.1.1.1 mykey request-xfr: 1.1.1.1 mykey zone: name: foobar.org zonefile: foobar.org.zone allow-notify: 1.1.1.1 mykey request-xfr: 1.1.1.1 mykey
mykey 的 secret 应该与在主服务器中输入的完全相同。 在 allow-notify 和 request-xfr 行中使用 主服务器的 IP 地址 。
检查配置错误:
nsd-checkconf /etc/nsd/nsd.conf
重启 NSD 服务:
service nsd restart
使用 nsd-control 命令对两个域强制进行区域传输:
nsd-control force_transfer example.com nsd-control force_transfer foobar.org
现在检查此服务器是否可以回答域 example.com 的查询。
dig ANY example.com. @localhost +norec +short
如果这返回与 master 相同的结果,则此区域已正确设置。 对 foorbar.org 域重复 dig 命令,以验证其区域是否设置正确。 我们现在有一对 NSD DNS 服务器,它们对域 example.com 和 foobar.org 具有权威性。
此时,您应该可以在 Web 浏览器中访问您的域。 它们将解析为我们设置的默认 LAMP 服务器,或您指定的任何主机。
第二步 - 生成密钥并签署区域
在这一步中,我们将为每个域生成一对(私有和公共)区域签名密钥 (ZSK) 和密钥签名密钥 (KSK)。 除非另有说明,否则本节中的命令应在主服务器上执行。
将当前目录更改为 NSD 的区域目录:
cd /etc/nsd/zones
ldns-keygen 命令生成密钥文件并以 K<domain>+<algorithm>+<key-id>
格式打印它们的名称。 我们不会记下这个名称,而是将其分配给变量,以便以后可以轻松引用它。
在 RSASHA1-NSEC3-SHA1 算法中生成 ZSK:
export ZSK=`ldns-keygen -a RSASHA1-NSEC3-SHA1 -b 1024 example.com`
接下来通过将 -k 选项添加到同一命令来生成 KSK:
export KSK=`ldns-keygen -k -a RSASHA1-NSEC3-SHA1 -b 2048 example.com`
该目录现在将具有以下六个附加文件:
- 2 个带有 .private 扩展名的私钥。
- 2 个带有 .key 扩展名的公钥。
- 2 条带有 .ds 扩展名的 DS 记录。
在第三步中,我们将生成不同的摘要类型的DS记录,因此,为避免混淆,删除这些DS记录文件。
rm $ZSK.ds $KSK.ds
对 foobar.org 域重复 ldns-keygen 命令:
export ZSK2=`ldns-keygen -a RSASHA1-NSEC3-SHA1 -b 1024 foobar.org` export KSK2=`ldns-keygen -k -a RSASHA1-NSEC3-SHA1 -b 2048 foobar.org` rm $ZSK2.ds $KSK2.ds
ldns-signzone 命令用于对 DNS 区域进行签名。 该命令的 -s 选项采用 salt 值。 我们生成随机字符,计算 SHA1 哈希,并将这个值作为盐传递。
ldns-signzone -n -p -s $(head -n 1000 /dev/random | sha1sum | cut -b 1-16) example.com.zone $ZSK $KSK
创建一个名为 example.com.zone.signed 的新文件。
对 foobar.org 域执行 ldns-signzone 命令:
ldns-signzone -n -p -s $(head -n 1000 /dev/random | sha1sum | cut -b 1-16) foobar.org.zone $ZSK2 $KSK2
NSD 必须配置为使用 .signed 区域文件。 编辑配置文件:
nano /etc/nsd/nsd.conf
修改两个域的 zone: 部分下的 zonefile: 选项。
zone: name: example.com zonefile: example.com.zone.signed notify: 2.2.2.2 mykey provide-xfr: 2.2.2.2 mykey zone: name: foobar.org zonefile: foobar.org.zone.signed notify: 2.2.2.2 mykey provide-xfr: 2.2.2.2 mykey
要应用更改并重新加载区域文件,请执行以下命令:
nsd-control reconfig nsd-control reload example.com nsd-control reload foobar.org
通过执行 DNS 查询检查 DNSKEY 记录:
dig DNSKEY example.com. @localhost +multiline +norec
这应该打印 ZSK 和 KSK 的公钥,如下所示:
; <<>> DiG 9.9.5-3-Ubuntu <<>> DNSKEY example.com. @localhost +norec +multiline ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14231 ;; flags: qr aa; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;example.com. IN DNSKEY ;; ANSWER SECTION: example.com. 1800 IN DNSKEY 256 3 7 ( AwEAAbUfMzOJWWWniRSwDb2/2Q6bVpVoEPltPj0h5Qu6 hzBdYA4HJYlVXTJ6veNENI/5lV1y84Dhc47j4VAoA66F j7xuTTZjzcuu0KAkQg8Jr2uCmmOuI/rZR7sWZMooHFZ1 JPPJZak8HKSNGvHXlMJiz9JPOA3ebJ/liG6lCGJshPah ) ; ZSK; alg = NSEC3RSASHA1; key id = 2870 example.com. 1800 IN DNSKEY 257 3 7 ( AwEAAeMDpaVQJixHg1deUDBRRwVldJadgyRZPlieSoVf ps3tYPvTD0nVBOQxenf+m4N/ALpnC5TH4GpxZLYS9IFc rujudQrqA0UuTXBvIWP+XvuJ1yoyZCxO9PHV+GsefjI7 kvnmBD1V9UJlGVlHlB3YXHa3f/J5E0RujMnE4a19KG7b HkYebK/2zjzhqXan9442VAG6jhw0lUUJZrCpZjMDEi9n LhJOUSymxglQv1BftALmYnYcuHId9NCwZbvZMb7bS239 bm6ONjwqSHqW2slNhBnDVnng2tDfNwjR+eDz5oUbtw4b LMtVACx1WzJEKbIN4rHY7aRe7Ao+4jvSJ8ozVrM= ) ; KSK; alg = NSEC3RSASHA1; key id = 17385 ;; Query time: 5 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Sep 04 01:37:18 IST 2014 ;; MSG SIZE rcvd: 467
对第二个域重复 dig 命令并验证响应:
dig DNSKEY foobar.org. @localhost +multiline +norec
主服务器现在提供 签名 DNS 响应。
奴隶
这个区域现在必须转移到从服务器。 登录从服务器并强制传输两个区域。
nsd-control force_transfer example.com nsd-control force_transfer foobar.org
查询此服务器上的 DNSKEY 记录:
dig DNSKEY example.com. @localhost +multiline +norec
这应该返回我们在主服务器上看到的相同 DNSKEY。 两台 DNS 服务器均已配置为提供 签名的 DNS 回复 。
第三步——生成 DS 记录
在这一步中,我们将生成两条 DS 记录,在下一步中,您将在域注册商的控制面板中输入它们。 DS 记录将具有以下规范:
算法 | 摘要类型 | |
---|---|---|
DS 记录 1 | RSASHA1-NSEC3-SHA1 | SHA1 |
DS 记录 2 | RSASHA1-NSEC3-SHA1 | SHA256 |
以下命令将在主服务器上执行。
ldns-key2ds 命令从签名区域文件生成 DS 记录。 切换到区域文件目录并执行命令:
cd /etc/nsd/zones ldns-key2ds -n -1 example.com.zone.signed && ldns-key2ds -n -2 example.com.zone.signed
-1 选项使用 SHA1 作为哈希函数,而 -2 使用 SHA256 作为相同的哈希函数。 -n 选项将结果 DS 记录写入标准输出而不是文件。
这将返回两行输出:
example.com. 1800 IN DS 17385 7 1 c1b9f7f1425bc44976dc19165e48c60032e7820d example.com. 1800 IN DS 17385 7 2 98216f4d66d24dbb752c46523a747a97bbad49d5846bbaa6256b6950b4a40995
下表显示了这些 DS 记录的每个字段:
钥匙标签 | 算法 | 摘要类型 | 消化 | |
---|---|---|---|---|
DS 记录 #1 | 17385 | 7 | 1 | c1b9f7f1[…] |
DS 记录 #2 | 17385 | 7 | 2 | 98216f4d[…] |
为 foobar.org 生成 DS 记录:
cd /etc/nsd/zones ldns-key2ds -n -1 foobar.org.zone.signed && ldns-key2ds -n -2 foobar.org.zone.signed
记下所有四个 DS 记录的所有片段(每个域两个),如上表所示。 我们将在下一步中需要它们。
第四步 - 使用 Registrar 配置 DS 记录
在本节中,我们将在域注册商的控制面板中添加 DS 记录。 这会将 DS 记录发布到顶级域 (TLD) 的名称服务器。 此步骤将以 GoDaddy 的控制面板为例。
登录 GoDaddy 并选择您的域名。
仅限首次名称服务器设置:
Host Names 部分需要完成一次才能第一次设置名称服务器。 如果您的域名服务器域与 my-soa.com 等不同,您应该为域名服务器域 仅 执行此步骤。
单击主机名部分中的管理。
一些注册商可能将此称为“子域名服务器”。 点击 Add Hostname 并创建一个主机名 master.example.com 指向第一个 Droplet 的 IP。
单击添加。 再次重复此步骤并创建一个指向第二个 Droplet 的 IP 的主机名 slave.example.com。
所有域:
这两个主机名必须设置为此域的名称服务器。 单击 Nameservers 部分中的 Manage 并添加它们。
单击 DS 记录 部分中的 管理。
在适当的字段中填写详细信息。 如有必要,请参考上一步中的图表。
保存两条记录。
几分钟后,查询 DS 记录。
dig DS example.com. +trace +short | egrep '^DS'
输出应包含两条 DS 记录。
DS 17385 7 2 98216F4D66D24DBB752C46523A747A97BBAD49D5846BBAA6256B6950 B4A40995 from server 192.55.83.30 in 1 ms. DS 17385 7 1 C1B9F7F1425BC44976DC19165E48C60032E7820D from server 192.55.83.30 in 1 ms.
为第二个域执行这些步骤时,请确保将名称服务器设置为适当的名称服务器域。
不必为此域创建主机名。
第五步——验证 DNSSEC 操作
DNSSEC 可以在以下站点进行验证:
第一个网站的成功测试显示以下结果:
注意标记的线。 简而言之,他们读到:
- DS 记录 #2(摘要类型 SHA256)验证 KSK(密钥 ID 17385)
- KSK (key id 17385) 验证另一个 DNSKEY (ZSK)
- ZSK (key id 2870) 验证 A 记录的签名
主服务器和从服务器现在都提供 DNSSEC 响应。
您还应该能够在 Web 浏览器中查看这两个域。 它们应该指向我们在 3.3.3.3 上设置的测试 Web 服务器上的默认 Apache/Ubuntu 页面,或者您在域的 @ 条目中指定的任何 Web 主机。
修改区域记录
要修改区域记录,必须编辑未签名文件 (example.com.zone)。 修改后,SOA 序列号必须递增,并且必须再次对区域进行签名才能使更改生效。
SOA 序列号采用以下格式。
YYYYMMDDnn
更改区域文件时,请将其设置为当前日期。 因此,在 2014 年 9 月 22 日进行第一次更改时,该系列将是:
2014092201
在同一天进行后续更改时,前两位数应递增。 如果您忘记增加 SOA 序列号,对区域文件所做的更改将不会传输到从属服务器。
注意:直接修改.signed
文件会使签名失效,导致验证失败。
我们将创建一个 shell 脚本,而不是每次都输入长命令来签署区域。 在主 DNS 服务器 上创建文件 并编辑它。
nano /usr/local/bin/dnszonesigner
粘贴以下代码:
#!/bin/bash PDIR=`pwd` ZONEDIR="/etc/nsd/zones" #location of your zone files DOMAIN=$1 cd $ZONEDIR KSK=$(basename $(grep -r "`grep '(ksk)' $DOMAIN.zone.signed | cut -f3-10`" K$DOMAIN.*.key | cut -d':' -f1) .key) ZSK=$(basename $(grep -r "`grep '(zsk)' $DOMAIN.zone.signed | cut -f3-10`" K$DOMAIN.*.key | cut -d':' -f1) .key) /usr/bin/ldns-signzone -n -p -s $(head -n 1000 /dev/random | sha1sum | cut -b 1-16) -f $ZONEDIR/$DOMAIN.zone.signed $DOMAIN.zone $ZSK $KSK /usr/sbin/nsd-control reload $DOMAIN /usr/sbin/nsd-control notify $DOMAIN cd $PDIR
您应该认出本教程前面我们手动执行它们的大部分这些行。
使该文件可执行:
chmod +x /usr/local/bin/dnszonesigner
现在,在添加、删除或编辑 DNS 记录后,请确保 增加 SOA 序列 并执行此脚本。
dnszonesigner example.com
这个 shell 脚本可以在任何目录中运行,因为我们将它放置在 $PATH 变量中定义的目录中。
附加阅读
莎朗坎贝尔的附加副本