djbdns 1.05 常用 CLI 命令与工具详解
djbdns 1.05 常用 CLI 命令与工具详解:tinydns/dnscache 服务端、tinydns-data/tinydns-conf/tinydns-get/tinydns-edit 数据管理、dnsq/dnsqr/dnstrace/dnstracesort 查询调试、dnsip/dnsname/dnsmx/dnstxt/dnsfilter/random-ip 客户端工具、pickdns 系列,逐条实测命令与真实回显。
djbdns 1.05 常用 CLI 命令与工具详解
目标:逐条讲解 djbdns 1.05 的全部命令行工具,包括权威服务器(tinydns)、递归缓存(dnscache)、数据编译(tinydns-data)、配置生成(tinydns-conf/dnscache-conf)、查询调试(dnsq/dnsqr/dnstrace)、客户端工具(dnsip/dnsname/dnsmx/dnstxt/dnsfilter/random-ip)以及 pickdns 系列。每个工具均给出用法、参数、实测命令与真实回显。本篇基于 Ubuntu 22.04 + djbdns 1.05 实测,查询日期 2026-10-25。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS
- djbdns 版本:1.05(Ubuntu 打包版
1:1.05-15fakesync1) - tinydns 监听:10.0.0.1:53
- dnscache 监听:127.0.0.1:53
- 测试域名:example.test(权威记录见《djbdns 1.05 配置参数详解》)
- 查询日期:2026-10-25
二、工具概览
djbdns 1.05 的命令行工具按职责分为四类:
| 类别 | 工具 | 作用 |
|---|---|---|
| 服务端 | tinydns、dnscache | 权威服务器、递归缓存 |
| 数据管理 | tinydns-data、tinydns-conf、tinydns-get、tinydns-edit、dnscache-conf | 数据编译、服务目录生成、数据查询、记录编辑 |
| 查询调试 | dnsq、dnsqr、dnstrace、dnstracesort | 直接查询、递归查询、委派追踪 |
| 客户端工具 | dnsip、dnsname、dnsmx、dnstxt、dnsipq、dnsfilter、random-ip | 正向/反向查询、MX/TXT 查询、批量反向、随机 IP 生成 |
| 其他 | pickdns、pickdns-conf、pickdns-data | 基于 IP 的轮询 DNS(负载均衡) |
三、前置条件
- 已完成 djbdns 安装(参见《Ubuntu 22.04 安装 djbdns 1.05 指南》)
- tinydns 监听 10.0.0.1:53 并已加载 example.test 域数据
- dnscache 监听 127.0.0.1:53
四、服务端程序
4.1 tinydns
作用:权威 DNS 服务器,从 data.cdb 读取记录并应答查询。
用法:tinydns 通过环境变量 IP 和 ROOT 配置,通常由 envdir + envuidgid 启动:
envuidgid tinydns envdir ./env softlimit -d400000 tinydns
环境变量:
| 变量 | 说明 |
|---|---|
| IP | 监听的 IP 地址 |
| ROOT | 数据目录(含 data.cdb) |
| UID/GID | 由 envuidgid 设置,降权运行 |
直接运行报错示例:
tinydns
tinydns: fatal: $GID not set
💡 说明:tinydns 不能直接以 root 运行,必须通过
envuidgid切换到非特权用户。正确启动方式见 run 脚本。
4.2 dnscache
作用:递归 DNS 缓存服务器,替客户端做递归查询并缓存结果。
用法:
envuidgid dnscache envdir ./env softlimit -o250 -d4000000 dnscache
环境变量:
| 变量 | 说明 |
|---|---|
| IP | 监听 IP |
| ROOT | 根目录(含 servers/ 和 ip/) |
| CACHESIZE | 缓存大小(字节) |
| DATALIMIT | 内存上限(字节) |
实测递归解析:
dig @127.0.0.1 google.com A +short
142.251.46.78
五、数据管理工具
5.1 tinydns-data
作用:将文本格式的 data 文件编译成二进制 data.cdb。
用法:在 data 文件所在目录直接运行:
tinydns-data
实测:
cd /etc/tinydns/root
cat data
=ns1.example.test:10.0.0.1:86400
+www.example.test:10.0.0.1:86400
.example.test:10.0.0.1:a:259200
tinydns-data
ls -la data.cdb
-rw-r--r-- 1 root root 2191 Oct 25 11:56 data.cdb
💡 说明:
tinydns-data原子替换data.cdb,运行中的 tinydns 会自动感知新数据,无需重启。如果编译失败,旧的data.cdb保持不变。
5.2 tinydns-conf
作用:生成 tinydns 服务目录(run 脚本、env/、log/、root/)。
用法:
tinydns-conf acct logacct dir ip
| 参数 | 说明 |
|---|---|
| acct | 运行 tinydns 的用户名 |
| logacct | 运行日志的用户名 |
| dir | 服务目录路径 |
| ip | 监听 IP 地址 |
实测:
useradd -r tinydns
useradd -r dnslog
tinydns-conf tinydns dnslog /etc/tinydns 10.0.0.1
ls /etc/tinydns/
env log root run
5.3 tinydns-get
作用:直接查询 data.cdb,不经过网络,用于调试 data 文件。
用法:
tinydns-get type name
| 参数 | 说明 |
|---|---|
| type | 记录类型(a、ns、mx、ptr、cname、txt、any 等) |
| name | 要查询的域名 |
实测 A 记录:
cd /etc/tinydns/root
tinydns-get a www.example.test
1 www.example.test:
85 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 1 www.example.test
answer: www.example.test 86400 A 10.0.0.1
authority: example.test 259200 NS a.ns.example.test
additional: a.ns.example.test 259200 A 10.0.0.1
实测 PTR 记录:
tinydns-get ptr 1.0.0.10.in-addr.arpa
12 1.0.0.10.in-addr.arpa:
106 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 12 1.0.0.10.in-addr.arpa
answer: 1.0.0.10.in-addr.arpa 86400 PTR ns1.example.test
authority: 0.0.10.in-addr.arpa 259200 NS a.ns.0.0.10.in-addr.arpa
additional: a.ns.0.0.10.in-addr.arpa 259200 A 10.0.0.1
实测 CNAME 记录:
tinydns-get cname ftp.example.test
5 ftp.example.test:
87 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 5 ftp.example.test
answer: ftp.example.test 3600 CNAME www.example.test
authority: example.test 259200 NS a.ns.example.test
additional: a.ns.example.test 259200 A 10.0.0.1
5.4 tinydns-edit
作用:以原子方式编辑 data 文件(添加/删除记录),避免并发编辑冲突。
用法:
tinydns-edit data data.new add [ns|childns|host|alias|mx] domain ip [mxname] [distance]
实测用法输出:
tinydns-edit
tinydns-edit: usage: tinydns-edit data data.new add [ns|childns|host|alias|mx] domain a.b.c.d
实测添加主机记录:
cd /etc/tinydns/root
tinydns-edit data data.new add host app.example.test 10.0.0.3
mv data.new data
make
dig @10.0.0.1 app.example.test A +short
10.0.0.3
💡 说明:
tinydns-edit通过先写data.new再原子替换data的方式,保证编辑过程中 data 文件不会损坏。适合脚本化管理 DNS 记录。
5.5 dnscache-conf
作用:生成 dnscache 服务目录。
用法:
dnscache-conf acct logacct dir ip
实测:
useradd -r dnscache
dnscache-conf dnscache dnslog /etc/dnscache 127.0.0.1
ls /etc/dnscache/
env log root run seed
六、查询调试工具
6.1 dnsq
作用:直接向指定 DNS 服务器发送查询,不经过系统 resolver。
用法:
dnsq type name server
| 参数 | 说明 |
|---|---|
| type | 记录类型(a、mx、ns、txt、ptr、cname 等) |
| name | 查询域名 |
| server | DNS 服务器 IP |
实测查询 A 记录:
dnsq a www.example.test 10.0.0.1
1 www.example.test:
85 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 1 www.example.test
answer: www.example.test 86400 A 10.0.0.1
authority: example.test 259200 NS a.ns.example.test
additional: a.ns.example.test 259200 A 10.0.0.1
实测查询 MX 记录:
dnsq mx example.test 10.0.0.1
15 example.test:
102 bytes, 1+1+1+2 records, response, authoritative, noerror
query: 15 example.test
answer: example.test 86400 MX 0 a.mx.example.test
authority: example.test 259200 NS a.ns.example.test
additional: a.mx.example.test 86400 A 10.0.0.1
additional: a.ns.example.test 259200 A 10.0.0.1
实测查询 TXT 记录:
dnsq txt txt.example.test 10.0.0.1
16 txt.example.test:
96 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 16 txt.example.test
answer: txt.example.test 86400 TXT "v=spf1 include:example.test ~all"
authority: example.test 259200 NS a.ns.example.test
additional: a.ns.example.test 259200 A 10.0.0.1
实测查询 NS 记录:
dnsq ns example.test 10.0.0.1
2 example.test:
65 bytes, 1+1+0+1 records, response, authoritative, noerror
query: 2 example.test
answer: example.test 259200 NS a.ns.example.test
additional: a.ns.example.test 259200 A 10.0.0.1
实测查询 PTR 记录:
dnsq ptr 1.0.0.10.in-addr.arpa 10.0.0.1
12 1.0.0.10.in-addr.arpa:
106 bytes, 1+1+1+1 records, response, authoritative, noerror
query: 12 1.0.0.10.in-addr.arpa
answer: 1.0.0.10.in-addr.arpa 86400 PTR ns1.example.test
authority: 0.0.10.in-addr.arpa 259200 NS a.ns.0.0.10.in-addr.arpa
additional: a.ns.0.0.10.in-addr.arpa 259200 A 10.0.0.1
💡 说明:
dnsq输出第一行的数字是记录类型号(1=A、2=NS、5=CNAME、12=PTR、15=MX、16=TXT)。输出格式与tinydns-get类似,但dnsq是通过网络查询真实服务器,tinydns-get是直接读 data.cdb。
6.2 dnsqr
作用:递归查询,使用系统 /etc/resolv.conf 中的 DNS 服务器。
用法:
dnsqr type name
实测:
dnsqr a google.com
1 google.com:
44 bytes, 1+1+0+0 records, response, noerror
query: 1 google.com
answer: google.com 210 A 142.251.45.142
💡 说明:
dnsqr不接受服务器参数,始终使用/etc/resolv.conf配置的 DNS。与dnsq的区别:dnsq是直接查询(不递归),dnsqr是递归查询。
6.3 dnstrace
作用:追踪 DNS 委派路径,从根服务器开始逐级查询,输出每一步的 NS 和 A 记录。
用法:
dnstrace type name root-server-ip
实测(输出节选):
dnstrace a example.com 198.41.0.4 2>&1 | head -20
0:.:.:start:NS:.:.
0:.:.:start:A:.:198.41.0.4
1:example.com:.:198.41.0.4:tx
1:example.com:.:198.41.0.4:NS:com:l.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:j.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:h.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:d.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:b.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:f.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:k.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:m.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:i.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:g.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:a.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:c.gtld-servers.net
1:example.com:.:198.41.0.4:NS:com:e.gtld-servers.net
1:example.com:.:198.41.0.4:A:l.gtld-servers.net:192.41.162.30
1:example.com:.:198.41.0.4:A:j.gtld-servers.net:192.48.79.30
💡 说明:
dnstrace输出格式为级别:域名:父域:服务器:类型:键:值。0:是根服务器,1:是顶级域(.com)的名称服务器,依此类推。tx表示发送查询,NS是名称服务器记录,A是地址记录。
6.4 dnstracesort
作用:对 dnstrace 的输出进行排序,便于阅读。
用法:
dnstrace type name root-ip | dnstracesort
通常与 dnstrace 管道配合使用,将杂乱的追踪结果按域名和类型排序。
七、客户端工具
7.1 dnsip
作用:查询域名的 A 记录(IP 地址),使用系统 resolver。
用法:
dnsip fqdn [fqdn ...]
实测(系统 resolver 指向 dnscache):
dnsip google.com
142.251.46.78
💡 说明:
dnsip使用/etc/resolv.conf中的 DNS 服务器。如果域名不存在,输出空行。临时错误时输出错误信息并以 111 退出。
7.2 dnsname
作用:反向查询 IP 对应的域名(PTR 记录)。
用法:
dnsname a.b.c.d [a.b.c.d ...]
实测:
dnsname 8.8.8.8
dns.google
7.3 dnsmx
作用:查询域名的 MX 记录。
用法:
dnsmx fqdn
实测:
dnsmx google.com
10 smtp.google.com
💡 说明:如果域名没有 MX 记录,
dnsmx会输出一个伪造的 MX 记录(优先级 0,指向域名本身),模拟邮件传输代理(MTA)的行为。
7.4 dnstxt
作用:查询域名的 TXT 记录。
用法:
dnstxt fqdn
实测:
dnstxt txt.example.test
v=spf1 include:example.test ~all
7.5 dnsipq
作用:将相对域名通过域名限定(qualification)转换为完全限定域名(FQDN)后查询 A 记录。
用法:
dnsipq udn [udn ...]
实测:
dnsipq www
www.example.com 93.184.216.34
💡 说明:
dnsipq会根据/etc/resolv.conf中的search和domain指令对相对域名进行补全。例如search example.com时,www会被补全为www.example.com。
7.6 dnsfilter
作用:从标准输入读取 IP 地址列表,并行执行反向查询,输出 ip=域名 格式。
用法:
echo -e "ip1\nip2" | dnsfilter
实测:
echo -e "8.8.8.8\n1.1.1.1" | dnsfilter
8.8.8.8=dns.google
1.1.1.1=one.one.one.one
💡 说明:
dnsfilter并行处理大量反向查询,适合日志分析场景(如 Web 访问日志中的 IP 批量反查域名)。无 PTR 记录的 IP 输出ip=(等号后为空)。
7.7 random-ip
作用:生成指定数量的随机 IPv4 地址。
用法:
random-ip count
实测:
random-ip 3
119.131.171.165
81.100.217.90
58.241.167.13
💡 说明:
random-ip生成的是均匀分布的随机 IP,可用于生成测试数据或模拟客户端 IP。注意这些 IP 可能是公网地址,仅用于测试。
八、pickdns 系列
⚠️ 注意:pickdns 系列工具在 Ubuntu 的 djbdns 打包版中被移除(不在
tinydns/dnscache/djbdns-conf/djbdns-utils包中),但在官方源码 djbdns 1.05 中存在。以下实测基于从源码编译的二进制。
8.1 pickdns
作用:基于客户端 IP 返回轮询的 A 记录,实现简单的 DNS 负载均衡。
用法:pickdns 通过环境变量配置,从 data.cdb 读取记录:
pickdns # 需要 IP、ROOT 等环境变量
直接运行报错:
pickdns
pickdns: fatal: $IP not set
💡 说明:pickdns 与 tinydns 类似,通过
envdir读取环境变量。它在 tinydns 的基础上增加了「按客户端 IP 轮询返回不同 A 记录」的能力,适合简单的负载均衡场景。
8.2 pickdns-conf
作用:生成 pickdns 服务目录。
用法:
pickdns-conf acct logacct /pickdns myip
实测用法输出:
pickdns-conf
pickdns-conf: usage: pickdns-conf acct logacct /pickdns myip
8.3 pickdns-data
作用:编译 pickdns 的数据文件。
用法:在数据目录运行:
pickdns-data
无 data 文件时报错:
pickdns-data
pickdns-data: fatal: unable to open data: file does not exist
九、注意事项
dnsqvstinydns-get:dnsq通过网络查询真实服务器,tinydns-get直接读 data.cdb。调试 data 文件用tinydns-get更快;验证服务可用性用dnsq。dnsqvsdnsqr:dnsq直接查询指定服务器(不递归),dnsqr通过系统 resolver 递归查询。- 客户端工具依赖 resolver:
dnsip、dnsname、dnsmx、dnstxt、dnsipq都使用/etc/resolv.conf,需确保指向可用的 DNS 服务器。 - TXT 冒号转义:通过
tinydns-edit或直接编辑 data 文件添加 TXT 记录时,文本中的冒号必须用\072转义。 - pickdns 可用性:Ubuntu 打包版不含 pickdns,需从源码编译。生产环境如需 DNS 轮询,建议评估其他方案(如 tinydns 的多 A 记录随机返回已能满足多数场景)。
十、常见问题
10.1 dnsip 返回空行
原因:域名不存在或系统 resolver 不可用。
解决:检查 /etc/resolv.conf 是否配置了正确的 DNS 服务器;用 dig 或 dnsq 直接查询确认。
10.2 dnsq 查不到 PTR 记录
原因:反向域没有 NS 声明(. 行),tinydns 不响应。
解决:在 data 文件中为反向域添加 NS 记录,详见《djbdns 1.05 配置参数详解》第八章。
10.3 dnstrace 输出乱序
解决:用 dnstracesort 排序后阅读:
dnstrace a example.com 198.41.0.4 | dnstracesort
10.4 pickdns 命令不存在
原因:Ubuntu 打包版未包含 pickdns。
解决:从官方源码编译 djbdns 1.05,pickdns 会在编译产物中。详见《Ubuntu 22.04 安装 djbdns 1.05 指南》第五章。
十一、参考链接
- djbdns CLI 工具文档:https://cr.yp.to/djbdns/tools.html (查询日期 2026-10-25)
- dnsfilter 文档:https://cr.yp.to/djbdns/dnsfilter.html (查询日期 2026-10-25)
- DNS 调试工具文档:https://cr.yp.to/djbdns/debugging.html (查询日期 2026-10-25)
- tinydns-data 数据格式:https://cr.yp.to/djbdns/tinydns-data.html (查询日期 2026-10-25)