NSD 权威 DNS 服务器:自建安装与区文件管理

当你的业务域名越来越多、第三方解析服务开始限速收费,或者你需要为内网系统提供独立解析时,自建权威 DNS(Domain Name System,域名解析系统)服务器就成了一个值得认真考虑的方案。这篇指南会带你从零安装 NSD 这款轻量级权威 DNS 服务器,完成区文件编写、主从同步和解析验证,帮助你把域名解析的控制权真正掌握在自己手里。

自建 NSD 权威 DNS 服务器解析架构封面图

NSD(Name Server Daemon)是 NLnet Labs 维护的纯权威 DNS 服务器软件,与 BIND 不同,它不提供递归解析功能,只负责回答”我这个区域里有什么记录”这一问题。正因为功能单一,它的内存占用低、攻击面小、配置直观,非常适合放在公网上对外提供权威解析服务。很多中小团队用它替代臃肿的全功能 DNS 套件,把递归解析交给内网的另一台服务,各司其职。

在动手之前,先明确这篇文章的适用边界:它解决的是”如何在一台 Linux 服务器上从安装、配置到验证跑通 NSD 权威解析”的问题。如果你还没有准备服务器,一台配置不低的 VPS(Virtual Private Server,虚拟专用服务器)就足够运行 NSD 了,解析查询本身非常轻量。

安装 NSD 并理解默认配置

主流发行版的软件源里都直接收录了 NSD,安装只需要一条命令。以 Debian/Ubuntu 为例:

sudo apt update && sudo apt install nsd -y

CentOS/Rocky Linux 用户使用 sudo dnf install nsd -y 即可。安装完成后,先不要急着改配置,花两分钟看一下默认文件的位置,后面排查问题时会频繁用到这几个路径:

  • /etc/nsd/nsd.conf:主配置文件,服务器监听地址、区声明都写在这里
  • /etc/nsd/zones/:区文件的默认存放目录(部分发行版为 /var/lib/nsd/)
  • /etc/nsd/nsd.conf.d/:片段配置目录,适合主从分离管理

启动服务并设置开机自启:

sudo systemctl enable --now nsd
sudo systemctl status nsd --no-pager

如果 status 显示 active (running),说明服务本身已经起来了。此时它还没有任何区域数据,回答任何查询都是 REFUSED,这是正常现象,接下来就要靠区文件给它”喂”数据。NSD 对系统资源的占用非常克制,512MB 内存的机器也能稳定跑,更多服务器配置相关的经验可以参考服务器分类下的其他文章。

编写第一个区文件

区文件(zone file)是权威 DNS 的核心数据,一条记录对应一行。我们在 /etc/nsd/zones/ 下新建 example.zone,写一个最小可用的区域:

$ORIGIN example.com.
$TTL 3600
@   IN  SOA ns1.example.com. admin.example.com. (
        2026092401 ; serial
        7200       ; refresh
        3600       ; retry
        1209600    ; expire
        3600 )     ; negative TTL

@       IN  NS    ns1.example.com.
@       IN  NS    ns2.example.com.
ns1     IN  A     203.0.113.10
ns2     IN  A     203.0.113.11

@       IN  A     203.0.113.20
www     IN  A     203.0.113.20
mail    IN  A     203.0.113.30
@       IN  MX 10 mail.example.com.

这里有两个新手最容易踩的坑。第一,serial(序列号)必须只在修改时递增,从服务器靠比较这个数字判断要不要同步,格式惯例是”日期+当日序号”;第二,所有不以点结尾的主机名都会自动补上 $ORIGIN 后缀,写 ns1.example.com(少了末尾的点)实际会变成 ns1.example.com.example.com.,这是区文件错误里出现频率最高的一类。

写完先用 NSD 自带的语法检查工具验证一遍,再让它重新加载:

nsd-checkzone example.com /etc/nsd/zones/example.zone
sudo nsd-control reconfig

nsd-checkzone 输出 zone example.com is ok 才说明区文件没有语法问题。养成了”先 check 再 reload”的习惯,可以避免绝大多数解析事故。

NSD 安装、区文件编写与校验加载流程图

在主配置中声明区域并配置主从同步

区文件写好之后,还要在 nsd.conf 里声明它才会生效。主服务器上的配置片段如下:

server:
    username: nsd
    database: ""
    zonesdir: "/etc/nsd/zones"
    logfile: "/var/log/nsd.log"
    pidfile: "/run/nsd/nsd.pid"

zone:
    name: "example.com"
    zonefile: "example.zone"
    notify: 203.0.113.11 NOKEY
    provide-xfr: 203.0.113.11 NOKEY

notify 和 provide-xfr 两行是主从同步的关键:前者让主服务器在区文件变化时主动通知从服务器,后者允许从服务器拉取整个区域数据(即 AXFR 传输)。生产环境建议把 NOKEY 换成 TSIG 密钥认证,避免区域数据被任意主机拉走。

从服务器 ns2 上的配置更简单,区数据完全由主服务器推送:

zone:
    name: "example.com"
    zonefile: "example.com.slave"
    allow-notify: 203.0.113.10 NOKEY
    request-xfr: 203.0.113.10 NOKEY

配置完成后,在两台机器上分别执行 sudo nsd-control reconfig,然后在从服务器上验证区域是否同步成功:

nsd-checkzone example.com /etc/nsd/zones/example.com.slave
dig @203.0.113.11 example.com SOA +short

如果从服务器返回的 serial 与主服务器一致(示例中是 2026092401),说明主从同步链路已经打通。之后每次改动只需要在主服务器上递增 serial 并 reload,从服务器会在 refresh 间隔内自动跟进,紧急情况也可以在从服务器上手动执行 nsd-control transfer 立即拉取。

这样的双节点架构是权威 DNS 的最低可用形态。域名注册商处填写 NS 记录时,把 ns1 和 ns2 两台服务器都登记上,任一节点故障时另一台还能继续应答,解析服务就不会因为单机宕机而整体中断。

NSD 主从服务器区域数据同步示意图

解析验证与常见故障排查

主从都跑起来之后,要做的第一件事就是验证真实解析效果。dig 是这个环节最常用的工具,三条命令覆盖绝大多数场景:

dig @203.0.113.10 www.example.com A +short
dig @203.0.113.10 example.com NS +short
dig @203.0.113.10 example.com SOA

第一条验证 A 记录是否正确返回 203.0.113.20;第二条确认 NS 记录指向了 ns1 和 ns2;第三条不带 +short,可以看到完整的 SOA 详情和查询耗时,末尾的 Query time 通常应该在几毫秒到几十毫秒之间,如果接近超时阈值,就要检查防火墙或网络链路了。

实际运维中,解析故障大多能归到三类原因上:

  • 配置未生效:改了区文件但忘了 nsd-control reconfig,或改完发现 nsd-checkzone 报错被跳过加载
  • serial 未递增:主服务器文件已更新但从服务器 serial 没变,导致两边数据长期不一致
  • 防火墙拦截:UDP/TCP 53 端口没有放行,外部查询根本到不了服务器

排查时按”先本机、后远端”的顺序效率最高:先在服务器本机 dig @127.0.0.1 确认 NSD 本身回答正常,再从外部网络查询公网地址。本机正常而外部异常,问题基本出在防火墙、云厂商安全组或者域名注册商处的 glue record 配置上。

还有一个容易被忽略的验证点:递归解析器和权威服务器的职责边界。自建权威 DNS 后,你的服务器只回答自己区域的查询,普通用户上网用的仍是运营商或公共递归服务。如果发现”部分地区解析结果还是旧 IP”,那是递归侧的缓存(TTL,Time To Live,记录缓存时长)还没过期,等 TTL 时间窗过去即可,不要误判成权威服务器故障。解析恢复正常后,如果页面加载速度仍不理想,可以继续排查网站性能优化中提到的 TTFB 指标,把解析耗时和响应耗时分开看。

日常维护建议与选型参考

跑通只是第一步,长期稳定的权威 DNS 服务还需要几项例行维护。我们建议把区文件纳入 Git 版本管理,每次修改先提交再推送到服务器,这样任何一次误改都能在半分钟内回滚;TSIG 密钥每季度轮换一次,nsd-control zonestatus 每天抽查主从 serial 是否一致;日志里的 AXFR 记录每周扫一遍,确认没有陌生 IP 尝试拉取区域数据。另外,提前把 /etc/nsd/ 整个目录纳入每日备份,灾备时可以整目录恢复,不需要手工重建配置。

关于服务器的选择,权威 DNS 对硬件要求确实不高,但有两点值得投入:一是网络质量,解析是所有业务访问的第一跳,延迟和丢包会直接放大到每一个下游服务;二是稳定性,权威服务器一旦宕机,整个域名的网站、邮箱都会跟着失效。如果你不想把运维精力花在底层服务器上,也可以选择 Hostease 虚拟主机这类带托管解析的服务,把域名解析交给服务商维护,自己专注业务层;需要完全自主控制的团队,则可以搭配一台 Hostease VPS 来承载主从节点。

总结一下,NSD 的完整落地路径是:安装服务、编写并通过 nsd-checkzone 校验的区文件、在 nsd.conf 声明区域、配置基于 notify/request-xfr 的主从同步、最后用 dig 做端到端验证。整个流程在一小时内可以完成,但区文件的版本管理、serial 纪律和 53 端口的连通性检查需要长期坚持。如果你正准备把核心业务域名迁到自建解析上,建议先用一个不重要的测试域名完整演练一遍这套流程,确认主从切换、回滚操作都熟练之后再正式切换,把风险控制在自己能兜住的范围内。

发表评论