Yadifa 3.0.10 常用 CLI 命令详解
Yadifa 3.0.10 常用 CLI 命令详解:yadifad 服务端选项、yadifa ctrl 管理命令全集(15 条逐一实测)、zone 管理 reload/freeze/notify 闭环、跨服务器远程管理、dig 调试组合拳(TSIG AXFR/DNSSEC/元查询)与 yakeyrolld,附排障实录。
Yadifa 3.0.10 常用 CLI 命令详解
目标:覆盖 Yadifa 3.0.10 日常运维的完整命令面——服务端
yadifad的启动选项、管理客户端yadifa ctrl全部 15 条子命令(含真实回显)、区域管理的标准动作闭环、跨服务器远程管理、dig调试组合拳与密钥滚动器yakeyrolld。全部命令在 Ubuntu 22.04 双机环境实测(主 10.89.60.2 / 从 10.89.60.3,区域example.test),回显逐行照抄。
一、环境信息
- 软件版本:yadifad / yadifa / yakeyrolld 均为
3.0.10-11788 (2026-05-13)(源码编译安装于/opt/yadifa,安装过程见《Ubuntu 22.04 安装 Yadifa 3.0.10 指南》) - 操作系统:Ubuntu 22.04 LTS;dig 版本 9.18.39(dnsutils)
- 实测拓扑:双机主从——主服务器 ns1(10.89.60.2,primary + DNSSEC 策略签名)、从服务器 ns2(10.89.60.3,secondary,AXFR/IXFR 同步);区域
example.test - 管理面:
<control> enabled true,TSIG 密钥admin-key(hmac-sha256)用于控制通道、primary-secondary(hmac-sha256)用于区域传输;客户端配置/opt/yadifa/etc/yadifa.conf指向127.0.0.1 - 配置细节与参数语义见《Yadifa 3.0.10 配置参数详解》;本文专注命令与回显
二、CLI 工具全景
Yadifa 的命令面由四个可执行程序组成(前缀按安装位置,本文为 /opt/yadifa):
| 工具 | 路径 | 职责 | 何时用 |
|---|---|---|---|
yadifad | sbin/yadifad | 权威 DNS 服务守护进程 | 安装、启动、版本确认、配置策略预检 |
yadifa | bin/yadifa | 管理客户端(ctrl 命令族) | reload/notify/freeze/shutdown 等运维操作 |
yakeyrolld | sbin/yakeyrolld | DNSSEC 密钥滚动计划器 | 按策略生成/推进密钥生命周期的独立守护进程 |
dig | 系统(dnsutils 包) | DNS 查询调试 | 全部查询面与区域传输验证 |
分工记忆法:yadifad 管"跑",yadifa 管"改",yakeyrolld 管"滚",dig 管"查"。
三、yadifad 服务端命令行选项
3.1 选项全集
yadifad -h 实测回显(逐行照抄):
/opt/yadifa/sbin/yadifad [-c configurationfile] [...]
-c, --config : sets the configuration file to use
(default: /opt/yadifa/etc/yadifad.conf)
-d, --daemon : daemonize the server (equivalent to "daemon" in the configuration file)
--nodaemon : doesn't daemonize the server (equivalent to "nodaemon" in the configuration file)
-L, --log : sets the logging in the standard output
-u, --uid <uid> : sets the user id of the server process (equivalent to "user" in the configuration file)
-g, --gid <gid> : sets the group id of the server process (equivalent to "group" in the configuration file)
-P, --port <port> : sets the network port to use (equivalent to "port" in the configuration file)
--check-policies : check the policy keys schedule and exit
-h, --help : gives this help
-V, --version : prints the version
逐项速记:-c 指定配置(多实例时必用);-d/--nodaemon 控制是否后台化(systemd 单元用 --nodaemon);-L 把日志打到标准输出(前台排障神器);-u/-g 覆盖降权身份;-P 覆盖端口;--check-policies 是 3.x 新增的 DNSSEC 策略预检。
3.2 版本与策略预检实测
/opt/yadifa/sbin/yadifad -V
实测回显:
yadifad 3.0.10-11788 (2026-05-13)
--check-policies 用于不上线就检查 <key-roll> 时间表未来十年的排程(实测节选,exit=0):
key-roll: never-roll: testing policy sets of dates from 2026-10-26 05:29:00 to 2036-10-25 17:29:00
key-roll: never-roll: creation at 2026-01-01 00:00:00U, publication at 2026-01-01 01:00:00U, activation at 2026-01-01 02:00:00U, deactivation at 2027-01-01 03:00:00U, removal at 2027-01-01 04:00:00U, 12.2 months
key-roll: never-roll: creation at 2027-01-01 00:00:00U, publication at 2027-01-01 01:00:00U, ...
每次 KSK/ZSK 轮换变更策略后,先跑 --check-policies 核对密钥交接期(避免签名真空)再重启,是 3.x 用户的必备习惯。
四、yadifa 管理客户端与 ctrl 命令全集
4.1 客户端配置(yadifa.conf)
管理客户端读取独立的 yadifad.conf 同目录文件 yadifa.conf(实测配置):
<yadifa-ctrl>
server 127.0.0.1
tsig-key-name "admin-key"
</yadifa-ctrl>
include "keys.conf"
<yadifa-ctrl> 指定默认目标服务器与 TSIG 密钥名(密钥定义来自 include 的 keys.conf)。省得每条命令都敲 -s/-y。
4.2 通用选项
yadifa -h 实测回显(节选,控制相关部分):
ctrl subcommand: directly followed by the command
commands: cfgreload | freeze [<zone>] | freezeall | loglevel <level>[0;15] | logreopen | notify [<zone>] | querylog [enable|disable] | reload <zone> | shutdown | sync [<zone>] [clean] | thaw | thawall | unfreeze | unfreezeall | zonecfgreload [<zone>]
alternative: -t <command> : sets the command
(SHUTDOWN,RELOAD,LOGREOPEN,QUERYLOG,LOGLEVEL,FREEZE,UNFREEZE,FREEZEALL,UNFREEZEALL,SYNC,ZONENOTIFY,CFGRELOAD,CFGLOAD,ZONECFGRELOAD,ZONECFGRELOADALL)
options: -c, --config <config> : sets the yadifa configuration file
-s <host>, @<host> : sets the host to send the command to
-p, --port <port> : sets the port the host is listening to
-K <key-name> : sets the tsig key to use
-y [hmac:]name:key : sets the tsig key material to use
-h, --help : gives this help
-V, --version : prints the version
alternative: -q, --qname <zone> : sets the zone parameter of a command
两条实测得出的关键用法(不看清手册最容易栽在这里):
- ⚠️ 命令参数(zone 名、querylog 的 enable/disable、loglevel 的级别)必须用
-q传递,直接缀在命令后面会解析失败。实测对比:
yadifa ctrl reload example.test # 错误形态
实测回显:
command line: CONFIG_PARSE_UNKNOWN_KEYWORD at example.test
yadifa ctrl -q example.test reload # 正确形态
实测回显(无输出,退出码 0)。
- ⚠️
-y传的密钥不要与客户端配置里已 include 的同名密钥重复,否则先报TSIG_DUPLICATE_REGISTRATION再以NOTAUTH失败(排障实录见第九章 E3)。
4.3 ctrl 子命令速查表(15 条)
| 子命令 | 参数 | 作用 | 影响面 |
|---|---|---|---|
cfgreload | 无 | 重读 yadifad.conf 主配置 | 全局 |
zonecfgreload | -q <zone> | 重读某区域的配置段(类型/ACL/策略变更) | 单区域 |
reload | -q <zone> | 重载区域文件内容(serial +1 后的数据变更用这个) | 单区域 |
notify | -q <zone> | 立即向所有从服务器发 NOTIFY | 单区域 |
sync | -q <zone> [clean] | 把内存中的区域刷写到磁盘 journal/文件 | 单区域 |
freeze / unfreeze | -q <zone> | 冻结/解冻单区域(暂停其更新与传输) | 单区域 |
freezeall / unfreezeall / thaw / thawall | 无 | 全区域冻结/解冻(freeze/unfreeze 的全量别名) | 全局 |
querylog | -q enable|disable | 动态开关查询日志(等价于热改 queries-log-type) | 全局 |
loglevel | -q <level>[0;15] | 动态调整运行日志级别 | 全局 |
logreopen | 无 | 重开日志文件(配合 logrotate 切割) | 全局 |
shutdown | 无 | 停止 yadifad 服务 | 全局 |
五、zone 管理实战(修改-验证闭环)
5.1 改记录 → reload → dig 验证
标准动作链(真实服务器上的完整操作):
# 1. 修改区域文件:serial 递增 + 追加记录
sed -i "s/2026102602/2026102603/; /api IN CNAME www.example.test./a\\docs IN A 10.89.60.30" \
/opt/yadifa/var/zones/primaries/example.test.zone
# 2. 通过控制通道热重载(不重启服务)
yadifa ctrl -q example.test reload
# 3. dig 验证新记录
dig @127.0.0.1 docs.example.test A +noall +answer
实测回显:
docs.example.test. 86400 IN A 10.89.60.30
⚠️ 顺序提醒:手工编辑区域文件必须先 serial +1 再 reload——Yadifa 按 SOA serial 判断新旧(与 BIND 一致);漏改 serial 时 reload 不报错但新记录不生效。
5.2 notify 触发从服务器同步
yadifa ctrl -q example.test notify
实测回显(无输出,退出码 0)。从服务器侧随即在 server.log 出现实测记录:
secondary: example.test.: got AXFR from primary at 10.89.60.2#53, serial is 2026102603
从服务器 dig 验证(实测):
dig @10.89.60.3 news.example.test A +noall +answer
news.example.test. 86400 IN A 10.89.60.40
5.3 freeze/unfreeze 的真实语义
⚠️ 实测澄清一个普遍误解:freeze 冻结的是"写入"不是"查询"。冻结期间 dig 依旧正常应答(实测回显):
yadifa ctrl -q example.test freeze
dig @127.0.0.1 www.example.test A +noall +answer
yadifa ctrl -q example.test thaw
实测回显(freeze 与 thaw 之间执行 dig):
www.example.test. 86400 IN A 10.89.60.10
freeze 的实际用途:动态更新/区域传输维护窗口——比如从服务器要整体重建 journal 时先 freeze 再操作。freezeall/thawall 是全区域版本,实测均返回退出码 0。
5.4 日志动态开关实测
yadifa ctrl -q disable querylog # 关闭查询流水
yadifa ctrl -q enable querylog # 重新打开
yadifa ctrl logreopen # 配合 logrotate 切割后重开文件句柄
三条实测均无输出、退出码 0。querylog 与 logreopen 是日志运维最高频的两条——logrotate 配置里 postrotate 段放 yadifa ctrl logreopen 即可完成无缝切割。
六、跨服务器远程管理
控制命令的 -s <host>(或 @<host>)可以直接把命令打到另一台服务器——只要目标机的 <control> 已启用且持有同一把管理密钥(从服务器 keys.conf 同样定义了 admin-key 并配置 allow-control controller)。实测在主服务器上直接管理从服务器:
yadifa ctrl -s 10.89.60.3 logreopen
实测回显(无输出,退出码 0)。
由此可组合出轻量级批量管理(在管理机上循环多台服务器执行同一条 ctrl 命令),无需在每个节点登录操作。从服务器的客户端配置同样可用 yadifa ctrl -s 10.89.60.2 ... 反向管理主服务器——控制通道是点对点的,与主从角色无关。
七、dig 调试组合拳
7.1 服务器元信息三件套
dig @127.0.0.1 version.yadifa CH TXT +noall +answer
dig @127.0.0.1 hostname.bind CH TXT +noall +answer
dig @127.0.0.1 id.server CH TXT +noall +answer
实测回显(应答值来自 yadifad.conf 的 version/hostname/serverid):
version.yadifa. 0 CH TXT "3.0.10"
hostname.bind. 0 CH TXT "ns1.example.test"
id.server. 0 CH TXT "yadifad-ns1"
多节点排障时先跑这三条确认"连到的是哪台、什么版本"。⚠️ 安全提示:生产对外服务建议把 version 留空,不向公网暴露具体版本号。
7.2 AXFR 与 TSIG 认证(一正一反两次实测)
未携带 TSIG 的全量传输被 ACL 拒绝(allow-transfer key primary-secondary 生效实证):
dig @10.89.60.2 example.test AXFR +noall +answer 2>&1 | head -3
实测回显:
; Transfer failed.
携带正确 TSIG 密钥(-y <算法>:<名称>:<base64密钥>)成功拉取全区域(实测完整应答 11 条):
dig -y hmac-sha256:primary-secondary:LAq/NfcgYNcqfz6gbneLfxsmEr6FVxorOUrb98k2EZU= \
@10.89.60.2 example.test AXFR +noall +answer
实测回显:
example.test. 86400 IN SOA ns1.example.test. admin.example.test. 2026102602 10800 3600 604800 86400
example.test. 86400 IN NS ns1.example.test.
example.test. 86400 IN NS ns2.example.test.
example.test. 86400 IN A 10.89.60.20
ns1.example.test. 86400 IN A 10.89.60.2
ns2.example.test. 86400 IN A 10.89.60.3
www.example.test. 86400 IN A 10.89.60.10
api.example.test. 86400 IN CNAME www.example.test.
docs.example.test. 86400 IN A 10.89.60.30
example.test. 86400 IN MX 10 mail.example.test.
mail.example.test. 86400 IN A 10.89.60.25
example.test. 86400 IN SOA ns1.example.test. admin.example.test. 2026102602 10800 3600 604800 86400
SOA 头尾各一次是 AXFR 协议规定。⚠️ 安全提示:-y 会把密钥材料留在 shell 历史里,生产操作优先把密钥放配置文件用 -K <name> 引用。
7.3 DNSSEC 签名验证
dig @127.0.0.1 example.test DNSKEY +noall +answer | cut -c1-90
dig @127.0.0.1 www.example.test A +dnssec +noall +answer | grep RRSIG | cut -c1-130
实测回显:
example.test. 86400 IN DNSKEY 256 3 8 [key id = 54354]
example.test. 86400 IN DNSKEY 257 3 8 [key id = 47629]
www.example.test. 86400 IN RRSIG A 8 3 86400 20261124052511 20261025050310 54354 example.test. LlwCuIn5wccy4wY4+4OndNOe8kYdG07GPl2
解读:256/257 是 DNSKEY 标志位(ZSK/KSK),8 为 RSASHA256 算法号,RRSIG 中间字段依次为算法/类型位图/原始 TTL/到期/生效时间/key tag——54354 与 ZSK 的 key tag 对应说明 www 的 A 记录由 ZSK 签名。加 +dnssec 任何时候都能看到应答自带的 RRSIG。
7.4 其他实用选项
+tcp:强制走 TCP(验证max-tcp-queries上限与防火墙 53/TCP 放行);+edns:查看应答通告的 EDNS0 载荷上限(实测; EDNS: version: 0, flags:; udp: 4096);+dnssec:要求并显示 DNSSEC 记录;+nsid:请求 NSID(仅在服务器配置了<nsid>区块时有附加输出,实测环境未配置故无变化);+short:只要答案数据(脚本化场景)。
八、yakeyrolld 密钥滚动守护进程
yakeyrolld 是 DNSSEC 密钥生命周期的独立执行器(版本与主程序同步:实测 yakeyrolld -V 回显 yakeyrolld 3.0.10-11788 (2026-05-13))。它读取独立的 yakeyrolld.conf,按 <key-roll> 的时间表推进密钥的 generate/publish/activate/inactive/remove。
yakeyrolld -h 实测回显(节选):
/opt/yadifa/sbin/yakeyrolld [-c configurationfile] [...]
-c, --config : sets the configuration file to use
(default: /opt/yadifa/etc/yakeyrolld.conf)
-m, --mode : sets the program mode
(generate,play,playloop,print,print-json,genauthtoken)
--domain fqdn : the domain name, overrides the domains from the configuration file
-p, --path directory : the directory where to store the keys
-s, --server address : the address of the server
--reset : start by removing all the keys, create a new KSK and a new ZSK
--policy : name of the policy to use
--from time : at what time the plan starts (e.g. : now, -1y, YYYYMMDDHHSS in UTC).
实用组合:-m print / -m print-json 输出当前滚动计划(脚本化巡检用),--reset 重建全套密钥(演练环境用,⚠️ 生产禁用)。策略时间表本身的预检用 yadifad --check-policies(见 3.2)。本文实测的策略化自动签名(密钥生成与 NSEC 链)由 yadifad 内建完成,yakeyrolld 用于更复杂的跨时间排程场景。
九、常见问题与排障实录
以下错误均在实测中真实出现,按"现象回显 → 原因 → 处置"整理:
E1:CONFIG_PARSE_UNKNOWN_KEYWORD at example.test
现象:yadifa ctrl reload example.test 报错(4.2 实测)。原因:ctrl 命令的位置参数必须走 -q。处置:yadifa ctrl -q example.test reload。同族:querylog 的 enable/disable、loglevel 的级别值都要用 -q 传。
E2:command to 127.0.0.1#53 failed: NOTAUTH
现象:控制命令认证失败。原因:密钥不一致,或 -y 命令行密钥与配置文件同名密钥重复注册(此场景下还会先出现 error: failed to read the configuration ... TSIG_DUPLICATE_REGISTRATION,实测回显)。处置:两端 keys.conf 的 secret 核对一致;命令行传密钥改用 -K <name> 引用配置内密钥。
E3:error: yadifad already running with pid: xxx / PID_LOCKED
现象:重启时报。原因:异常退出后 pidfile 残留。处置:确认无进程后 rm -f /opt/yadifa/var/run/yadifad.pid 再启动;生产环境由 systemd 托管(systemctl restart yadifad)不会触发。
E4:shutdown 之后进程变僵尸/再次启动失败
现象:非 systemd 环境手工验证时观察到旧进程 defunct、pidfile 未清理。原因:PID 1 进程不回收子进程的特殊环境(真实服务器有 systemd 回收,不发生)。处置:kill -9 <pid>; rm -f /opt/yadifa/var/run/yadifad.pid 后重启。
E5:notify 发了但从服务器不动
现象:从服务器 zone.log 出现实测记录 notify: secondary: example.test.: 10.89.60.2#34447: not authorised。原因:从服务器 allow-notify 配了 TSIG key,但 NOTIFY 报文不带签名。处置:allow-notify 改为主服务器 IP(TSIG 的正确位置是 primary 行,见配置篇 9.2)。
E6:Transfer failed.
现象:dig @10.89.60.2 example.test AXFR 无数据(7.2 实测)。原因:服务器 ACL 限制区域传输(这是正确行为)。处置:带 TSIG 重试或核对 allow-transfer;若是主→从同步失败则核对从区域 primary 行的 key <name>。
十、参考链接
- GitHub 仓库与 v3.0.10 发布(源码内含
doc/yadifad.man、doc/yadifa.man、doc/yakeyrolld.man手册页):https://github.com/yadifa/yadifa - 官网与下载页(2.x 线参考手册 YRM26.pdf):https://www.yadifa.eu/ 、https://www.yadifa.eu/download.html
- 站内同专栏:《Yadifa 3.0.10 介绍与选型指南》、《Ubuntu 22.04 安装 Yadifa 3.0.10 指南》、《Yadifa 3.0.10 配置参数详解》(本文命令操作的对象——配置参数与验证逻辑)
- 站内对照阅读:《BIND9 9.18.39 常用命令详解》(rndc 与 yadifa ctrl 对照)、《Knot DNS 3.6.1 常用 CLI 命令与工具详解》(knotc 对照)、《djbdns 1.05 常用 CLI 命令与工具详解》