Ubuntu 22.04 安装 NSD 指南
Ubuntu 22.04 下 NSD 双方案安装实测指南:apt 安装仓库版 4.3.9 与源码编译上游最新 4.15.3(下载校验、configure/make/make install、控制证书初始化、systemd 托管、53 端口冲突与目录权限排障实录、最小 zone 配置与 dig 验证、卸载清理)。
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 |
| 服务器内网 IP | 192.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 自动解析同版本依赖):
| 软件包 | 实测版本 |
|---|---|
| gcc | 11.4.0(Ubuntu 11.4.0-1ubuntu1~22.04.3) |
| make | GNU Make 4.3 |
| libevent-dev | 2.1.12-stable-1ubuntu0.2 |
| libssl-dev | 3.0.2-0ubuntu1.29 |
| libsystemd-dev | 249.11-0ubuntu3.23 |
| pkg-config | 0.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-1 | apt 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.service | systemd 服务单元 |
| /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 kB | configure/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.zone | zone 主文件(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 本系列篇目
- 《NSD 4.15.3 介绍与选型指南》:定位、架构、版本节奏与同类量化对比。
- 《NSD 4.15.3 配置参数详解》:全量参数总览、逐项详解与生产配置模板。
- 《NSD 4.15.3 常用 CLI 命令详解》:五件套命令逐条实测与运维组合场景。