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域名服务网络DNS服务器2026/10/25

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(负载均衡)

三、前置条件

四、服务端程序

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查询域名
serverDNS 服务器 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

九、注意事项

  1. dnsq vs tinydns-get:dnsq 通过网络查询真实服务器,tinydns-get 直接读 data.cdb。调试 data 文件用 tinydns-get 更快;验证服务可用性用 dnsq。
  2. dnsq vs dnsqr:dnsq 直接查询指定服务器(不递归),dnsqr 通过系统 resolver 递归查询。
  3. 客户端工具依赖 resolver:dnsip、dnsname、dnsmx、dnstxt、dnsipq 都使用 /etc/resolv.conf,需确保指向可用的 DNS 服务器。
  4. TXT 冒号转义:通过 tinydns-edit 或直接编辑 data 文件添加 TXT 记录时,文本中的冒号必须用 \072 转义。
  5. 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 指南》第五章。

十一、参考链接