djbdns 1.05 配置参数详解
djbdns 1.05 配置参数详解:tinydns 环境变量(IP/ROOT)、tinydns-data 数据文件格式(A/NS/MX/PTR/CNAME/TXT/SOA/通用记录/通配符/客户端位置视图)、dnscache 环境变量与访问控制,每项均实测 data 修改→tinydns-data 重编→dig 验证回显。
djbdns 1.05 配置参数详解
目标:系统讲解 djbdns 1.05 的全部配置项,包括 tinydns 环境变量、tinydns-data 数据文件格式(A/NS/MX/PTR/CNAME/TXT/SOA 等记录语法)、dnscache 环境变量与访问控制。每个参数均通过「修改 data → tinydns-data 重编 → dig 验证回显」的实测闭环验证。本篇基于 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
- 数据目录:/etc/tinydns/root
- 测试域名:example.test
- 查询日期:2026-10-25
二、前置条件
- 已完成 djbdns 安装(参见《Ubuntu 22.04 安装 djbdns 1.05 指南》)
- tinydns 已启动并监听 10.0.0.1:53
- 具备修改
/etc/tinydns/root/data并执行make的权限
三、tinydns 环境变量
tinydns 通过 envdir 从服务目录的 env/ 子目录读取环境变量,每个变量是一个文件,文件名即变量名、文件内容即变量值。
3.1 IP
作用:指定 tinydns 监听的 IP 地址。
默认值:由 tinydns-conf 生成时指定,无默认值,必须设置。
查看:
cat /etc/tinydns/env/IP
10.0.0.1
修改与验证:
echo "10.0.0.2" > /etc/tinydns/env/IP
# 重启 tinydns 后生效
⚠️ 注意:修改 IP 后必须重启 tinydns 才能生效。确保新 IP 未被其他服务占用 53 端口。
3.2 ROOT
作用:指定数据目录路径,tinydns 从此目录读取 data.cdb。
默认值:由 tinydns-conf 生成,通常为 /etc/tinydns/root。
查看:
cat /etc/tinydns/env/ROOT
/etc/tinydns/root
修改与验证:
echo "/data/tinydns" > /etc/tinydns/env/ROOT
# 将 data 和 data.cdb 复制到新目录后重启 tinydns
3.3 完整环境变量清单
tinydns 只读取两个环境变量:
| 变量 | 必填 | 说明 |
|---|---|---|
| IP | 是 | 监听 IP 地址 |
| ROOT | 是 | 数据目录路径 |
💡 说明:tinydns 设计极简,没有其他可调参数。缓存大小、并发数等都没有配置项——tinydns 是单线程、按需应答,不需要这些参数。
四、tinydns-data 数据格式
tinydns-data 读取当前目录下的 data 文件,编译成 data.cdb。data 文件每行一条记录,以特殊字符开头表示记录类型,字段间用冒号分隔。
4.1 通用规则
- 每行格式:
<类型字符><域名>:<字段1>:<字段2>:...:<ttl>:<timestamp>:<lo> ttl(生存时间)可省略,tinydns-data 使用精心选择的默认值- 冒号是字段分隔符,文本中的冒号需用八进制转义
\072 - 空格和行尾制表符被忽略
- 空行被忽略
#开头的行是注释
4.2 NS + SOA 记录(. 行)
格式:.fqdn:ip:x:ttl:timestamp:lo
作用:声明 tinydns 对 fqdn 域有权威,生成 NS 记录(x.ns.fqdn)、A 记录(x.ns.fqdn → ip)和 SOA 记录。
参数:
| 字段 | 说明 |
|---|---|
| fqdn | 域名 |
| ip | 名称服务器的 IP 地址(x 不含点时生成 A 记录) |
| x | 名称服务器前缀,最终名为 x.ns.fqdn;若 x 含点则直接用作服务器名 |
| ttl | 缓存时间(秒),默认 259200(3 天) |
实测:
cd /etc/tinydns/root
echo ".example.test:10.0.0.1:a:259200" >> data
make
dig @10.0.0.1 example.test NS +short
a.ns.example.test.
dig @10.0.0.1 example.test SOA +short
a.ns.example.test. hostmaster.example.test. 16384 16384 2048 1048576 2560
4.3 A + PTR 记录(= 行,host)
格式:=fqdn:ip:ttl:timestamp:lo
作用:同时生成 A 记录(fqdn → ip)和 PTR 记录(ip 反向 → fqdn)。
实测:
echo "=ns1.example.test:10.0.0.1:86400" >> data
make
dig @10.0.0.1 ns1.example.test A +short
10.0.0.1
dig @10.0.0.1 -x 10.0.0.1 +short
ns1.example.test.
⚠️ 注意:
=行生成的 PTR 记录需要对应的反向域有 NS 记录(.行),否则 tinydns 不响应 PTR 查询。详见第八章常见问题。
4.4 A 记录(+ 行,alias)
格式:+fqdn:ip:ttl:timestamp:lo
作用:只生成 A 记录(fqdn → ip),不生成 PTR。
实测:
echo "+www.example.test:10.0.0.1:86400" >> data
make
dig @10.0.0.1 www.example.test A +short
10.0.0.1
dig @10.0.0.1 -x 10.0.0.1 +short
ns1.example.test.
💡 说明:
+行不生成 PTR,所以 10.0.0.1 的反向解析仍由=行(ns1.example.test)决定。同一 IP 可以有多条 A 记录,tinydns 会随机轮询返回。
4.5 MX 记录(@ 行)
格式:@fqdn:ip:x:dist:ttl:timestamp:lo
作用:生成 MX 记录(fqdn 的邮件交换机为 x.mx.fqdn,优先级 dist)和 A 记录(x.mx.fqdn → ip)。
参数:
| 字段 | 说明 |
|---|---|
| x | 邮件服务器前缀,最终名为 x.mx.fqdn |
| dist | 优先级(距离),数字越小优先级越高,默认 0 |
实测:
echo "@example.test:10.0.0.1:a:10:86400" >> data
make
dig @10.0.0.1 example.test MX +short
10 a.mx.example.test.
dig @10.0.0.1 a.mx.example.test A +short
10.0.0.1
4.6 CNAME 记录(C 行)
格式:Cfqdn:p:ttl:timestamp:lo
作用:生成 CNAME 记录,将 fqdn 指向 p。
实测:
echo "Cftp.example.test:www.example.test:3600" >> data
make
dig @10.0.0.1 ftp.example.test CNAME +short
www.example.test.
⚠️ 注意:CNAME 记录的域名不能有其他任何记录。不要对常用别名使用 CNAME,应直接用
+(A 记录)。
4.7 TXT 记录(' 行)
格式:'fqdn:s:ttl:timestamp:lo
作用:生成 TXT 记录,内容为字符串 s。
实测:
echo "'txt.example.test:v=spf1 include\072example.test ~all:3600" >> data
make
dig @10.0.0.1 txt.example.test TXT +short
"v=spf1 include:example.test ~all"
⚠️ 排障实录:TXT 文本中的冒号必须转义为
\072。直接写v=spf1 include:example.test会被 tinydns-data 截断为v=spf1 include,因为冒号被当作字段分隔符。实测错误写法的回显为"v=spf1 include",正确写法(转义后)回显为"v=spf1 include:example.test ~all"。
4.8 PTR 记录(^ 行)
格式:^fqdn:p:ttl:timestamp:lo
作用:生成 PTR 记录,将反向域名 fqdn 指向 p。
实测:
echo "^2.1.0.10.in-addr.arpa:ns2.example.test:86400" >> data
make
dig @10.0.0.1 2.1.0.10.in-addr.arpa PTR +short
ns2.example.test.
4.9 SOA 记录(Z 行)
格式:Zfqdn:mname:rname:ser:ref:ret:exp:min:ttl:timestamp:lo
作用:手动指定 SOA 记录参数。
参数:
| 字段 | 说明 | 默认值 |
|---|---|---|
| mname | 主名称服务器 | - |
| rname | 联系人邮箱(第一个 . 替换为 @) | - |
| ser | 序列号 | data 文件修改时间 |
| ref | 刷新时间(秒) | 16384 |
| ret | 重试时间(秒) | 2048 |
| exp | 过期时间(秒) | 1048576 |
| min | 最小 TTL(秒) | 2560 |
实测:
echo "Zexample.test:a.ns.example.test:admin.example.test::16384:2048:1048576:2560" >> data
make
dig @10.0.0.1 example.test SOA +short
4.10 通用记录(: 行)
格式::fqdn:n:rdata:ttl:timestamp:lo
作用:生成任意类型的 DNS 记录,n 为记录类型号(1-65535,不能是 2/5/6/12/15/252)。
示例(AAAA 记录,类型 28):
:ipv6.example.test:28:\040\001\015\002\000\000\000\000\000\000\000\000\000\000\000\001:86400
💡 说明:
:行用于支持 tinydns-data 不内置的记录类型。rdata 中的字节需用八进制转义。这是高级用法,普通场景很少用到。
4.11 子域委派 NS 记录(& 行)
格式:&fqdn:ip:x:ttl:timestamp:lo
作用:与 . 行类似,生成 NS 和 A 记录,但不生成 SOA。用于将子域委派给其他 DNS 服务器。
实测:
echo "&sub.example.test:10.0.0.2:ns1:259200" >> data
make
dig @10.0.0.1 sub.example.test NS +short
ns1.ns.sub.example.test.
4.12 通配符
tinydns 支持 *.fqdn 形式的通配符,匹配所有以 .fqdn 结尾且没有更具体记录的名称。
实测:
echo "+*.example.test:10.0.0.1:86400" >> data
make
dig @10.0.0.1 random.example.test A +short
10.0.0.1
dig @10.0.0.1 www.example.test A +short
10.0.0.1
💡 说明:通配符不匹配已有具体记录的名称。www.example.test 有具体 A 记录,所以返回的是具体记录而非通配符记录;random.example.test 没有具体记录,命中通配符。
4.13 客户端位置视图(% 行,1.04+)
通过 % 行定义客户端位置,按 IP 前缀返回不同答案:
%in:192.168
%ex
+server.example.test:192.168.1.10:::in
+server.example.test:10.0.0.1:::ex
内网客户端(192.168.x.x)查询 server.example.test 返回 192.168.1.10,其他客户端返回 10.0.0.1。
五、dnscache 配置参数
5.1 环境变量
dnscache 通过 env/ 目录读取环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
| IP | 无(必填) | 监听 IP 地址 |
| ROOT | 无(必填) | 根目录路径 |
| IPSEND | 0.0.0.0 | 发出查询时使用的源 IP |
| CACHESIZE | 1000000 | 缓存大小(字节),约 1MB |
| DATALIMIT | 4000000 | 进程数据段内存上限(字节) |
查看:
for f in /etc/dnscache/env/*; do echo "$(basename $f): $(cat $f)"; done
CACHESIZE: 1000000
DATALIMIT: 4000000
IP: 127.0.0.1
IPSEND: 0.0.0.0
ROOT: /etc/dnscache/root
5.2 根服务器配置
/etc/dnscache/root/servers/@ 文件包含 13 个根服务器 IP,dnscache 递归查询时从这些根服务器开始:
cat /etc/dnscache/root/servers/@
198.41.0.4
192.228.79.201
192.33.4.12
128.8.10.90
192.203.230.10
192.5.5.241
192.112.36.4
128.63.2.53
192.36.148.17
192.58.128.30
193.0.14.129
199.7.83.42
202.12.27.33
5.3 转发模式
如需将特定域名转发到上游 DNS,在 servers/ 目录下创建以域名命名的文件,内容为上游 DNS IP:
echo "8.8.8.8" > /etc/dnscache/root/servers/google.com
这样所有 *.google.com 的查询都会转发到 8.8.8.8 而非从根开始递归。
5.4 客户端访问控制
/etc/dnscache/root/ip/ 目录下的文件名是允许递归的客户端 IP 前缀,文件内容为空:
ls /etc/dnscache/root/ip/
10.0.0
127.0.0.1
# 允许 10.0.0.0/24 网段递归
touch /etc/dnscache/root/ip/10.0.0
# 允许 192.168.1.0/24 网段递归
touch /etc/dnscache/root/ip/192.168.1
修改后无需重启 dnscache,立即生效。
5.5 缓存大小调整
修改 CACHESIZE 环境变量后重启 dnscache:
echo "10000000" > /etc/dnscache/env/CACHESIZE
# 重启 dnscache 生效
💡 说明:CACHESIZE 是 dnscache 用于缓存的内存上限(字节)。默认 1MB 适合小型场景;高并发场景可调到 10MB 或更大。缓存采用 LRU 淘汰策略。
六、辅助脚本
tinydns-conf 生成的 root/ 目录下包含若干辅助脚本,用于快速添加记录:
| 脚本 | 等价 data 行 | 说明 |
|---|---|---|
add-host fqdn ip | =fqdn:ip:86400 | 添加主机(A+PTR) |
add-alias fqdn ip | +fqdn:ip:86400 | 添加别名(A) |
add-ns fqdn ip | .fqdn:ip:a:259200 | 添加 NS+SOA |
add-mx fqdn ip dist | @fqdn:ip:a:dist:86400 | 添加 MX |
add-childns fqdn ip | &fqdn:ip:a:259200 | 添加子域委派 NS |
实测 add-host:
cd /etc/tinydns/root
./add-host db.example.test 10.0.0.5
make
dig @10.0.0.1 db.example.test A +short
10.0.0.5
dig @10.0.0.1 -x 10.0.0.5 +short
db.example.test.
七、生产配置模板
适用于「1 台服务器托管 1 个主域 + 几个子域 + 内网递归缓存」的典型场景:
# /etc/tinydns/root/data
# 名称服务器(权威)
.example.test:10.0.0.1:a:259200
.example.test:10.0.0.2:b:259200
# 反向域
.0.0.10.in-addr.arpa:10.0.0.1:a:259200
# 主域名服务器 A 记录
=ns1.example.test:10.0.0.1:86400
=ns2.example.test:10.0.0.2:86400
# Web 服务器
+www.example.test:10.0.0.1:86400
+www.example.test:10.0.0.2:86400
# 邮件服务器
@example.test:10.0.0.1:mail:10:86400
=mail.example.test:10.0.0.1:86400
# SPF 记录
'example.test:v=spf1 mx -all:3600
# CNAME
Cftp.example.test:www.example.test:3600
💡 说明:此模板适用于 2 核 2GB 内存、单网卡的服务器。tinydns 内存占用 < 1MB,dnscache 默认 1MB 缓存,整体资源消耗极低。如需更大递归缓存,将 dnscache 的 CACHESIZE 调到 10000000(10MB)。
八、常见问题
8.1 PTR 查询无响应
现象:A 记录正常,但 dig -x 反向查询超时或无响应。
原因:= 行生成的 PTR 记录需要反向域有 NS 声明(. 行),否则 tinydns 不认为自己对该反向域有权威。
解决:为反向域添加 NS 记录:
.0.0.10.in-addr.arpa:10.0.0.1:a:259200
8.2 TXT 记录内容被截断
原因:TXT 文本中的冒号被当作字段分隔符。
解决:冒号转义为 \072。
8.3 修改 data 后查询结果未变
原因:忘记执行 make(即 tinydns-data)重新编译 data.cdb。
解决:每次修改 data 后必须 make,tinydns 会自动重新 mmap 新的 data.cdb。
cd /etc/tinydns/root && make
8.4 tinydns 不响应递归查询
现象:dig 查询返回 WARNING: recursion requested but not available。
原因:tinydns 是纯权威服务器,不提供递归。这是正常行为。
解决:递归查询请使用 dnscache(监听 127.0.0.1:53)。
九、参考链接
- tinydns-data 数据格式官方文档:https://cr.yp.to/djbdns/tinydns-data.html (查询日期 2026-10-25)
- tinydns 程序文档:https://cr.yp.to/djbdns/tinydns.html (查询日期 2026-10-25)
- dnscache 程序文档:https://cr.yp.to/djbdns/dnscache.html (查询日期 2026-10-25)
- dnscache-conf 文档:https://cr.yp.to/djbdns/dnscache-conf.html (查询日期 2026-10-25)