Ubuntu 22.04 安装 NSD 指南

Ubuntu 22.04 下 NSD 双方案安装实测指南:apt 安装仓库版 4.3.9 与源码编译上游最新 4.15.3(下载校验、configure/make/make install、控制证书初始化、systemd 托管、53 端口冲突与目录权限排障实录、最小 zone 配置与 dig 验证、卸载清理)。

NSDDNS 服务2026/10/20

Ubuntu 22.04 安装 NSD 指南

目标:在 Ubuntu 22.04 服务器上从零安装 NSD 权威 DNS 服务器并完成 systemd 托管与验证。方案 A 走 apt 安装发行版仓库版 4.3.9-1(jammy universe 源),方案 B 从官方源码编译安装上游最新 4.15.3;覆盖下载校验、编译安装、控制通道证书初始化、最小 zone 配置、53 端口冲突与数据目录权限两处排障实录、dig 查询验证与卸载清理。全文命令与回显均在 Ubuntu 22.04.4 LTS 实测采集。

一、环境信息

项目实测环境
操作系统Ubuntu 22.04.4 LTS(jammy),x86_64
主机名ops
服务器内网 IP192.168.146.128
实测时间2026-10-20(回显中的时间戳均为此日实测)
方案 A 版本nsd 4.3.9-1(jammy universe 源,2026-10-20 实查)
方案 B 版本NSD 4.15.3(上游最新稳定版,官网 Current version 实查)
预装 DNS 组件systemd-resolved(本机 127.0.0.53:53 stub 监听)

1.1 版本结论与查询方法

  • 上游最新稳定版为 4.15.3(2026-10-14 发布,安全版本),见官网 Download 页 Current version(https://nlnetlabs.nl/projects/nsd/download/,2026-10-20 查询);版本演进细节见 《NSD 4.15.3 介绍与选型指南》第七章。
  • Ubuntu 22.04 的 apt 通道为 universe 源,2026-10-20 实查候选版本为 4.3.9-1,与上游相差 12 个小版本(4.15.1 与 4.15.3 两个安全版本修复的 8 个 CVE 均不含在 4.3.9 内)。
  • NLnet Labs 官方包仓库 packages.nlnetlabs.nl 不收录 NSD(只收录 Krill、Routinator、RTRTR 等,2026-10-20 实查),因此 Ubuntu 上没有官方 apt 源,要装 4.15.3 只能源码编译。

⚠️ 注意:Ubuntu 22.04 默认由 systemd-resolved 在 127.0.0.53:53 监听本地存根,而 NSD 默认绑定 0.0.0.0:53(含本机回环地址段),首次启动大概率冲突。本文 4.4–4.5 节有完整排障实录,方案 B 的配置中已预先显式声明监听地址规避。

二、前置条件

本章交代两种方案分别需要满足的系统条件与软件依赖,安装前逐项确认,避免中途失败。

2.1 通用要求(两方案都需要)

  • root 权限(本文全部命令以 root 执行)。
  • 53/UDP 与 53/TCP 端口可用(或已知被占用、准备按 4.4 节排障)。
  • 能访问 Ubuntu 软件源(方案 A)或 nlnetlabs.nl 官网(方案 B)。

2.2 方案 A 前置

apt 安装无手工依赖,软件包自带全部运行时组件;仅要求软件源可达。

2.3 方案 B 前置(编译工具链与开发库)

NSD 4.15.3 编译需要 C 编译器、make、libevent(事件循环)、OpenSSL 开发库(TLS/DoT/控制通道)、libsystemd 开发库(--enable-systemd 的 sd_notify 通知)与 pkg-config。一次性安装:

apt install -y build-essential libevent-dev libssl-dev libsystemd-dev pkg-config

实测本机已就位的版本(dpkg -l 口径,安装时 apt 自动解析同版本依赖):

软件包实测版本
gcc11.4.0(Ubuntu 11.4.0-1ubuntu1~22.04.3)
makeGNU Make 4.3
libevent-dev2.1.12-stable-1ubuntu0.2
libssl-dev3.0.2-0ubuntu1.29
libsystemd-dev249.11-0ubuntu3.23
pkg-config0.29.2-1ubuntu3

💡 说明:libevent-dev 与 libssl-dev 是 NSD 运行的硬依赖(缺 configure 直接报错);libsystemd-dev 只在使用 --enable-systemd 编译选项时需要(systemd 通知服务状态);dnstap 抓包功能需要 protobuf-c 的 protoc 编译器,本文不启用该功能,见 5.4 节排障实录。

三、版本选型说明

安装前先明确「装哪个版本、从哪装」。NSD 在 Ubuntu 22.04 上只有两条现实通道,版本差距大,选型前先查清本机源里的候选版本。

3.1 查询本机 apt 候选版本

apt-cache policy nsd

实测回显(安装前):

nsd:
  已安装:(无)
  候选: 4.3.9-1

3.2 渠道与版本对照

渠道版本获取方式适用场景
Ubuntu jammy universe 源4.3.9-1apt install nsd快速验证、学习环境;由 Ubuntu 安全团队维护
官方源码编译4.15.3(2026-10-14)官网 tar 包 + make需要上游新特性与安全修复的生产权威
NLnet Labs 官方包仓库不提供 NSD—(2026-10-20 实查不含)不可用

关键差异解读:两通道版本差 12 个小版本,且 4.15.x 修复了 8 个 CVE(4.15.1 修复 ACL 绕过与 TCP/UDP 拒绝服务 4 项、4.15.3 修复 simdzone 解析器 4 项);生产环境对公网服务建议选源码编译追平上游,内网实验环境用 apt 版足够。

3.3 上游版本查询命令

# 方法一:浏览器/命令行访问官网 Download 页,读 "Current version" 字段
# 方法二:GitHub Releases 页看最新 REL 标签

本文撰写时(2026-10-20)实查结果:官网 Current version = 4.15.3;GitHub 最新标签 NSD_4_15_3_REL(2026-10-14),另有 NSD_4_15_4_RC1 预发布。

四、方案 A:apt 在线安装(仓库版 4.3.9)

本方案用发行版仓库直接安装,全程最短路径;代价是版本停留在 4.3.9。本章按「安装 → 包布局 → 首启排障 → 修复验证 → systemd 托管」推进,其中排障实录在 53 端口被占的机器上是必经步骤。

4.1 安装

apt install -y nsd

实测回显:

正在读取软件包列表...
正在分析软件包的依赖关系树...
正在读取状态信息...
下列【新】软件包将被安装:
  nsd
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 215 个软件包未被升级。
需要下载 450 kB 的归档。
解压缩后会消耗 1,342 kB 的额外空间。
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 nsd amd64 4.3.9-1 [450 kB]
已下载 450 kB,耗时 5秒 (94.4 kB/s)
正在选中未选择的软件包 nsd。
(正在读取数据库 ... 系统当前共安装有 226062 个文件和目录。)
准备解压 .../archives/nsd_4.3.9-1_amd64.deb  ...
正在解压 nsd (4.3.9-1) ...
正在设置 nsd (4.3.9-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nsd.service → /lib/systemd/system/nsd.service.
Could not execute systemctl:  at /usr/bin/deb-systemd-invoke line 142.
正在处理用于 man-db (2.10.2-1) 的触发器 ...

⚠️ 注意最后一行 Could not execute systemctl: at /usr/bin/deb-systemd-invoke line 142.——这是包管理器尝试启动 nsd 服务失败(本机 53 端口被占),不代表安装失败,软件本体已装好,下一节排障后即可正常启动。

4.2 包文件布局

了解包装到了哪,是后续改配置、卸载清理的基础。用 dpkg-deb 实查 deb 包内容(也可对已装包用 dpkg -L nsd):

apt-get download nsd
dpkg-deb -c nsd_4.3.9-1_amd64.deb

输出节选(实测,保留关键路径):

drwxr-xr-x root/root         0 2021-12-16 15:22 ./etc/nsd/
-rw-r--r-- root/root       369 2021-12-16 15:22 ./etc/nsd/nsd.conf
drwxr-xr-x root/root         0 2021-12-16 15:22 ./etc/nsd/nsd.conf.d/
-rw-r--r-- root/root       828 2021-12-16 15:22 ./lib/systemd/system/nsd.service
-rw-r--r-- root/root        83 2021-12-16 15:22 ./usr/lib/tmpfiles.d/nsd.conf
-rwxr-xr-x root/root    589776 2021-12-16 15:22 ./usr/sbin/nsd
-rwxr-xr-x root/root    104904 2021-12-16 15:22 ./usr/sbin/nsd-checkconf
-rwxr-xr-x root/root    208648 2021-12-16 15:22 ./usr/sbin/nsd-checkzone
-rwxr-xr-x root/root    100808 2021-12-16 15:22 ./usr/sbin/nsd-control
-rwxr-xr-x root/root      5561 2021-12-16 15:22 ./usr/sbin/nsd-control-setup
-rw-r--r-- root/root     15636 2021-12-16 15:22 ./usr/share/doc/nsd/examples/nsd.conf.sample
-rw-r--r-- root/root     13653 2021-12-16 15:22 ./usr/share/man/man5/nsd.conf.5.gz
drwxr-xr-x root/root         0 2021-12-16 15:22 ./var/lib/nsd/
路径用途
/usr/sbin/nsd 及 4 个 nsd-* 工具守护进程与校验/控制工具
/etc/nsd/nsd.conf主配置(369 字节最小默认配置)
/etc/nsd/nsd.conf.d/*.conf默认配置 include 的扩展目录
/lib/systemd/system/nsd.servicesystemd 服务单元
/usr/lib/tmpfiles.d/nsd.conf开机创建 /run/nsd 运行目录(属主 nsd:nsd)
/var/lib/nsd/数据目录(nsd.db、zone.list、xfrd.state)
/usr/share/doc/nsd/examples/nsd.conf.sample全量注释参考配置

默认主配置内容(实测备份原文):

# NSD configuration file for Debian.
#
# See the nsd.conf(5) man page.
#
# See /usr/share/doc/nsd/examples/nsd.conf for a commented
# reference config file.

server:
        # log only to syslog.
        log-only-syslog: yes


# The following line includes additional configuration files from the
# /etc/nsd/nsd.conf.d directory.

include: "/etc/nsd/nsd.conf.d/*.conf"

逐项说明:log-only-syslog: yes 让日志走 syslog 而不写独立文件(journalctl 查看);include 把 nsd.conf.d 下的片段并入主配置(适合分包管理 zone)。默认配置没有 ip-address 行,NSD 将绑定 0.0.0.0:53 与 [::]:53——这正是下一节冲突的根源。

4.3 首次启动排障:53 端口被占用

安装时服务没能启动,先看服务状态与日志定位原因。查服务:

systemctl status nsd --no-pager

实测服务处于 failed(重启节流后放弃),journal 中的核心报错:

journalctl -u nsd --no-pager | tail -20

输出节选(实测):

10月 20 16:40:11 ops nsd[1397531]: can't bind udp socket 0.0.0.0@53: Address already in use
10月 20 16:40:11 ops nsd[1397531]: server initialization failed, nsd could not be started
10月 20 16:40:11 ops systemd[1]: nsd.service: Failed with result 'exit-code'.
10月 20 16:40:11 ops systemd[1]: Failed to start Name Server Daemon.

systemd 因连续失败进入重启节流(同日志可见):

Oct 20 16:40:12 ops systemd[1]: nsd.service: Scheduled restart job, restart counter is at 5.
Oct 20 16:40:12 ops systemd[1]: nsd.service: Start request repeated too quickly.
Oct 20 16:40:12 ops systemd[1]: nsd.service: Failed with result 'exit-code'.

定位占用者:

ss -ltnp | grep ':53 '

实测回显(本机为多 DNS 服务共存环境,53 端口占用情况一目了然):

LISTEN 0      10      127.0.0.9:53       0.0.0.0:*  users:(("knotd",pid=1415613,fd=18))
LISTEN 0      4096    127.0.0.53%lo:53   0.0.0.0:*  users:(("systemd-resolve",pid=1399382,fd=14))

结论:本机 53 端口被 systemd-resolved 的 127.0.0.53 stub 与同机其他 DNS 服务(knotd)占用;NSD 默认绑 0.0.0.0@53 的通配地址与任一回环占用都冲突,因此绑定失败。

4.4 修复:显式声明监听地址

让 NSD 只绑定指定地址,绕开被占的回环段。编辑 /etc/nsd/nsd.conf 的 server 段,加入两行 ip-address(127.0.0.1 供本机查询,192.168.146.128 为本服务器内网 IP 供网络查询):

server:
        # log only to syslog.
        log-only-syslog: yes
        ip-address: 127.0.0.1
        ip-address: 192.168.146.128

配置说明:每行 ip-address 声明一个监听地址;不写则绑定 0.0.0.0/[::] 全部接口。Ubuntu 标准做法还有关闭 resolved 的 stub 监听(/etc/systemd/resolved.conf 设 DNSStubListener=no 后 systemctl restart systemd-resolved),可让 NSD 顺利绑定 0.0.0.0;本文实验采用显式 ip-address 方案(未改动 resolved),两种方案二选一即可。

改完重启服务:

systemctl restart nsd

成功后 syslog(实测):

Oct 20 16:42:03 ops nsd[1398142]: nsd starting (NSD 4.3.9)
Oct 20 16:42:03 ops nsd[1398144]: nsd started (NSD 4.3.9), pid 1398142

4.5 初始化控制证书并验证

nsd-control 控制通道走 TLS 双向证书认证,首次使用前初始化证书(幂等命令,重复执行会重建):

nsd-control-setup

实测回显:

setup in directory /etc/nsd
removing artifacts
Setup success. Certificates created. Enable in nsd.conf file to use

生成的 4 个文件(实测清单):

/etc/nsd/nsd_server.key    服务端私钥
/etc/nsd/nsd_server.pem    服务端证书
/etc/nsd/nsd_control.key   客户端私钥
/etc/nsd/nsd_control.pem   客户端证书

验证服务与版本:

systemctl is-active nsd
nsd-control status

实测回显:

active
version: 4.3.9
verbosity: 0
ratelimit: 200

方案 A 到此安装完成。zone 区数据配置为两方案通用步骤,统一见第七章。

4.6 systemd 托管说明

apt 安装自动完成 enable(安装日志中的 Created symlink 即启用开机自启),服务单元内容实查如下(/lib/systemd/system/nsd.service):

[Unit]
Description=Name Server Daemon
Documentation=man:nsd(8)
After=network.target

[Service]
Type=notify
Restart=always
ExecStart=/usr/sbin/nsd -d -P ""
ExecReload=+/bin/kill -HUP $MAINPID
# CAP_NET_ADMIN and CAP_NET_RAW required for IP_TRANSPARENT
CapabilityBoundingSet=CAP_CHOWN CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT
MemoryDenyWriteExecute=true
NoNewPrivileges=true
PrivateDevices=true
PrivateTmp=true
ProtectHome=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=strict
ReadWritePaths=/var/lib/nsd /etc/nsd /run
RuntimeDirectory=nsd
RestrictRealtime=true
SystemCallArchitectures=native
SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @resources

[Install]
WantedBy=multi-user.target

关键项解读:Type=notify 依赖 NSD 编译时的 systemd 通知能力(--enable-systemd,Debian 包已启用);ExecStart 以 -d 前台模式运行、-P "" 禁用自有 pidfile(交给 systemd);一大段 sandbox 指令(ProtectSystem=strict、ReadWritePaths 白名单等)是 Debian 的安全加固,正常运维无需改动;日常管理用 systemctl start/stop/restart nsd 与 nsd-control(运行时配置重载走 nsd-control reconfig,不重启进程)。

五、方案 B:源码编译安装(上游最新 4.15.3)

本方案从官方源码编译安装上游最新稳定版 4.15.3,追平安全修复与新特性;NSD 的源码构建对依赖要求低,全流程约 3–5 分钟。源码包无 systemd 单元,需要自建(5.8 节)。

5.1 下载与校验

wget -O nsd-4.15.3.tar.gz https://nlnetlabs.nl/downloads/nsd/nsd-4.15.3.tar.gz

输出节选(实测尾部):

  1550K .......... .......... .......... ..                   100%  145M=1.0s

2026-10-20 17:13:49 (1.55 MB/s) - ‘nsd-4.15.3.tar.gz’ saved [1620092/1620092]

与官方发布信核对 sha256(发布信原文给出 6cd32335…530c):

sha256sum nsd-4.15.3.tar.gz

实测回显:

6cd323354ebdf8c6a1eb5a14ecce25c69534013b70e7b0197d915cd581ab530c  nsd-4.15.3.tar.gz

与官方一致,校验通过。解压:

tar -xzf nsd-4.15.3.tar.gz
cd nsd-4.15.3

解压得到约 200 个条目的源码目录(含 simdzone 子目录与全部 .c/.h 源文件)。

5.2 configure(含排障实录)

进入源码目录配置编译参数。首次执行若不加 --disable-dnstap 会报错,实测报错原文:

checking for protoc... no
checking for protoc-c... no
configure: error: The protoc or protoc-c program was not found. It is needed for dnstap, use --disable-dnstap, or install protobuf-c to provide protoc or protoc-c

原因:dnstap 抓包功能需要 protobuf-c 的 protoc 编译器,系统没有。两种解决:安装 protobuf-c-compiler,或按报错提示加 --disable-dnstap 放弃该功能(本文采用后者,dnstap 属可选可观测组件,不影响 DNS 服务本体)。

完整配置命令(路径布局与方案 A 的 Debian 约定保持一致,便于两方案迁移):

./configure --prefix=/usr/local --sysconfdir=/etc --with-configdir=/etc/nsd \
  --with-nsd_conf_file=/etc/nsd/nsd.conf --localstatedir=/var --runstatedir=/run \
  --with-pidfile=/run/nsd/nsd.pid --with-dbfile=/var/lib/nsd/nsd.db \
  --with-zonesdir=/etc/nsd --with-zonelistfile=/var/lib/nsd/zone.list \
  --with-xfrdfile=/var/lib/nsd/xfrd.state --with-user=nsd \
  --enable-systemd --disable-dnstap

成功标志(输出节选,实测):

checking for libevent... found in /usr
checking for SSL... found in /usr
checking for libsystemd... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h

关键路径含义:二进制装 /usr/local/sbin、配置 /etc/nsd/nsd.conf、zone 文件目录 /etc/nsd、运行数据 /var/lib/nsd、pid 文件 /run/nsd/nsd.pid、运行用户 nsd。

5.3 编译与安装

make -j$(nproc)

输出节选(实测,最后链接四个可执行文件并带 LTO 优化):

gcc -g -O2 -flto  -o nsd-checkconf answer.o ... simdzone/libzone.a -lssl -lcrypto -levent -lsystemd
gcc -g -O2 -flto  -o nsd-control answer.o ... simdzone/libzone.a -lssl -lcrypto -levent -lsystemd
gcc -g -O2 -flto  -o nsd answer.o ... simdzone/libzone.a -lssl -lcrypto -levent -lsystemd
gcc -g -O2 -flto  -o nsd-checkzone answer.o ... simdzone/libzone.a -lssl -lcrypto -levent -lsystemd
lto-wrapper: warning: using serial compilation of 2 LTRANS jobs
lto-wrapper: warning: using serial compilation of 10 LTRANS jobs
make install

实测完整回显:

./install-sh -c -d /usr/local/sbin
./install-sh -c -d /etc/nsd/nsd
if test -n "/run/nsd"; then ./install-sh -c -d /run/nsd; fi
./install-sh -c -d /tmp
./install-sh -c -d `dirname /var/lib/nsd/xfrd.state`
./install-sh -c -d `dirname /var/db/nsd/zone.list`
./install-sh -c -d `dirname /var/db/nsd/cookiesecrets.txt`
./install-sh -c -d /usr/local/share/man
./install-sh -c -d /usr/local/share/man/man8
./install-sh -c -d /usr/local/share/man/man5
./install-sh -c nsd /usr/local/sbin/nsd
./install-sh -c nsd-control-setup.sh /usr/local/sbin/nsd-control-setup
./install-sh -c nsd-checkconf /usr/local/sbin/nsd-checkconf
./install-sh -c nsd-checkzone /usr/local/sbin/nsd-checkzone
./install-sh -c nsd-control /usr/local/sbin/nsd-control
./install-sh -c -m 644 nsd.8 /usr/local/share/man/man8
./install-sh -c -m 644 nsd-checkconf.8 /usr/local/share/man/man8/nsd-checkconf.8
./install-sh -c -m 644 nsd-checkzone.8 /usr/local/share/man/man8/nsd-checkzone.8
./install-sh -c -m 644 nsd-control.8 /usr/local/share/man/man8/nsd-control.8
./install-sh -c -m 644 nsd.conf.5 /usr/local/share/man/man5/nsd.conf.5
./install-sh -c -m 644 nsd.conf.sample /etc/nsd/nsd/nsd.conf.sample
if test -n ""; then ./install-sh -c -m 644 xdp-dns-redirect_kern.o /usr/local/share/nsd/xdp-dns-redirect_kern.o; fi
if test -n ""; then ./install-sh -c -m 644 xdp-dns-redirect_kern_pinned.o /usr/local/share/nsd/xdp-dns-redirect_kern_pinned.o; fi

安装产物:5 个可执行文件在 /usr/local/sbin/(nsd、nsd-checkconf、nsd-checkzone、nsd-control、nsd-control-setup),man 手册在 /usr/local/share/man/,全量注释参考配置 nsd.conf.sample 在 /etc/nsd/nsd/ 下(613 行)。注意 make install 不会创建 systemd 单元,也不会创建运行用户——接下来两步补齐。

5.4 创建运行用户并授权数据目录

NSD 以非特权用户 nsd 运行(配置 username: nsd),源码安装不自动创建,手工创建系统用户:

useradd --system --home-dir /var/lib/nsd --shell /usr/sbin/nologin nsd

成功无输出。核对:

getent passwd nsd

实测回显:

nsd:x:999:998::/var/lib/nsd:/usr/sbin/nologin

再授权数据目录(make install 以 root 创建了 /var/lib/nsd,不改属主服务进程无法写入):

chown -R nsd:nsd /var/lib/nsd

⚠️ 排障实录:若跳过此步 chown,服务能启动,但通过 nsd-control addzone 动态加区时会失败。实测报错(journal 原文):

10月 20 16:50:33 ops nsd[1412633]: could not create zone list /var/lib/nsd/zone.list: Permission denied

控制端表现为:

error could not add zonelist entry
error zone test2.com not configured
warning zone test2.com not present

执行 chown -R nsd:nsd /var/lib/nsd 后 addzone 立即恢复正常(返回 ok)。同理,/run/nsd(pid 文件目录)由 systemd 单元的 RuntimeDirectory=nsd 自动创建,无需手工处理。

5.5 编写最小配置并初始化控制证书

创建 /etc/nsd/nsd.conf(zone 文件放同目录,zonesdir 即 /etc/nsd):

server:
        username: nsd
        log-only-syslog: yes
        ip-address: 127.0.0.1
        ip-address: 192.168.146.128
        hide-version: yes
        identity: "ops-authoritative-dns"
        verbosity: 1

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"

zone:
        name: "example.com"
        zonefile: "example.com.zone"

逐项说明:username: nsd 服务进程降权到 nsd 用户;ip-address 显式声明两个监听地址(同 4.4 节,规避端口冲突);hide-version: yes + identity 对外隐藏版本号并自定义 identity 字符串(减小指纹面);verbosity: 1 常规日志级别;remote-control 段开启 127.0.0.1:8952 控制通道并指定 4 个证书路径;zone 段声明主区 example.com,zonefile 相对 zonesdir(/etc/nsd)。

初始化控制证书:

nsd-control-setup

实测回显:

setup in directory /etc/nsd
removing artifacts
Setup success. Certificates created. Enable in nsd.conf file to use

配置静态校验(通过时无输出):

nsd-checkconf /etc/nsd/nsd.conf
echo $?

实测回显:

0

5.6 创建 systemd 服务单元

源码安装不带单元文件,自建 /etc/systemd/system/nsd.service:

[Unit]
Description=Name Server Daemon
Documentation=man:nsd(8)
After=network.target

[Service]
Type=notify
Restart=always
ExecStart=/usr/local/sbin/nsd -d -P ""
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

说明:Type=notify 生效的前提是 configure 带了 --enable-systemd(本文已带);-d 前台运行 + -P "" 禁用自有 pidfile,让 systemd 直接托管主进程;Restart=always 保证异常退出自动拉起。加载并启用(每条命令针对一个单元):

systemctl daemon-reload
systemctl enable nsd
systemctl start nsd

5.7 安装验证

验证版本与编译参数(nsd -v 会打印完整 configure line):

nsd -v

实测回显:

NSD version 4.15.3
Written by NLnet Labs.

Configure line: --prefix=/usr/local --sysconfdir=/etc --with-configdir=/etc/nsd --with-nsd_conf_file=/etc/nsd/nsd.conf --localstatedir=/var --runstatedir=/run --with-pidfile=/run/nsd/nsd.pid --with-dbfile=/var/lib/nsd/nsd.db --with-zonesdir=/etc/nsd --with-zonelistfile=/var/lib/nsd/zone.list --with-xfrdfile=/var/lib/nsd/xfrd.state --with-user=nsd --enable-systemd --disable-dnstap
Event loop: libevent 2.1.12-stable (uses epoll)
Linked with OpenSSL 3.0.2 15 Mar 2022

Copyright (C) 2001-2024 NLnet Labs.  This is free software.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

验证服务状态:

systemctl is-active nsd
systemctl is-enabled nsd
systemctl status nsd --no-pager

实测回显:

active
enabled
● nsd.service - Name Server Daemon
     Loaded: loaded (/etc/systemd/system/nsd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2026-10-20 16:48:32 CST; 6min ago
       Docs: man:nsd(8)
   Main PID: 1412633 (nsd: xfrd)
      Tasks: 3 (limit: 38359)
     Memory: 37.8M
        CPU: 119ms
     CGroup: /system.slice/nsd.service
             ├─1412633 /usr/local/sbin/nsd -d -P ""

验证控制通道与进程号:

nsd-control status
nsd-control serverpid

实测回显:

version: 4.15.3
verbosity: 1
ratelimit: 0
1412634

启动日志(syslog 实测):

Oct 20 16:48:32 ops nsd[1412633]: nsd starting (NSD 4.15.3)
Oct 20 16:48:32 ops nsd[1412634]: nsd started (NSD 4.15.3), pid 1412633

内存常驻约 38M,进程模型为一个 xfrd 主控(1412633)+ 一个 server 子进程(1414119,serverpid 显示其 pid),方案 B 到此安装完成。

六、方案对比与选择建议

两种方案都能得到可用的 NSD 服务,差异集中在版本、路径与维护方式上。

维度方案 A:apt方案 B:源码编译
版本4.3.9-1(jammy universe,2021 年代基线)4.15.3(上游最新稳定版,2026-10-14)
安全修复依赖 Ubuntu 安全团队回补4.15.1/4.15.3 共 8 个 CVE 修复全包含
联网要求软件源可达官网下载 tar 包 + 编译工具链
安装方式apt 一条命令,约 450 kBconfigure/make/make install,约 3–5 分钟
二进制路径/usr/sbin/nsd/usr/local/sbin/nsd
systemd 单元包自带(含完整 sandbox 加固)自建单元(本文给出可用模板)
配置文件/etc/nsd/nsd.conf(相同)/etc/nsd/nsd.conf(相同)
数据目录/var/lib/nsd(相同)/var/lib/nsd(相同)
升级方式apt 升级跟随发行版下载新版重编译 make install 后重启
卸载方式apt purge 一条命令按清单手工删除(见 9.2 节)
优点快、可自动升级、单元加固完善版本新、可控编译特性(如 --disable-dnstap)
缺点版本滞后 12 个小版本、8 个 CVE 未修需自管单元与升级、依赖自处理

选择建议:生产环境对外提供权威服务,选方案 B追平上游安全修复;内网学习/快速验证选方案 A。已在用方案 A 又需要新版本时,按第九章先卸载 apt 版再走方案 B(两方案配置与数据目录完全同构,/etc/nsd 下的配置与 zone 文件可直接沿用)。

七、配置说明(两方案通用)

本章完成最小可用的主区配置并验证,两方案步骤完全一致(配置与数据目录同构)。前置:服务已按方案 A 或 B 安装并运行。

7.1 配置与数据文件布局

文件/目录用途
/etc/nsd/nsd.conf主配置(server/remote-control/key/pattern/zone 段)
/etc/nsd/example.com.zonezone 主文件(zonesdir=/etc/nsd 下相对引用)
/var/lib/nsd/nsd.db编译后的区数据库(reload 时重建)
/var/lib/nsd/zone.list动态区清单(addzone/delzone 维护)
/var/lib/nsd/xfrd.state从区传送状态
/etc/nsd/nsd_server.key 等 4 个控制通道证书密钥

7.2 创建测试区文件

创建 /etc/nsd/example.com.zone(RFC 1035 主文件格式):

$ORIGIN example.com.
$TTL 3600
@       IN      SOA     ns1.example.com. admin.example.com. (
                        2026102001 ; serial
                        7200       ; refresh
                        3600       ; retry
                        1209600    ; expire
                        3600 )     ; negative cache TTL
@       IN      NS      ns1
@       IN      NS      ns2
ns1     IN      A       192.168.146.128
ns2     IN      A       192.168.146.129
@       IN      A       192.168.146.10
www     IN      A       192.168.146.11
mail    IN      A       192.168.146.12
@       IN      MX      10 mail
@       IN      TXT     "v=spf1 a mx ~all"
api     IN      CNAME   www

逐项说明:$ORIGIN 声明区名,$TTL 3600 为默认缓存时长;SOA 行含主 DNS(ns1)、管理员邮箱(admin.example.com.)、序列号 2026102001(格式 YYYYMMDDnn,每次改动必须递增)与四个定时器;NS/A/MX/TXT/CNAME 为常规记录。

校验 zone 文件:

nsd-checkzone example.com /etc/nsd/example.com.zone

实测回显:

zone example.com is ok

7.3 加载与重载

zone 段已在第五章 5.5 节的 nsd.conf 中声明(方案 A 用户按同一格式在 /etc/nsd/nsd.conf 补 zone 段)。配置或 zone 文件变更后的生效方式:

nsd-checkconf /etc/nsd/nsd.conf
nsd-control reload

实测回显:

ok

nsd-control reload 重建 nsd.db 并装载新区数据,进程不重启;改 nsd.conf 本体(如加 zone 段)用 nsd-control reconfig。

7.4 查询验证

dig @127.0.0.1 example.com SOA +noall +answer
dig @127.0.0.1 www.example.com A +noall +answer

实测回显:

example.com.            3600    IN      SOA     ns1.example.com. admin.example.com. 2026102001 7200 3600 1209600 3600
www.example.com.        3600    IN      A       192.168.146.11

两条查询都得到权威应答,服务功能完整。

7.5 区状态查看(版本术语差异)

nsd-control zonestatus example.com

4.15.3 实测回显:

zone:	example.com
	state: primary

4.3.9 实测回显(同一命令):

zone:	example.com
	state: master

💡 说明:4.15 起官方术语从 master/slave 改为 primary/secondary(与 RFC 9432 术语一致),功能等价。阅读旧资料时把 master 等同 primary 即可。

八、常见问题(FAQ)

Q1:启动报 can't bind udp socket 0.0.0.0@53: Address already in use 怎么办?

按 4.3–4.4 节排障:ss -ltnp | grep ':53 ' 找占用者;要么在 nsd.conf 显式声明 ip-address 只绑空闲地址,要么关闭 systemd-resolved 的本地 stub(/etc/systemd/resolved.conf 中设 DNSStubListener=no,再 systemctl restart systemd-resolved)。后者可让 NSD 绑定 0.0.0.0 全接口;本文实验采用前者(未改动 resolved),两条路线均给出完整步骤,任选其一。

Q2:源码安装后 nsd-control addzone 报 could not create zone list … Permission denied?

数据目录属主问题,见 5.4 节排障实录:chown -R nsd:nsd /var/lib/nsd 后立即恢复。根因是 make install 以 root 创建 /var/lib/nsd,而服务进程以 nsd 用户运行。

Q3:configure 报 The protoc or protoc-c program was not found?

dnstap 功能缺 protobuf-c 编译器。不需要 dnstap 就加 --disable-dnstap(本文做法);需要则 apt install protobuf-c-compiler 后重新 configure。

Q4:如何升级版本?

  • apt 方案:apt update && apt upgrade nsd,跟随 Ubuntu 安全更新(4.3.9 之后是否有更新以 apt-cache policy 实查为准)。
  • 源码方案:下载新版 tar 包(核对 sha256)→ 解压 → 同参数 configure → make → make install → systemctl restart nsd,用 nsd -v 核对版本。配置与数据目录不动,升级平滑。

Q5:apt 版与源码版能共存吗?

路径不同(/usr/sbin vs /usr/local/sbin),文件层面可共存;但 53 端口同一时刻只能被一套服务绑定,实际只运行一套。命令行输入 nsd 默认命中哪个取决于 PATH 顺序(root 的 PATH 中 /usr/local/sbin 通常在前),运维时建议用绝对路径消除歧义。切换方案时按第九章先完整卸载旧方案。

Q6:卸载后 /etc/nsd 目录还在?

apt purge 只删包自属文件,目录非空时保留(9.1 节实测有 dpkg 警告);确认无需要保留的配置后 rm -rf /etc/nsd 手工清掉即可。

九、卸载与清理

卸载前确认不再需要配置与区数据(/etc/nsd 下的 nsd.conf、zone 文件、证书如需迁移请先备份)。

9.1 卸载方案 A(apt)

apt purge -y nsd

实测回显:

正在读取软件包列表...
正在分析软件包的依赖关系树...
正在读取状态信息...
下列软件包将被【卸载】:
  nsd*
升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 215 个软件包未被升级。
解压缩后将会空出 1,342 kB 的空间。
(正在读取数据库 ... 系统当前共安装有 226131 个文件和目录。)
正在卸载 nsd (4.3.9-1) ...
正在处理用于 man-db (2.10.2-1) 的触发器 ...
(正在读取数据库 ... 系统当前共安装有 226066 个文件和目录。)
正在清除 nsd (4.3.9-1) 的配置文件 ...
dpkg: 警告: 卸载 nsd 时,目录 /etc/nsd 非空,因而不会删除该目录

按提示手工清理残留目录(含手工放入的 zone 文件与证书):

rm -rf /etc/nsd /var/lib/nsd

9.2 卸载方案 B(源码)

按安装清单逆序删除,服务先停(每条命令针对一个单元):

systemctl stop nsd
systemctl disable nsd
rm /etc/systemd/system/nsd.service
systemctl daemon-reload

删除二进制、手册与数据(5 个可执行文件前缀均为 nsd):

rm /usr/local/sbin/nsd /usr/local/sbin/nsd-checkconf /usr/local/sbin/nsd-checkzone /usr/local/sbin/nsd-control /usr/local/sbin/nsd-control-setup
rm /usr/local/share/man/man8/nsd.8 /usr/local/share/man/man8/nsd-checkconf.8 /usr/local/share/man/man8/nsd-checkzone.8 /usr/local/share/man/man8/nsd-control.8 /usr/local/share/man/man5/nsd.conf.5
rm -rf /etc/nsd /var/lib/nsd /var/db/nsd /usr/local/share/nsd
userdel nsd

💡 说明:/var/db/nsd 为 cookie secrets 默认目录(make install 创建);--enable-multiple-catalog-zones 等编译特性不影响以上清单。删除后用 ss -ltnp | grep ':53 ' 确认 53 端口监听已消失,仅剩系统原有监听(如 systemd-resolved 的 127.0.0.53)。

十、参考链接

10.1 官方链接

资源地址
NSD 产品页https://nlnetlabs.nl/projects/nsd/about/
NSD Download 页(版本与哈希)https://nlnetlabs.nl/projects/nsd/download/
4.15.3 源码包https://nlnetlabs.nl/downloads/nsd/nsd-4.15.3.tar.gz
GitHub 仓库https://github.com/NLnetLabs/nsd
Ubuntu packages 索引(nsd)https://packages.ubuntu.com/jammy/nsd

10.2 本系列篇目