NSD教程已更新至2026年:新增区域转移功能! NSD教程已更新至2026年:新增区域转移功能!

NSD教程已更新至2026年:新增区域转移功能!

NSD教程早在 2020 年,我就写过一篇关于如何使用 NSD(名称服务器守护进程)创建权威 DNS 服务器的教程,你可以在自己的 VPS 上运行它。NSD 占用资源不多,而且相比 BIND 来说非常轻量级,因此非常适合业余爱好者。我还制作了一个视频教程,发布在 WebSiteTV 上。

我在 LEB 上做教程的时候,用 rsync 设置了区域传输,因为……说实话,我已经记不清当时为什么这么做了。正确的做法是让 NSD 来处理区域传输,这是 DNS 的核心功能之一。我在视频教程里已经改正了这一点。

现在我们将以文字形式再次讲解本教程,内容已更新至 2026 年。这次我们将配置一个具有正确传输规则的 DNS 区域。开始吧!

域名和虚拟专用服务器

我打算搭建两个域名服务器。我在 Vultr 上启动了几个虚拟机,都是 Debian 12 系统。这两个服务器将用于 lowend.vip 域名。

 ns1.lowend.vip 149.28.254.206
ns2.lowend.vip 144.202.76.207

我们先从Porkbun开始,也就是域名注册商。我们需要设置权威域名服务器和粘合记录。如果您使用不同的域名注册商,控制面板界面会有所不同,但每个域名注册商都会提供更改这些设置的界面。

权威域名服务器回答了“该域名的合法域名服务器(DNS 服务器)有哪些”这个问题。但是,当有人查询域名时,他们身在何处呢?这是一个先有鸡还是先有蛋的问题。当有人需要知道 DNS 服务器在哪里时,他们该如何查找 DNS 条目呢?粘合记录解决了这个问题。它们是通往 DNS 服务器本身的初始线索。

在 Porkbun 中,我进入我的域名列表,点击“详细信息”,然后选择“Glue 记录”。

Porkbun NSD Glue Records

然后我点击了“管理”,并输入了ns1和ns2的主机名和IP地址。

Porkbun NSD 权威域名服务器

接下来,我们将更新权威名称服务器。返回“详细信息”并单击“权威名称服务器”:

Porkbun NSD 权威名称服务器

它们默认设置为 Porkbun 的 DNS 服务器。我删除了这些设置,并添加了我自己的 DNS 服务器(在 glue 记录中定义):

Porkbun NSD Glue Records

注册处那边的工作就结束了。

设置 NSD

让我们在 VPS 上启动并运行 NSD。

首先,我们在每个节点上安装它:
 apt install nsd
NSD 配置的组织方式有很多种。你可以将部分配置放在 `/etc/nsd/nsd.conf.d` 目录下,但在这个简单的示例中,我们将所有配置都放在一个文件中。我将保存默认文件:
 cd /etc/nsd
mv nsd.conf nsd.conf.dist

以下是我的 ns1 服务器上的 nsd.conf 文件:

服务器:
  IP地址:149.28.254.206
  隐藏版本:是
  数据库:“/var/lib/nsd/nsd.db”
  服务器数量:1
  冗长程度:2

钥匙:
  名称:“我的秘密”
  算法:hmac-sha512
  秘密:abhnilvmqpVn9FODGFfCyj2gAhU21nQNLXWxLWOxVCw=

区:
  名称:lowend.vip
  区域文件:/etc/nsd/zones/lowend.vip
  通知:144.202.76.207 我的秘密
  provide-xfr: 144.202.76.207 我的秘密
我们来逐一分析这些选项。
在“服务器”这一节中:
  • ip地址:这是ns1.lowend.vip的IP地址
  • 隐藏版本:我们不会在任何问候语或协议响应中透露 NSD 的版本。万一将来出现 NSD 零日漏洞,至少我们不会暴露我们正在运行未打补丁的版本。
  • 数据库:存放二进制数据库的位置(而非人类可编辑的区域文件)
  • server-count:运行时要启动的 NSD 守护进程数量。如果区域繁忙,您可能需要启动更多守护进程。
  • 日志详细程度:日志中显示的详细程度。为了演示目的,我把它调得很高。

“secret”部分控制区域传输的身份验证。我们定义要使用的共享密钥。该密钥名为“my-secret”。我通过以下命令生成了该密钥:

 openssl rand -base64 32

当然,您也可以使用您喜欢的任何方法。

最后,我们定义区域。如果区域很多,可以考虑将每个区域放在一个单独的文件中,并使用 ` include:`指令。因为本教程只使用一个区域,所以我将其直接放在基础的 `nsd.conf` 文件中。

  • 名称:域名
  • 区域文件:用于保存可编辑文本的位置。在本例中,我将区域文件放在 /etc/nsd/zones 目录中。
  • 通知:当发生更改时要通知哪些 DNS 从服务器,以及我们使用什么密钥。
  • provide-xfr:允许哪些服务器进行区域传输,以及使用哪个密钥。
关于 DNS 的简要说明。如果你的域名服务器上有防火墙,你需要开放一些端口:
  • UDP 端口 53:应该向全世界开放,因为 DNS 记录就是通过这种方式提供的。
  • TCP 端口 53:此端口只需对您的其他 DNS 服务器开放。DNS 区域传输(仅由授权的名称服务器执行——在本例中为 ns2)通过 TCP 端口 53 进行。

服务器 2 的设置与此非常相似,只有几处关键变化(以红色标出):

服务器:
  IP地址: 144.202.76.207
  隐藏版本:是
  数据库:“/var/lib/nsd/nsd.db”
  服务器数量:1
  冗长程度:2

钥匙:
  名称:“我的秘密”
  算法:hmac-sha512
  秘密:abhnilvmqpVn9FODGFfCyj2gAhU21nQNLXWxLWOxVCw=

区:
  名称:lowend.vip
  区域文件:/etc/nsd/zones/lowend.vip
  允许通知:149.28.254.206 我的密钥
  request-xfr: AXFR 149.28.254.206@53 my-secret

服务器配置段中“ip-address”的更改只是将ns1的IP地址更改为ns2的IP地址。

在区域节中,我们更改最后两行:

  • allow-notify:这是一个允许通知我们服务器发生更改的服务器访问控制列表(此处为ns1)。
  • request-xfr:这也是一个服务器(这里又是 ns1)的访问控制列表,我们将联系这些服务器以获取区域传输,我们将使用端口 53。

现在让我们在 ns1 上为 lowend.vip 创建一个区域文件:

创建目录 /etc/nsd/zones

以下是我添加到 /etc/nsd./zones/lowend.vip 文件中的内容:

 $ORIGIN lowend.vip。
$TTL 3600

@ IN SOA ns1.lowend.vip admin.lowend.vip (
  202604011;序列号
  28800;刷新
  7200;重试
  864000;过期
  86400;最小 TTL
)

在 NS ns1.lowend.vip。
在 NS ns2.lowend.vip。

ns1 在 A 149.28.254.206
ns2 在 A 144.202.76.207
bigvps 在 1.23.45.100
www IN CNAME bigvps

我不会逐条分析DNS记录,但以下是一些关键点:

  • 我们已经为这两个域名服务器都配置了DNS记录。
  • 我们为“bigvps”虚构了一个IP地址。
  • 我们为“bigvps”创建了指向“www.lowend.vip”的 CNAME 记录。
  • 我们的序列号格式为 YYYYMMDD#

让我们启动nsd:

 systemctl enable nsd
systemctl restart nsd

以下是我们在 /var/log/syslog 中看到的内容:

 2026-03-18T13:34:13.735090-07:00 ns1 systemd[1]: 已停止 nsd.service - 名称服务器守护进程。
2026-03-18T13:34:13.741588-07:00 ns1 systemd[1]: 正在启动 nsd.service - 名称服务器守护进程...
2026-03-18T13:34:13.767625-07:00 ns1 nsd[16395]: nsd 启动 (NSD 4.6.1)
2026-03-18T13:34:13.767898-07:00 ns1 nsd[16395]: [2026-03-18 13:34:13.767] nsd[16395]: 注意: nsd 启动 (NSD 4.6.1)
2026-03-18T13:34:13.804355-07:00 ns1 nsd[16398]: 区域 lowend.vip 读取成功
2026-03-18T13:34:13.808870-07:00 ns1 nsd[16398]: [2026-03-18 13:34:13.808] nsd[16398]: 信息:区域 lowend.vip 读取成功
2026-03-18T13:34:13.809132-07:00 ns1 nsd[16398]: 区域 lowend.vip 已写入数据库
2026-03-18T13:34:13.809291-07:00 ns1 nsd[16398]: [2026-03-18 13:34:13.809] nsd[16398]: 信息:区域 lowend.vip 已写入数据库
2026-03-18T13:34:13.815895-07:00 ns1 nsd[16398]: nsd 已启动 (NSD 4.6.1),进程 ID 16395
2026-03-18T13:34:13.815934-07:00 ns1 nsd[16398]: [2026-03-18 13:34:13.815] nsd[16398]: 通知:nsd 已启动 (NSD 4.6.1),进程 ID 16395
2026-03-18T13:34:13.817896-07:00 ns1 systemd[1]: 已启动 nsd.service - 名称服务器守护程序。

让我们开始讲解ns2吧:

创建目录 /etc/nsd/zones
systemctl enable nsd
systemctl restart nsd

在 /var/log/syslog 文件中,我们看到:

 2026-03-18T13:47:47.869109-07:00 ns2 systemd[1]: 已启动 nsd.service - 名称服务器守护程序。
2026-03-18T13:47:47.870845-07:00 ns2 nsd[15824]: xfrd: 区域 lowend.vip 已提交“于 2026-03-18T13:47:47 从 149.28.254.206@53 收到对序列号 2026104011 的更新,TSIG 已使用密钥 my-secret 验证”
2026-03-18T13:47:47.871385-07:00 ns2 nsd[15824]: [2026-03-18 13:47:47.870] nsd[15824]: 信息: xfrd: 区域 lowend.vip 已提交“于 2026-03-18T13:47:47 从 149.28.254.206@53 收到对序列号 2026104011 的更新,TSIG 已使用密钥 my-secret 验证”
2026-03-18T13:47:47.872244-07:00 ns2 nsd[15825]: 区域 lowend.vip 于 2026-03-18T13:47:47 从 149.28.254.206@53 收到序列号 2026104011 的更新。TSIG 已使用密钥 my-secret(233 字节)验证,耗时 3.2e-05 秒。
2026-03-18T13:47:47.872287-07:00 ns2 nsd[15825]: [2026-03-18 13:47:47.872] nsd[15825]: 信息:区域 lowend.vip 于 2026-03-18T13:47:47 从 149.28.254.206@53 收到序列号 2026104011 的更新。TSIG 已使用密钥 my-secret(233 字节)验证,耗时 3.2e-05 秒。
2026-03-18T13:47:47.876295-07:00 ns2 nsd[15824]: 区域 lowend.vip 序列号 0 已更新为 2026104011
2026-03-18T13:47:47.876349-07:00 ns2 nsd[15824]: [2026-03-18 13:47:47.876] nsd[15824]: 信息:区域 lowend.vip 序列号 0 已更新为 2026104011

在 ns1 上,日志包含:

 2026-03-18T13:47:47.871552-07:00 ns1 nsd[16399]: 来自 144.202.76.207 的 lowend.vip 的 axfr
2026-03-18T13:47:47.872312-07:00 ns1 nsd[16399]: [2026-03-18 13:47:47.871] nsd[16399]: 信息:来自 144.202.76.207 的 lowend.vip 的 axfr

甜的!

在我的家用电脑上:

 $ nslookup www.lowend.vip
服务器:8.8.8.8
地址:8.8.8.8#53

非权威答案:
www.lowend.vip 规范名称 = bigvps.lowend.vip。
名称:bigvps.lowend.vip
地址:1.23.45.100

我们已经启动并开始运行了。

现在我们来添加一条记录。我们将按如下方式修改 /etc/nsd/zones/lowend.vip 文件:

 $ORIGIN lowend.vip。
$TTL 3600

@ IN SOA ns1.lowend.vip admin.lowend.vip (
202604012 ;序列号
  28800;刷新
  7200;重试
  864000;过期
  86400;最小 TTL
)

在 NS ns1.lowend.vip。
在 NS ns2.lowend.vip。

ns1 在 A 149.28.254.206
ns2 在 A 144.202.76.207
bigvps 在 1.23.45.100
www IN CNAME bigvps
server1 在 4.5.6.7 版本中

我为 server1.lowend.vip 添加了一条记录,然后更新了序列号。之后重新加载 nsd。这不会停止/启动 nsd,而是告诉 nsd 在重新加载配置的同时继续提供记录服务:

 nsd-control 重新加载

这也会将更改推送至 ns2。在 ns2 日志中我们可以看到:

 2026-03-18T13:53:48.758673-07:00 ns2 nsd[15824]: [2026-03-18 13:53:48.758] nsd[15824]: 信息:区域 lowend.vip 序列号 2026104011 已更新为 2026104012
在家的时候:

$ nslookup server1.lowend.vip
服务器:8.8.8.8
地址:8.8.8.8#53

非权威答案:
名称:server1.lowend.vip
地址:4.5.6.7

NSD 表示两个节点都已启动并正常工作,并且两个节点都已同步。