BIND9 9.18.39 常用命令详解

BIND9(实测 9.18.39-0ubuntu0.22.04.7,上游对照 9.20.29)常用命令详解:rndc 命令族(status/reload/reconfig/flush/zonestatus/freeze/thaw/querylog/dumpdb/stats/showzone/stop)与 dig/nslookup/named-checkconf/named-checkzone/named-journalprint 逐命令实测回显,含 nsupdate 动态更新闭环。

BIND92026/10/20

BIND9 9.18.39 常用命令详解

目标:对 BIND9 日常运维命令逐条实测——rndc 控制命令族、dig/nslookup 查询工具、named-checkconf/named-checkzone 校验工具、named-journalprint 日志回放工具,全部给出真实回显。实测环境 Ubuntu 22.04.4 LTS,bind9 1:9.18.39-0ubuntu0.22.04.7(jammy 仓库线,2026-10-20);ISC 上游当前稳定版 9.20.29(isc.org/bind 实查),命令面一致。测试域沿用安装篇的 lab.example(master 区)。

一、环境信息

项目实测值
操作系统Ubuntu 22.04.4 LTS(jammy),x86_64
软件版本named/rndc/dig 9.18.39-0ubuntu0.22.04.7-Ubuntu(Extended Support Version);上游对照 9.20.29
命令归属rndc/named-checkconf/named-journalprint → bind9 包;dig/nslookup/host → bind9-dnsutils 包
服务形态named.service(systemd),控制通道 953/TCP(TSIG 认证)
测试 zonelab.example(master,静态);动态更新演示用 /var/lib/bind 版本

rndc 与 named 的认证依赖 /etc/bind/rndc.key(安装自动生成,hmac-sha256),正常情况下无需手工指定密钥参数。

二、rndc:运行期控制命令族

2.1 rndc status:运行状态总览

# rndc status
version: BIND 9.18.39-0ubuntu0.22.04.7-Ubuntu (Extended Support Version) <id:>
running on localhost: Linux x86_64 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug  7 13:43:15 UTC
boot time: Tue, 20 Oct 2026 07:43:56 GMT
last configured: Tue, 20 Oct 2026 07:43:56 GMT
configuration file: /etc/bind/named.conf
CPUs found: 12
worker threads: 12
UDP listeners per interface: 12
number of zones: 103 (98 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 0/150
TCP high-water: 0
server is up and running

要点:number of zones 包含根提示触发的自动管理区(98 automatic);recursive clients 展示递归并发水位;server is up and running 为健康标志。

2.2 rndc reload / reconfig:两种加载

# rndc reload
server reload successful
# rndc reconfig
(无输出,静默成功)
  • reload:重读 zone 文件与配置变更(serial 变了的区重新加载),最常用。
  • reconfig:只处理新增/删除的 zone 与配置结构变化,不动已加载区数据——批量增删 zone 后用。

2.3 rndc zonestatus:单区状态

# rndc zonestatus lab.example
name: lab.example
type: primary
files: /etc/bind/db.lab.example
serial: 2
nodes: 4
last loaded: Tue, 20 Oct 2026 07:45:24 GMT
secure: no
dynamic: no
reconfigurable via modzone: no

# rndc zonestatus 88.168.192.in-addr.arpa
name: 88.168.192.in-addr.arpa
type: primary
files: /etc/bind/db.192.168.88
serial: 2
nodes: 3
last loaded: Tue, 20 Oct 2026 07:45:27 GMT
secure: no
dynamic: no

动态更新后 serial 自动递增(实测从 2 → 3),dynamic 变 yes。

2.4 rndc querylog on / off:查询日志开关

# rndc querylog on
# journalctl -u named -n 3 --no-pager
ops named[1372912]: query logging is now on
ops named[1372912]: client @0x7c6a100069a8 127.0.0.1#56820 (www.lab.example): query: www.lab.example IN A +E(0)K (127.0.0.1)
# rndc querylog off

开一次查一条的排查姿势:querylog on → 复现查询 → journalctl 抓 query: 行 → querylog off(高流量环境别长开,日志量巨大)。

2.5 rndc flush / flushname:缓存清理

# rndc flush          # 清空全部缓存
# rndc flushname www.baidu.com   # 只清某个域名

两者成功均无输出(journal 记录 flushing caches in all views succeeded)。改完 DNS 记录怀疑缓存未刷新时,先 flush 再 dig 复测。

2.6 rndc dumpdb / stats:缓存转储与统计

# rndc dumpdb -all
# rndc stats
# ls -la /var/cache/bind/ | grep -E 'dump|stats'
-rw-r--r--  1 bind bind 3969 named_dump.db
-rw-r--r--  1 bind bind 5029 named.stats
# head -8 /var/cache/bind/named_dump.db
;
; Start view _default
;
;
; Cache dump of view '_default' (cache _default)
;
; using a 0 second stale ttl
$DATE 20261020075642

named_dump.db 可 grep 定位某域名在缓存中的真实记录与 TTL;named.stats 含 Cache DB RRsets、查询量等计数段。

2.7 rndc freeze / thaw:动态区冻结

对静态 master 区执行会得到明确报错(实测):

# rndc freeze lab.example
rndc: 'freeze' failed: not dynamic

把 zone 迁到 /var/lib/bind 并加 allow-update 变为动态区后(实测成功):

# rndc freeze lab.example
A zone reload and thaw was started.
Check the logs to see the result.
# rndc thaw lab.example
(成功无输出)
# journalctl -u named -n 2 --no-pager
ops named[1372912]: received control channel command 'thaw lab.example'
ops named[1372912]: thawing zone 'lab.example/IN': success

freeze 会触发一次区重载(回显如上),thaw 恢复接受动态更新(journal 确认 success)。用途:手工批量改动态区文件前先冻结,防止 DDNS 并发写。

2.8 rndc showzone:查看 zone 配置

# rndc showzone lab.example
rndc: 'showzone' failed: failure
# rndc showzone localhost
rndc: 'showzone' failed: failure

实测本包编译下 showzone 对 named.conf 静态声明的区返回 failure(该子命令主要服务于 addzone/modzone 动态添加的区),查看静态区配置仍以 named-checkconf -p 为准——这是一个如实的兼容性边界。

2.9 其他高频子命令与错误形态

# rndc nocommand
rndc: 'nocommand' failed: unknown command
# rndc            (无参数显示完整用法)
Usage: rndc [-b address] [-c config] [-s server] [-p port]
        [-k key-file ] [-y key] [-r] [-V] [-4 | -6] command

常用清单还包括:rndc stop(优雅停止并落盘)、rndc halt(立即停止)、rndc retransfer <zone>(从区强制重传)、rndc addzone/delzone/modzone(运行期增删区,写入 nzf)。

三、dig:查询验证主力

3.1 版本与基础查询

# dig -v
DiG 9.18.39-0ubuntu0.22.04.7-Ubuntu
# dig @127.0.0.1 www.lab.example +short
192.168.88.20

+short 是脚本取值的标配;@127.0.0.1 显式指定查询服务器(省略时走 /etc/resolv.conf)。

3.2 CNAME / SOA / 反向解析

# dig @127.0.0.1 api.lab.example +noall +answer
api.lab.example.        604800  IN      CNAME   www.lab.example.
www.lab.example.        604800  IN      A       192.168.88.20

# dig @127.0.0.1 lab.example SOA +noall +answer
lab.example.            604800  IN      SOA     ns1.lab.example. admin.lab.example. 3 604800 86400 2419200 604800

# dig @127.0.0.1 -x 192.168.88.10 +noall +answer
10.88.168.192.in-addr.arpa. 604800 IN   PTR     ns1.lab.example.

-x 自动拼出 in-addr.arpa 反向名;+noall +answer 只留应答区是日志洁癖标配组合。

3.3 标志位判断:aa 与 NXDOMAIN

# dig @127.0.0.1 www.lab.example +norecurse +noall +comments
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4312
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

# dig @127.0.0.1 nothere.lab.example +noall +comments
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 17955

aa(Authoritative Answer)= 该服务器就是这片区的权威;递归转发应答只有 ra 无 aa。status: NXDOMAIN 表示域名不存在。

3.4 AXFR 区传送(运维核对 + 安全检查)

# dig @127.0.0.1 lab.example AXFR
; <<>> DiG 9.18.39-0ubuntu0.22.04.7-Ubuntu <<>> @127.0.0.1 lab.example AXFR
; (1 server found)
;; global options: +cmd
; Transfer failed.

Transfer failed. 即 allow-transfer 拒绝(对应配置篇的 allow-transfer { none; });对放行来源则回显整个区数据,常用于主从一致性核对。

四、nslookup:快速交互查询

# nslookup www.lab.example 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   www.lab.example
Address: 192.168.88.20

# nslookup -type=NS lab.example 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

lab.example     nameserver = ns1.lab.example.

第二个参数即指定 DNS 服务器;-type= 切换记录类型。输出比 dig 简短,适合人工快速核对,脚本场景仍推荐 dig +short。

五、named-checkconf / named-checkzone:静态校验

5.1 named-checkconf

# named-checkconf -v
9.18.39-0ubuntu0.22.04.7-Ubuntu
# named-checkconf
(无输出=通过)
# named-checkconf -p | head -12      # 展开 include 打印生效配置
options {
        directory "/var/cache/bind";
        listen-on port 53 {
                127.0.0.1/32;
        };
        listen-on-v6  {
                "none";
        };
        allow-recursion {
                127.0.0.0/8;
        };
        dnssec-validation no;

语法错误定位(实测,去掉一个分号):

/tmp/badcheck.conf:9: missing ';' before 'allow-recursion'

-p 输出的是「named 眼里生效的最终配置」,排障时比肉眼读 include 链可靠。

5.2 named-checkzone

# named-checkzone lab.example /var/lib/bind/db.lab.example
zone lab.example/IN: loaded serial 3
OK
# named-checkzone lab.example /etc/bind/db.notexist
zone lab.example/IN: loading from master file /etc/bind/db.notexist failed: file not found
zone lab.example/IN: not loaded due to errors.

loaded serial N 同时把区文件解析了一遍——比 named-checkconf 更早发现区数据级错误。姊妹命令 named-compilezone 在校验同时输出规范化 zone 文件。

六、nsupdate + named-journalprint:动态更新闭环

6.1 nsupdate 提交动态更新

(前置:zone 声明 allow-update { 127.0.0.1; }; 且 zone 文件置于 /var/lib/bind,原因见配置篇 AppArmor 一节。)

# nsupdate -v
> server 127.0.0.1
> zone lab.example
> update add test1.lab.example 300 IN A 192.168.88.99
> send
(成功无回显,rc=0)
# dig @127.0.0.1 test1.lab.example +noall +answer
test1.lab.example.      300     IN      A       192.168.88.99

-v 强制 TCP;更新期间 SOA serial 由 named 自动从 2 递增到 3。

6.2 named-journalprint 回放 journal

动态更新先写 .jnl 日志再合并到 zone 文件,回放内容(实测):

# named-journalprint /var/lib/bind/db.lab.example.jnl
del lab.example.                604800  IN      SOA     ns1.lab.example. admin.lab.example. 2 604800 86400 2419200 604800
add lab.example.                604800  IN      SOA     ns1.lab.example. admin.lab.example. 3 604800 86400 2419200 604800
add test1.lab.example.  300     IN      A       192.168.88.99

对不存在的 journal 会给明确提示:no journal。排障价值:动态区「改了没生效/被谁改了」时,journal 回放是唯一审计线索。

七、命令速查表

命令用途关键回显
rndc status运行状态总览server is up and running
rndc reload热加载配置与 zoneserver reload successful
rndc reconfig结构性变更加载无输出
rndc zonestatus <zone>单区 serial/type/dynamictype: primary
rndc querylog on/off查询日志开关journal query: 行
rndc flush / flushname清缓存无输出
rndc dumpdb -all / stats缓存与统计转储named_dump.db / named.stats
rndc freeze/thaw动态区冻结/解冻静态区报 not dynamic
rndc showzone <zone>查看 zone 定义静态区实测 failure
dig +short / -x / AXFR查询与区传送逐条见上
nslookup <名> <服务器>快速查询Server: ...
named-checkconf [-p/-v]配置校验无输出=通过
named-checkzone <区> <文件>区文件校验loaded serial N + OK
nsupdate动态更新提交send 成功无回显
named-journalprint <.jnl>journal 回放del/add 序列

八、参考链接