PowerDNS 5.1.4 配置参数详解

PowerDNS Authoritative 5.1.4 全部 170 个配置参数体系:三种查看方式与生效规则、8 大类核心参数逐项解读(默认值取自实机 config=print)、两档生产配置模板与配置漂移核查。

PowerDNSDNS 服务2026/10/20

PowerDNS 5.1.4 配置参数详解

目标:系统梳理 PowerDNS Authoritative Server 5.1.4 的配置参数体系——参数的查看与修改方式、170 个参数的分类总览、8 大类核心参数的逐项解读(默认值均取自实机 pdns_server --config=print 输出),并给出两档生产配置模板。全部默认值与验证命令在 Ubuntu 22.04.4 LTS 真实服务器实测通过(实测日期 2026-10-20)。

一、环境信息

  • 操作系统:Ubuntu 22.04.4 LTS(x86_64),systemd 249
  • PowerDNS Authoritative Server:5.1.4-1pdns.ubuntu22.04(官方 APT 源 jammy-auth-51)
  • 数据库后端:gsqlite3(pdns-backend-sqlite3 5.1.4,SQLite3 CLI 3.37.2)
  • 配置文件:/etc/powerdns/pdns.conf(819 行注释模板),后端片段目录 /etc/powerdns/pdns.d/
  • 参数总量:pdns_server --config=print 输出 1177 行,覆盖 170 个配置参数
  • 本机监听:127.0.0.2:53(与既有 DNS 服务共存,见 5.1 节 local-address)

二、前置条件

已按《Ubuntu 22.04 安装 PowerDNS 5.1.4 指南》完成服务端安装,或具备等价环境。本篇所有查看类命令可独立执行,先确认服务在运行:

systemctl is-active pdns && pdns_control rping

实测回显:

active
PONG

若服务未安装,本篇 5.x 节的默认值可通过 pdns_server --config=print 在任何装好包的机器上独立复现(该命令不需要服务在运行)。

三、参数查看与修改方式

3.1 查看参数:三种方式

方式一:查看完整默认配置(无需服务运行)。pdns_server --config=print 按参数名字母序打印全部参数;与当前运行值不同的参数以未注释的激活行呈现,其余以 # 参数名=默认值 注释行呈现:

pdns_server --config=print | grep -E "^(# )?(cache-ttl|local-port|distributor-threads)="

实测回显:

# cache-ttl=20
# local-port=53
# distributor-threads=3

方式二:查看运行中服务的生效配置。pdns_control current-config 输出当前运行配置;加 diff 只显示与编译默认值不同的项(排障时最常用):

pdns_control current-config diff

实测回显:

# Autogenerated configuration file based on running instance (2026-10-20 16:39:21 +0800)

disable-syslog=
domain-metadata-cache-ttl=60
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
gsqlite3-dnssec=yes
include-dir=/etc/powerdns/pdns.d
launch=gsqlite3
local-address=127.0.0.2
log-timestamp=no
server-id=ops
write-pid=no

其中 disable-syslog=、log-timestamp=no、write-pid=no 三项来自 systemd 单元的命令行参数(ExecStart 中的 --disable-syslog --log-timestamp=no --write-pid=no),并非 pdns.conf 所设——命令行参数优先级高于配置文件。

方式三:查单个参数注释与取值范围。包内模板 /etc/powerdns/pdns.conf 对每个参数都有两行注释说明(参数名 + 简述,随后是默认值行),例如:

grep -B3 "^# local-address=" /etc/powerdns/pdns.conf

实测回显:

#################################
# local-address Local IP addresses to which we bind
#
# local-address=0.0.0.0, ::

3.2 修改参数与生效规则

三条硬规则(均实测验证):

  1. 编辑配置文件后必须重启服务才生效:sudo systemctl restart pdns。运行时 pdns_control set 只对极少数参数可用,实测对 loglevel、local-port 均拒绝:
pdns_control set loglevel 6

实测回显:

This setting cannot be changed at runtime, or no such setting
  1. 同一参数多次出现时最后一行生效。模板中 launch= 有一行空激活值,直接在文件末尾追加 launch=gsqlite3(或用 sed 替换原行)均可,实测两种写法等效——本文部署指南采用 sed 替换原行。

  2. 命令行参数 > pdns.conf > 编译默认值。systemd 单元通过 ExecStart 注入的 --guardian=no --daemon=no 等参数始终覆盖配置文件同名项。

配置语法校验(改完先校验再重启,避免服务起不来):

sudo pdns_server --config=check 2>&1 | tail -1

实测回显(仅有模块加载行、无报错即通过):

Oct 20 16:39:52 Loading '/usr/lib/x86_64-linux-gnu/pdns/libgsqlite3backend.so'

四、参数总览

5.1.4 共 170 个参数(pdns_server --config=print 实测统计),按用途分布如下:

分类代表参数数量级
监听与网络local-address、local-port、udp-truncation-threshold~15
后端与数据库launch、gsqlite3-database、load-modules~15(含 gsqlite3-* SQL 定制)
日志loglevel、log-dns-queries、logging-structured~8
缓存与性能cache-ttl、query-cache-ttl、receiver-threads~18
主从与区域传输primary、secondary、allow-axfr-ips、only-notify~20
DNSSECdefault-ksk-algorithm、max-nsec3-iterations~15
Web 与 APIwebserver、api、webserver-port~10
安全与运行时setuid、chroot、version-string、daemon~15
其余(LUA 记录、Catalog/Views、统计上报等)enable-lua-records、default-catalog-zone、carbon-server剩余

💡 说明:相对 4.5.x,5.1.4 新增约 46 个参数,重点包括 views(按来源网段提供不同区域视图)、default-catalog-zone(Catalog Zones 默认成员目录)、edns-cookie-secret(DNS Cookie)、proxy-protocol-from(PROXY 协议透传真实客户端地址)、webserver-hash-plaintext-credentials(Web 凭据哈希存储)等。升级版本后建议先用 3.1 节方式二 diff 一遍新旧配置。

五、核心参数分类详解

以下默认值全部取自 5.1.4 实机 pdns_server --config=print 输出,可直接用同命令复核。

5.1 监听与网络参数

参数默认值说明
local-address0.0.0.0, ::DNS/UDP+TCP 监听地址,可逗号分隔多个;53 端口被占用时改绑其他地址(如 127.0.0.2)即可与既有服务共存(实测有效)
local-port53监听端口,一般不改
local-address-nonexist-failyes绑定地址在本机不存在时拒绝启动,防止拼写错误静默失败
reuseportno启用 SO_REUSEPORT,多 receiver 线程各自持套接字,高并发场景开启
non-local-bindno允许绑定本机不存在的 IP(FREEBIND),VRRP 漂移地址场景使用
udp-truncation-threshold1232UDP 应答截断阈值(字节),1232 是 DNS Flag Day 推荐值,一般不动
any-to-tcpyes对 ANY 查询回 TC 标志引导走 TCP,防放大攻击
tcp-fast-open0TCP Fast Open 队列长度,0 为关闭
tcp-idle-timeout5TCP 连接空闲超时(秒)
max-tcp-connections20并发 TCP 连接上限;大量 zone transfer 时调大
max-tcp-connections-per-client0单客户端并发 TCP 上限,0 不限
max-tcp-connection-duration0单条 TCP 连接最长寿命(秒),0 不限
tcp-control-address/port/secret空 / 53000 / 空远程 TCP 控制通道,仅分布部署 pdns_control 时使用
query-local-address0.0.0.0 ::服务器对外发起查询(ALIAS 解析、secpoll 等)的源地址

实测要点:local-address 绑定 127.0.0.2 后,启动日志出现 UDP server bound to 127.0.0.2:53 / TCP server bound to 127.0.0.2:53(回显见部署篇 7.3 节)。

5.2 后端与数据库参数(gsqlite3)

参数默认值说明
launch空启动哪些后端及查询顺序(如 gsqlite3、gmysql,gsqlite3);为空则无后端、服务空转
load-modules空额外加载的模块路径,动态后端通常由 launch 自动定位
module-dir/usr/lib/x86_64-linux-gnu/pdns后端动态库目录
config-dir/etc/powerdns主配置目录
include-dir空(Debian 包默认 /etc/powerdns/pdns.d)片段配置目录,*.conf 全部并入主配置
gsqlite3-database空SQLite3 数据库文件绝对路径(必填项)
gsqlite3-dnssecno启用 DNSSEC(读写 cryptokeys 等表);生产签名区域必须开
gsqlite3-pragma-foreign-keysnoSQLite 外键约束开关
gsqlite3-pragma-journal-modeWAL日志模式,WAL 支持读写并发;要求 pdns 用户对数据库所在目录有写权限(排障实录见部署篇 FAQ)
gsqlite3-pragma-synchronous空SQLite synchronous 桩设置
gsqlite3-*query*(insert-record-query 等)空内置 SQL 语句模板,可整体替换实现定制(如分库分表)
consistent-backendsyes假定区域不跨后端分布,ANY 查询只发给一个后端,减少无效查询

启动后验证后端连通的实测手段:/var/lib/powerdns/ 下出现 pdns.sqlite3-shm 与 pdns.sqlite3-wal 伴生文件,且 pdns_control rping 返回 PONG。

5.3 日志参数

参数默认值说明
loglevel4日志详细度(2 极简~9 调试),排障临时调 6,禁止低于 3
log-dns-queriesno记录每条入站查询;高流量下慎开
log-dns-detailsno记录非错误的 DNS 细节(如区域传输动态)
log-timestampyes日志行时间戳;systemd 形态下单元已注入 --log-timestamp=no 由 journald 统一打时间
disable-syslogno禁用 syslog 直写(systemd 形态注入为空值,日志走 stdout→journald)
logging-facility空syslog facility
logging-structuredno结构化(JSON)日志输出

实测排障路径:journalctl -u pdns -n 50 --no-pager,生产排障建议临时 loglevel=6 + log-dns-queries=yes,定位后改回。

5.4 缓存与性能参数

参数默认值说明
cache-ttl20PacketCache(整包缓存)保留秒数;区域变更频繁时调小
query-cache-ttl20QueryCache(后端查询结果缓存)保留秒数
negquery-cache-ttl60负结果缓存秒数
max-cache-entries1000000查询缓存条目上限
max-packet-cache-entries1000000包缓存条目上限
dnssec-key-cache-ttl30DNSSEC 密钥缓存秒数(影响新密钥发布可见延迟)
domain-metadata-cache-ttl空区域元数据缓存秒数(实测本机运行值 60)
zone-cache-refresh-interval300已知区域列表刷新周期(秒)
distributor-threads3后端查询分发线程数(每后端),SQL 后端按 CPU 核调整
receiver-threads1接收线程数;配合 reuseport=yes 提升多核吞吐
signing-threads3在线签名线程数
max-queue-length5000查询队列上限,超过视为过载
overload-queue-length0超过后新查询只查包缓存,0 关闭
queue-limit1500查询在队列中的最大排队毫秒数

💡 技术拓展:PowerDNS 的缓存分两层——PacketCache 以「问题+应答」整包为单位(cache-ttl),命中后完全绕过后端;QueryCache 只缓存后端记录查询结果(query-cache-ttl)。同类 DNS 服务器中,BIND9 用 max-cache-size 管理递归缓存,Knot DNS 有独立的 answer cache——三者口径不同,横向对比时注意换算。PowerDNS 权威场景实际采用双缓存分层,理由是区域变更(pdns_control purge)可精确失效。

缓存命中率用 pdns_control show packetcache-hit / show query-cache-hit 实测观察(命令详见 CLI 篇)。

5.5 主从(primary/secondary)与区域传输参数

💡 说明:4.4 起官方把 master/slave 术语更名为 primary/secondary,旧参数 master=、slave=、superslave= 仍作为别名兼容(模板中仍可见),新配置一律用新名。

参数默认值说明
primaryno作为主服务器(响应 AXFR/NOTIFY),旧名 master
secondaryno作为从服务器(接收区域副本),旧名 slave
autosecondaryno自动接受主服务器通知创建从区域(旧名 superslave)
allow-axfr-ips127.0.0.0/8,::1允许 AXFR 的来源网段;primary=yes 时必改,如 10.0.0.0/8
disable-axfrno完全禁用区域传输
only-notify0.0.0.0/0,::/0NOTIFY 只发给这些网段
also-notify空额外 NOTIFY 目标
allow-notify-from0.0.0.0/0,::/0接受 NOTIFY 的来源
secondary-do-renotifyno从服务器收到 AXFR 后向下级再通知
retrieval-threads2AXFR 拉取线程数
xfr-cycle-interval60主从 SOA 新鲜度巡检周期(秒)
axfr-fetch-timeout10入站 AXFR 启动/空闲超时(秒)
xfr-max-received-mbytes100单次入站传输最大 MB,防失控
allow-unsigned-autoprimaryyes允许未签名 autoprimary 建区
delay-notifications0启动后延迟发送 NOTIFY 的秒数

实测要点:仅做单一权威(本指南默认形态)时保持 primary=no、secondary=no,且务必把 allow-axfr-ips 收紧——AXFR 会吐出全区域记录。

5.6 DNSSEC 参数

参数默认值说明
default-ksk-algorithmecdsa256KSK 默认算法(pdnsutil zone secure 未指定时)
default-ksk-size0KSK 密钥位数,0=算法默认(ECDSA 曲线固定)
default-zsk-algorithm空ZSK 默认算法,空=5.x 默认对未签名区域只建 CSK
default-zsk-size0ZSK 位数,0=算法默认
default-publish-cdnskey / default-publish-cds空CDNSKEY/CDS 记录发布策略(空=不发布)
default-api-rectifyyesAPI 修改记录后自动 rectify(维护 NSEC 排序与附加链)
max-nsec3-iterations100NSEC3 哈希迭代上限(RFC 9276 建议趋零)
dnssec-key-cache-ttl30密钥缓存秒数

实测佐证:pdnsutil zone secure example.com 未显式给算法时,实际生成 CSK (257) algo=13 (ECDSAP256SHA256),与 default-ksk-algorithm=ecdsa256 一致;dig @127.0.0.2 example.com DNSKEY 能拿到 257 3 13 记录(完整回显见 CLI 篇)。

5.7 Web 监控与 REST API 参数

参数默认值说明
webserverno开启内置 HTTP 服务(监控页)
webserver-address127.0.0.1HTTP 监听地址
webserver-port8081HTTP 监听端口
webserver-password空监控页 Basic Auth 口令(示例测试口令 q1w2e3r4)
webserver-allow-from127.0.0.1,::1HTTP 访问来源白名单,开放内网需追加网段
webserver-loglevelnormalHTTP 日志量(none/normal/detailed)
webserver-max-bodysize2请求体上限(MB)
webserver-max-concurrent-connections100HTTP 并发连接上限
webserver-hash-plaintext-credentialsno是否要求明文凭据以哈希形式配置(5.1 新增)
apino开启 REST API(依赖同一 HTTP 端口)
api-key空API 密钥,请求头 X-API-Key(示例测试值 q1w2e3r4)

实测佐证:按部署篇 7.4 节开启后,curl -u admin:q1w2e3r4 http://127.0.0.2:8081/ 返回监控页 HTML,curl -H "X-API-Key: q1w2e3r4" .../api/v1/servers/localhost 返回版本 5.1.4 的 JSON,无密钥访问返回 401。开启 webserver-hash-plaintext-credentials=yes 后,明文口令需改用 pdnsutil hash-password 生成的 scrypt 串。

5.8 安全与运行时参数

参数默认值说明
daemonno自守护进程化;systemd 形态必须保持 no(单元已注入)
guardiannoguardian 监督模式;systemd 形态保持 no(影响 pdns_control ping/cycle 可用性)
setuid / setgid空降权运行身份;systemd 形态由单元 User=pdns/Group=pdns 负责
chroot空chroot 目录;与 include-dir、socket-dir 联动,非必要不启
socket-dir空(默认 /var/run/pdns)控制套接字目录;systemd 用 RuntimeDirectory=pdns 管理
version-stringfullCHAOS version.bind 应答内容(full/anonymous/powerdns/自定义);对外暴露版本,生产建议 anonymous
server-id空(默认取主机名)id.server/NSID 应答
security-poll-suffixsecpoll.powerdns.com.安全状态轮询后缀(保持默认可及时获知 CVE 预警)
rng空(自动选择)随机源(auto/sodium/openssl/getrandom/urandom)
entropy-source空额外熵源文件(4.x 默认 /dev/urandom,5.x 改为空=系统自动)
traceback-handleryes崩溃时生成调用栈,排障保留开启
max-ent-entries100000空非终结符上限(防区域膨胀)
dname-processingno启用 DNAME 记录处理
edns-subnet-processingno启用 EDNS Client Subnet(配合 views/geo 后端)
dnsupdatenoRFC 2136 动态更新;开启必须同步收紧 allow-dnsupdate-from(默认 127.0.0.0/8,::1)
version 相关:upgrade-unknown-typesno透明升级 TYPExxx 旧记录

六、生产配置模板

模板一:小型内网权威 DNS(2 vCPU / 4GB 内存 / 普通云盘,几十个区域、百 QPS 以内,gsqlite3)

# /etc/powerdns/pdns.conf —— 追加到模板末尾即可,同名参数以最后一行为准
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
gsqlite3-dnssec=yes

local-address=192.0.2.53
local-port=53
loglevel=4
log-dns-queries=no
cache-ttl=60
query-cache-ttl=60
negquery-cache-ttl=60

webserver=yes
webserver-address=127.0.0.2
webserver-port=8081
webserver-password=q1w2e3r4
api=yes
api-key=q1w2e3r4
webserver-allow-from=127.0.0.0/8,192.168.146.0/24

version-string=anonymous
allow-axfr-ips=127.0.0.0/8,::1

适用说明:单机权威、无主从。缓存放宽到 60 秒降低 SQLite 读压力;version-string=anonymous 隐藏版本;AXFR 只留本机。改动后 sudo pdns_server --config=check 校验再 systemctl restart pdns,用 pdns_control current-config diff 复核生效值。

模板二:高并发对外权威(8 vCPU / 16GB 内存 / NVMe SSD,数百区域、万级 QPS,gmysql 后端)

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-password=q1w2e3r4
gmysql-dbname=pdns
gmysql-dnssec=yes

receiver-threads=4
reuseport=yes
distributor-threads=8
cache-ttl=30
query-cache-ttl=30
max-tcp-connections=100
udp-truncation-threshold=1232

primary=yes
allow-axfr-ips=192.0.2.0/24
xfr-max-received-mbytes=100

api=yes
webserver=yes
webserver-address=127.0.0.2
webserver-port=8081
api-key=q1w2e3r4
version-string=powerdns

适用说明:receiver-threads=4 + reuseport=yes 让四个线程各自持有 53 端口套接字分散软中断;SQL 后端换 gmysql 承载高并发写(区域更新/签名);primary=yes 开放主从时 allow-axfr-ips 必须收窄到从服务器网段。

七、常见问题

Q1:改了 pdns.conf 不生效?

三个原因逐一排查:(1) 未 systemctl restart pdns;(2) 同参数在文件中出现多次,生效的是最后一行,用 grep -n '^launch' /etc/powerdns/pdns.conf 检查是否残留旧行;(3) 被 systemd 单元 ExecStart 注入的命令行参数覆盖(如 --guardian=no),用 pdns_control current-config diff 看真实生效值。

Q2:pdns_control set 报 This setting cannot be changed at runtime?

正常现象。绝大多数参数不支持运行时热更(实测 loglevel、local-port 均拒绝),改配置文件后重启服务是标准做法。

Q3:local-address 改绑后启动报 Unable to bind UDP socket to '...': Address already in use?

目标地址的 53 端口仍被占用,用 ss -ltnp | grep ":53 " 找占用方;换一个空闲地址或停用对方服务。完整排障实录见《Ubuntu 22.04 安装 PowerDNS 5.1.4 指南》第八章。

Q4:gsqlite3 报 attempt to write a readonly database?

WAL 模式要求 pdns 用户对数据库文件及其所在目录均有写权限:chown pdns:pdns /var/lib/powerdns /var/lib/powerdns/pdns.sqlite3 后重启(实录见部署篇 FAQ Q2)。

Q5:如何确认线上到底跑的哪套配置?

pdns_control current-config diff

实测回显见 3.1 节方式二——该输出只含非默认项,是配置漂移核查的第一入口。

八、参考链接