Knot DNS 3.6.1 常用 CLI 命令与工具详解
Knot DNS 3.6.1 全家桶 CLI 工具逐个详解:五包归属清单(dpkg 实测)、knotd/knotc(status/zone-*/conf-*/zone-backup 权限排障)、kdig/khost 查询矩阵、knsupdate 带 TSIG 动态更新、keymgr/kzonesign/knsec3hash/kzonecheck DNSSEC 工具链、kjournalprint 变更审计与 kxdpgun 用法,全部命令实测并逐行照抄回显。
Knot DNS 3.6.1 常用 CLI 命令与工具详解
目标:详解 Knot DNS 3.6.1 全家桶命令行工具的包归属、核心参数与实战用法——服务端 knotd、控制台 knotc、诊断查询 kdig/khost、动态更新 knsupdate、DNSSEC 工具 keymgr/kzonesign/knsec3hash/kzonecheck、辅助工具 kjournalprint/kcatalogprint/kxdpgun。全部命令在 Ubuntu 22.04.4 LTS + Knot DNS 3.6.1(CZ.NIC 官方仓库)逐条实测,输出逐行照抄;用法语义以随包分发的 man 手册(knotd(8)/knotc(8)/kdig(1) 等)为准。安装流程见《Ubuntu 22.04 安装 Knot DNS 指南》,配置体系见《Knot DNS 3.6.1 配置参数详解》。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS(jammy),x86_64,12 核 |
| 软件版本 | Knot DNS 3.6.1(knotd, Knot DNS 3.6.1,CZ.NIC 官方仓库 3.6.1-cznic.1~jammy) |
| 实验域 | lab.example(主域,含 SOA/NS/MX/A/TXT 记录) |
| 服务监听 | 127.0.0.9@53 与 ::1@53(本机 53 被占用,见部署篇) |
| 控制套接字 | /run/knot/knot.sock(Unix socket) |
Knot 的命令行工具按角色拆分在 5 个包里,dpkg -L 逐一实测归属如下(这是「装了 knot 却找不到 kdig」之类问题的根源):
| 工具 | 所属包 | 安装路径 | 角色 |
|---|---|---|---|
| knotd / knotc | knot | /usr/sbin | 服务端 / 控制台 |
| kjournalprint / kcatalogprint | knot | /usr/sbin | journal / 目录域审查 |
| kdig / knsupdate | knot-dnsutils | /usr/bin / /usr/bin | 诊断查询 / 动态更新 |
| kxdpgun | knot-dnsutils | /usr/sbin | XDP 压测 |
| keymgr | knot-keymgr | /usr/sbin | DNSSEC 密钥管理 |
| knsec3hash / kzonecheck / kzonesign | knot-dnssecutils | /usr/bin | NSEC3 哈希 / zone 校验 / 离线签名 |
| khost | knot-host | /usr/bin | 简化查询(dig 风格替代) |
二、前置条件
sudo apt install -y knot knot-dnsutils knot-keymgr
# 本篇另需两个补充包(DNSSEC 工具与 khost)
sudo apt install -y knot-dnssecutils knot-host
实测回显(补充包安装段,中文 locale):
正在解压 knot-dnssecutils (3.6.1-cznic.1~jammy) ...
正在设置 knot-dnssecutils (3.6.1-cznic.1~jammy) ...
正在设置 knot-host (3.6.1-cznic.1~jammy) ...
每个工具的完整参数清单随包分发(man knotc、man kdig、man keymgr 等);本文只详解实测覆盖的核心参数。
三、服务端与控制台:knotd / knotc
3.1 knotd:服务进程本体
日常运维不直接运行 knotd(systemd 单元 knot.service 托管),但它是版本与配置语义的第一入口:
knotd -V
实测回显:
knotd, Knot DNS 3.6.1
knotd -h 关键参数(逐行照抄,完整 16 行见 man knotd):
Usage: knotd [-c | -C <path>] [options]
Config options:
-c, --config <file> Use a textual configuration file.
(default /etc/knot/knot.conf)
-C, --confdb <dir> Use a binary configuration database directory.
(default /var/lib/knot/confdb)
-c文本配置与-C二进制配置库的取舍正是 confdb 机制的核心:knotd 启动只认一个事实源,机制详解见配置篇第一节。
3.2 knotc:一切运维动作的控制台
knotc -h 自带全部 action 清单(实测 83 行,含每个 action 的参数形态与 (#)/(*) 标记——带 # 的 action 会实际触发 zone 事件)。全局选项里最常用三个:
-b, --blocking Zone event trigger commands wait until the event is finished.
-e, --extended Show extended output.
-f, --force Forced operation. Overrides some checks.
服务与线程状态:
knotc status version
knotc status workers
实测回显:
3.6.1
UDP workers: 12, TCP workers: 12, XDP workers: 0, background workers: 10 (running: 0, pending: 0)
zone 体检三连(check 静默通过、status 看 serial、flush 落盘):
knotc zone-check
knotc zone-status lab.example
knotc zone-flush lab.example
实测回显(zone-check 成功时无任何输出,直接返回):
[lab.example.] role: master | serial: 2026102002 | notify: +1h38m28s
OK
阻塞模式:zone 事件类命令默认异步回 OK,加 -b 等事件完成才返回(排障时配合 zone-reload 最有用):
knotc -b zone-reload lab.example
实测回显:
OK
维护窗口工具(冻结期间暂停自动签名/刷新等变更类事件):
knotc zone-freeze lab.example
knotc zone-thaw lab.example
实测回显(各回一行 OK):
OK
OK
zone-backup 与目录权限(排障实录):备份目标目录必须是 knot 运行用户可写,否则报 operation not permitted(真实复现):
$ knotc zone-backup +backupdir /opt/data/quzuo/tmp/knot/backup2 lab.example
error: (operation not permitted) /opt/data/quzuo/tmp/knot/backup2
把目录属主交给 knot 后重试即成功:
sudo mkdir -p /opt/data/quzuo/tmp/knot/backup2
sudo chown knot:knot /opt/data/quzuo/tmp/knot/backup2
knotc zone-backup +backupdir /opt/data/quzuo/tmp/knot/backup2 lab.example
实测回显:
OK
备份产物结构(ls -R 实拍)——zone 文件、密钥库、定时器三件套打包:
/opt/data/quzuo/tmp/knot/backup2:
keys
knot_backup.label
timers
zonefiles
/opt/data/quzuo/tmp/knot/backup2/keys:
data.mdb
keys
lock.mdb
quic_key.pem
/opt/data/quzuo/tmp/knot/backup2/keys/keys:
003965598a9701c72751fc8f662a7b6e6af7ba48.pem
f08b4e8c523379a7ccfe429c6ef84bf1177e68c1.pem
/opt/data/quzuo/tmp/knot/backup2/timers:
data.mdb
lock.mdb
/opt/data/quzuo/tmp/knot/backup2/zonefiles:
lab.example.zone
配置类 conf-* 命令(conf-list/conf-read/conf-begin/conf-set/conf-commit/conf-unset/conf-abort)的完整事务语义与实测回显见配置篇第三节——关键点重复一遍:conf-read 输出为空格分隔、多值逐行展开,conf-unset 必须在事务内。
zone-read 的尾点规则(排障实录):owner 参数必须写全限定名(带尾点),否则报错:
$ knotc zone-read lab.example app.lab.example
error: (no such node in zone found) [lab.example] app.lab.example
$ knotc zone-read lab.example 'app.lab.example.'
app.lab.example. 600 A 192.168.1.200
四、诊断查询:kdig / khost
4.1 kdig:与 BIND 的 dig 同源血统
kdig 与 BIND 的 dig 同源(都出自 NSEC/DNSSEC 工具链一脉),默认输出自带应答头与 EDNS 详情。标准查询全格式(逐行照抄):
kdig @127.0.0.9 lab.example SOA
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 10733
;; Flags: qr aa rd; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1
;; EDNS PSEUDOSECTION:
;; Version: 0; flags: ; UDP size: 1232 B; ext-rcode: NOERROR
;; QUESTION SECTION:
;; lab.example. IN SOA
;; ANSWER SECTION:
lab.example. 3600 IN SOA ns1.lab.example. admin.lab.example. 2026102002 86400 7200 3600000 3600
;; Received 86 B
;; Time 2026-10-20 17:56:10 CST
;; From 127.0.0.9@53(UDP) in 0.2 ms
脚本友好的 +short:
kdig @127.0.0.9 lab.example SOA +short
kdig @127.0.0.9 -c CH -t TXT version.bind +short
实测回显:
ns1.lab.example. admin.lab.example. 2026102003 86400 7200 3600000 3600
"Knot DNS 3.6.1"
强制 TCP(+tcp,应答尾行协议标记随之变化):
kdig @127.0.0.9 www.lab.example A +tcp
实测回显(关键行,完整格式同上):
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 25339
;; Flags: qr aa rd; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1
www.lab.example. 3600 IN A 192.168.1.100
;; From 127.0.0.9@53(TCP) in 0.3 ms
反向查询 -x(查询未配置的反向域,服务端以 REFUSED + EDE 20 明确拒绝——EDE 即 Extended DNS Error,是排障利器):
kdig @127.0.0.9 -x 192.168.1.100
实测回显(关键行):
;; ->>HEADER<<- opcode: QUERY; status: REFUSED; id: 31014
;; Flags: qr rd; QUERY: 1; ANSWER: 0; AUTHORITY: 0; ADDITIONAL: 1
;; EDE: 20 (Not Authoritative)
;; QUESTION SECTION:
;; 100.1.168.192.in-addr.arpa. IN PTR
CHAOS 类查询(identity/version 的正确查询名是 id.server./version.server. 及其 bind. 别名,实测细节见配置篇 3.3 节);AXFR 区块转移见配置篇 5.4 节(放行/NOTAUTH 双向实测);DoT 加密查询 kdig -p 8853 +tls(零证书配置可用)见配置篇 5.1 节。
4.2 khost:一问一答的极简客户端
khost lab.example 127.0.0.9
khost -t TXT txt.lab.example 127.0.0.9
实测回显:
Host lab.example. has no A record
Host lab.example. has no AAAA record
lab.example. mail is handled by 10 mail.lab.example.
txt.lab.example. description is "knot dns lab"
五、动态更新:knsupdate
knsupdate 是 nsupdate 风格的交互式 DDNS 客户端。关键前置是 TSIG key 文件格式:它只认 algorithm:name:secret 单行格式——正是 keymgr -t 生成输出的注释行(见 6.1 节)。两种常见错误格式的实测报错(YAML 片段与 BIND named.conf 风格均不解析):
;; ERROR: failed to parse TSIG keyfile 'bad-yaml.key'
;; ERROR: failed to parse TSIG keyfile 'bad-bind.key'
正确格式文件内容(keymgr -t 生成时注释行原样拷出即可):
hmac-sha256:ddns-key:whbCR6X0Rvfq2rvlV1diJ6Du4QczkAbTqzV8Sq/1mns=
带 TSIG 的更新会话(交互命令经管道输入;server → zone → update add → send → quit):
printf 'server 127.0.0.9\nzone lab.example.\nupdate add app.lab.example. 600 A 192.168.1.200\nsend\nquit\n' | knsupdate -k ddns.key
实测回显(成功时无输出,静默返回):
(无输出,退出码 0)
双路验证更新生效(kdig 应答 + zone-status serial 自动 +1:2026102002 → 2026102003):
kdig @127.0.0.9 app.lab.example A +short
knotc zone-status lab.example
实测回显:
192.168.1.200
[lab.example.] role: master | serial: 2026102003 | notify: +1s
未带 TSIG 的 update 会被拒绝(配合配置篇 5.4 节 acl 实测);journal 里的这次变更可用 kjournalprint 直接审计(见 7.1 节,changeset 2 即本条记录)。
六、DNSSEC 工具:keymgr / kzonesign / knsec3hash / kzonecheck
6.1 keymgr:密钥全生命周期
生成 TSIG 密钥(-t),输出注释行格式可直接喂给 knsupdate/kdig -k,YAML 片段可直接粘进 knot.conf:
keymgr -t ddns-key hmac-sha256
实测回显:
# hmac-sha256:ddns-key:4xbMaxWp4SiyBmKKbwfNNbAfVYlZFn77QzQmkMz1pNA=
key:
- id: ddns-key
algorithm: hmac-sha256
secret: 4xbMaxWp4SiyBmKKbwfNNbAfVYlZFn77QzQmkMz1pNA=
查看 KASP 库中的 DNSSEC 密钥(keymgr <zone> list,直接读 /var/lib/knot/kasp-db 需要与 knotd 同权限运行):
keymgr lab.example list
实测回显(ZSK 行带 active=、KSK 行带 ready=,状态机解读见配置篇 5.7 节):
003965598a9701c72751fc8f662a7b6e6af7ba48 25397 ZSK ECDSAP256SHA256 created=1792488861 publish=1792488861 active=1792488861
f08b4e8c523379a7ccfe429c6ef84bf1177e68c1 48798 KSK ECDSAP256SHA256 created=1792488861 publish=1792488861 ready=1792488861
6.2 kzonesign:离线签名
不依赖运行中的 knotd,按配置读 zone 文件与 KASP 密钥,签名结果写到 -o 输出目录:
kzonesign -o /opt/data/quzuo/tmp/knot/signed lab.example
实测回显:
warning: DNSSEC policy not configured for zone 'lab.example', taking defaults
Next signing: 1793570301
产出文件头部(实拍,含 DNSKEY/CDS/CDNSKEY):
;; Zone dump (Knot DNS 3.6.1)
lab.example. 3600 SOA ns1.lab.example. admin.lab.example. 2026102003 86400 7200 3600000 3600
lab.example. 3600 NS ns1.lab.example.
lab.example. 3600 MX 10 mail.lab.example.
lab.example. 3600 DNSKEY 256 3 13 M74ctJYL4CL0EZknVKcAf8kAf+Kn1Beo7E/OzislfBTsDAUc3/LC543rsQQp3IRJgCnawc7CMsMTySAUY/7WCA==
lab.example. 3600 DNSKEY 257 3 13 6JLOZSYj8/t3vMT5VTRvmxMqxRj7wWPBvSh9BnkFG6UMynpFOeWP43OnbDMcAY1/ZI6nw4KlP1/6Rft3MZYRdA==
6.3 knsec3hash:NSEC3 哈希计算
纯计算工具,主用法 knsec3hash <salt> <algorithm> <iterations> <domain-name>(algorithm 是 NSEC3 哈希算法,只能为 1=SHA-1;传签名算法 13 会报错——实测踩坑):
$ knsec3hash c01dcafe 13 0 www.lab.example.
error: cannot compute NSEC3 hash (invalid hash algorithm)
正确用法与备用用法(knsec3hash 1 0 10 c01dcafe knot-dns.cz 实拍):
knsec3hash c01dcafe 1 0 www.lab.example.
8m0jrdplr0pkj34fq196ba7p0enmr5hr (salt=c01dcafe, hash=1, iterations=0)
knsec3hash 1 0 0 c01dcafe www.lab.example.
8m0jrdplr0pkj34fq196ba7p0enmr5hr (salt=1, hash=1, iterations=0)
注意备用用法的一个真实怪癖:哈希结果与主用法完全一致(同参数同哈希),但输出的
salt=标签显示的是第一个参数(本例显示 salt=1 而非 c01dcafe)。脚本取哈希值无影响,人读输出建议用主用法。
6.4 kzonecheck:zone 文件校验
kzonecheck /var/lib/knot/lab.example.zone
实测回显——注意 zone 文件里含 DNSKEY/RRSIG 时自动进入 DNSSEC 校验模式,非完整签名链会报:
[app.lab.example.] missing NSEC(3) record
Error summary:
1 missing NSEC(3) record
纯数据校验用 -d off 显式关闭 DNSSEC 检查,通过时静默(退出码 0):
kzonecheck -d off /var/lib/knot/lab.example.zone
(无输出,退出码 0)
七、辅助与运维工具:kjournalprint / kcatalogprint / kxdpgun
7.1 kjournalprint:journal 变更审计
直接读 journal 库(LMDB),把 DDNS/签名等每次变更还原成 changeset。列库内 zone(-z):
kjournalprint -D /var/lib/knot/journal -z
实测回显:
lab.example.
打印变更(-l 4 限最近变更、-x 关闭着色)。实测输出包含两个 changeset——changeset 1 是 DNSSEC 开启(DNSKEY/RRSIG/NSEC 成批入网),changeset 2 是五节那条 DDNS(serial 2026102002 → 2026102003,恰是 app.lab.example. A 192.168.1.200):
kjournalprint -D /var/lib/knot/journal -l 4 -x lab.example
实测回显(changeset 2 全文与 changeset 1 头部;changeset 1 的 RRSIG/NSEC 明细较长,此处截取):
;; Changes between zone versions: 2026102001 -> 2026102002, changeset: 1, timestamp: 1792488861
;; Removed
lab.example. 3600 SOA ns1.lab.example. admin.lab.example. 2026102001 86400 7200 3600000 3600
;; Added
lab.example. 3600 SOA ns1.lab.example. admin.lab.example. 2026102002 86400 7200 3600000 3600
lab.example. 3600 DNSKEY 256 3 13 M74ctJYL4CL0EZknVKcAf8kAf+Kn1Beo7E/OzislfBTsDAUc3/LC543rsQQp3IRJgCnawc7CMsMTySAUY/7WCA==
lab.example. 3600 DNSKEY 257 3 13 6JLOZSYj8/t3vMT5VTRvmxMqxRj7wWPBvSh9BnkFG6UMynpFOeWP43OnbDMcAY1/ZI6nw4KlP1/6Rft3MZYRdA==
(……RRSIG/NSEC 明细截取……)
;; Changes between zone versions: 2026102002 -> 2026102003, changeset: 2, timestamp: 1792490189
;; Removed
lab.example. 3600 SOA ns1.lab.example. admin.lab.example. 2026102002 86400 7200 3600000 3600
;; Added
lab.example. 3600 SOA ns1.lab.example. admin.lab.example. 2026102003 86400 7200 3600000 3600
app.lab.example. 600 A 192.168.1.200
7.2 kcatalogprint:目录域审查
读 catalog 库(RFC 9432 目录域的成员登记)。未配置目录域时如实报库不存在:
kcatalogprint -D /var/lib/knot/catalog
实测回显:
error: failed to print catalog (database does not exist)
;; <member zone> <record owner> <catalog zone> <group>
配置 catalog-role: interpreter(成员端)或 catalog-role: generate(目录端)后,该库才会生成。
7.3 kxdpgun:XDP 高性能压测
kxdpgun -h(逐行照抄关键段,用法为 -i 指定查询模板文件、目标为远端 IP):
Usage: kxdpgun [options] -i <queries_file> <dest_ip>
Options:
-t, --duration <sec> Duration of traffic generation.
(default is 5 seconds)
-Q, --qps <qps> Number of queries-per-second (approximately) to be sent.
(default is 1000 qps)
-p, --port <port> Remote destination port.
(default is 53 for UDP/TCP, 853 for QUIC)
-I, --interface <ifname> Override auto-detected interface for outgoing communication.
-i, --infile <file> Path to a file with query templates.
-m, --mode <mode> Set XDP mode (auto, copy, generic).
kxdpgun 依赖内核 XDP 在网卡驱动层注入流量,需要真实接口与 root 权限(回环地址 127.0.0.9 不具备 XDP 语义,本文环境未实测发压);其对应的被压面即 server/xdp 节的 XDP 监听模式(官方 400GbE 基准同款形态,见选型篇 4.3 节)。普通吞吐评估可先用 mod-stats 计数(配置篇 5.8 节)。
八、参考链接
- 随包 man 手册(版本精确匹配 3.6.1):
man knotd、man knotc、man kdig、man knsupdate、man keymgr、man kjournalprint、man kcatalogprint、man kxdpgun、man knsec3hash、man kzonecheck、man kzonesign - 官方工具文档:https://knot-dns.gitlab.io/knot-dns/html/utilities.html
- 官方操作手册(knotc 运维操作):https://knot-dns.gitlab.io/knot-dns/html/operation.html
- 本系列:《Knot DNS 3.6.1 介绍与选型指南》(https://www.quzuo.net/document/8DgAwd9gPLGN)、《Ubuntu 22.04 安装 Knot DNS 指南》(https://www.quzuo.net/document/xXoJPt3ooevt)、《Knot DNS 3.6.1 配置参数详解》(https://www.quzuo.net/document/2YBxmKwqXlaJ)
- 站内同类:《BIND9 9.18.39 常用命令详解》(https://www.quzuo.net/document/5RrIgZaG5ayY)