djbdns 1.05 配置参数详解

djbdns 1.05 配置参数详解:tinydns 环境变量(IP/ROOT)、tinydns-data 数据文件格式(A/NS/MX/PTR/CNAME/TXT/SOA/通用记录/通配符/客户端位置视图)、dnscache 环境变量与访问控制,每项均实测 data 修改→tinydns-data 重编→dig 验证回显。

djbdns域名服务网络DNS服务器2026/10/25

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

二、前置条件

三、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无(必填)根目录路径
IPSEND0.0.0.0发出查询时使用的源 IP
CACHESIZE1000000缓存大小(字节),约 1MB
DATALIMIT4000000进程数据段内存上限(字节)

查看:

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)。

九、参考链接