PowerDNS 5.1.4 配置参数详解
PowerDNS Authoritative 5.1.4 全部 170 个配置参数体系:三种查看方式与生效规则、8 大类核心参数逐项解读(默认值取自实机 config=print)、两档生产配置模板与配置漂移核查。
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 修改参数与生效规则
三条硬规则(均实测验证):
- 编辑配置文件后必须重启服务才生效:
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
-
同一参数多次出现时最后一行生效。模板中
launch=有一行空激活值,直接在文件末尾追加launch=gsqlite3(或用 sed 替换原行)均可,实测两种写法等效——本文部署指南采用 sed 替换原行。 -
命令行参数 > 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 |
| DNSSEC | default-ksk-algorithm、max-nsec3-iterations | ~15 |
| Web 与 API | webserver、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-address | 0.0.0.0, :: | DNS/UDP+TCP 监听地址,可逗号分隔多个;53 端口被占用时改绑其他地址(如 127.0.0.2)即可与既有服务共存(实测有效) |
local-port | 53 | 监听端口,一般不改 |
local-address-nonexist-fail | yes | 绑定地址在本机不存在时拒绝启动,防止拼写错误静默失败 |
reuseport | no | 启用 SO_REUSEPORT,多 receiver 线程各自持套接字,高并发场景开启 |
non-local-bind | no | 允许绑定本机不存在的 IP(FREEBIND),VRRP 漂移地址场景使用 |
udp-truncation-threshold | 1232 | UDP 应答截断阈值(字节),1232 是 DNS Flag Day 推荐值,一般不动 |
any-to-tcp | yes | 对 ANY 查询回 TC 标志引导走 TCP,防放大攻击 |
tcp-fast-open | 0 | TCP Fast Open 队列长度,0 为关闭 |
tcp-idle-timeout | 5 | TCP 连接空闲超时(秒) |
max-tcp-connections | 20 | 并发 TCP 连接上限;大量 zone transfer 时调大 |
max-tcp-connections-per-client | 0 | 单客户端并发 TCP 上限,0 不限 |
max-tcp-connection-duration | 0 | 单条 TCP 连接最长寿命(秒),0 不限 |
tcp-control-address/port/secret | 空 / 53000 / 空 | 远程 TCP 控制通道,仅分布部署 pdns_control 时使用 |
query-local-address | 0.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-dnssec | no | 启用 DNSSEC(读写 cryptokeys 等表);生产签名区域必须开 |
gsqlite3-pragma-foreign-keys | no | SQLite 外键约束开关 |
gsqlite3-pragma-journal-mode | WAL | 日志模式,WAL 支持读写并发;要求 pdns 用户对数据库所在目录有写权限(排障实录见部署篇 FAQ) |
gsqlite3-pragma-synchronous | 空 | SQLite synchronous 桩设置 |
gsqlite3-*query*(insert-record-query 等) | 空 | 内置 SQL 语句模板,可整体替换实现定制(如分库分表) |
consistent-backends | yes | 假定区域不跨后端分布,ANY 查询只发给一个后端,减少无效查询 |
启动后验证后端连通的实测手段:/var/lib/powerdns/ 下出现 pdns.sqlite3-shm 与 pdns.sqlite3-wal 伴生文件,且 pdns_control rping 返回 PONG。
5.3 日志参数
| 参数 | 默认值 | 说明 |
|---|---|---|
loglevel | 4 | 日志详细度(2 极简~9 调试),排障临时调 6,禁止低于 3 |
log-dns-queries | no | 记录每条入站查询;高流量下慎开 |
log-dns-details | no | 记录非错误的 DNS 细节(如区域传输动态) |
log-timestamp | yes | 日志行时间戳;systemd 形态下单元已注入 --log-timestamp=no 由 journald 统一打时间 |
disable-syslog | no | 禁用 syslog 直写(systemd 形态注入为空值,日志走 stdout→journald) |
logging-facility | 空 | syslog facility |
logging-structured | no | 结构化(JSON)日志输出 |
实测排障路径:journalctl -u pdns -n 50 --no-pager,生产排障建议临时 loglevel=6 + log-dns-queries=yes,定位后改回。
5.4 缓存与性能参数
| 参数 | 默认值 | 说明 |
|---|---|---|
cache-ttl | 20 | PacketCache(整包缓存)保留秒数;区域变更频繁时调小 |
query-cache-ttl | 20 | QueryCache(后端查询结果缓存)保留秒数 |
negquery-cache-ttl | 60 | 负结果缓存秒数 |
max-cache-entries | 1000000 | 查询缓存条目上限 |
max-packet-cache-entries | 1000000 | 包缓存条目上限 |
dnssec-key-cache-ttl | 30 | DNSSEC 密钥缓存秒数(影响新密钥发布可见延迟) |
domain-metadata-cache-ttl | 空 | 区域元数据缓存秒数(实测本机运行值 60) |
zone-cache-refresh-interval | 300 | 已知区域列表刷新周期(秒) |
distributor-threads | 3 | 后端查询分发线程数(每后端),SQL 后端按 CPU 核调整 |
receiver-threads | 1 | 接收线程数;配合 reuseport=yes 提升多核吞吐 |
signing-threads | 3 | 在线签名线程数 |
max-queue-length | 5000 | 查询队列上限,超过视为过载 |
overload-queue-length | 0 | 超过后新查询只查包缓存,0 关闭 |
queue-limit | 1500 | 查询在队列中的最大排队毫秒数 |
💡 技术拓展: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=仍作为别名兼容(模板中仍可见),新配置一律用新名。
| 参数 | 默认值 | 说明 |
|---|---|---|
primary | no | 作为主服务器(响应 AXFR/NOTIFY),旧名 master |
secondary | no | 作为从服务器(接收区域副本),旧名 slave |
autosecondary | no | 自动接受主服务器通知创建从区域(旧名 superslave) |
allow-axfr-ips | 127.0.0.0/8,::1 | 允许 AXFR 的来源网段;primary=yes 时必改,如 10.0.0.0/8 |
disable-axfr | no | 完全禁用区域传输 |
only-notify | 0.0.0.0/0,::/0 | NOTIFY 只发给这些网段 |
also-notify | 空 | 额外 NOTIFY 目标 |
allow-notify-from | 0.0.0.0/0,::/0 | 接受 NOTIFY 的来源 |
secondary-do-renotify | no | 从服务器收到 AXFR 后向下级再通知 |
retrieval-threads | 2 | AXFR 拉取线程数 |
xfr-cycle-interval | 60 | 主从 SOA 新鲜度巡检周期(秒) |
axfr-fetch-timeout | 10 | 入站 AXFR 启动/空闲超时(秒) |
xfr-max-received-mbytes | 100 | 单次入站传输最大 MB,防失控 |
allow-unsigned-autoprimary | yes | 允许未签名 autoprimary 建区 |
delay-notifications | 0 | 启动后延迟发送 NOTIFY 的秒数 |
实测要点:仅做单一权威(本指南默认形态)时保持 primary=no、secondary=no,且务必把 allow-axfr-ips 收紧——AXFR 会吐出全区域记录。
5.6 DNSSEC 参数
| 参数 | 默认值 | 说明 |
|---|---|---|
default-ksk-algorithm | ecdsa256 | KSK 默认算法(pdnsutil zone secure 未指定时) |
default-ksk-size | 0 | KSK 密钥位数,0=算法默认(ECDSA 曲线固定) |
default-zsk-algorithm | 空 | ZSK 默认算法,空=5.x 默认对未签名区域只建 CSK |
default-zsk-size | 0 | ZSK 位数,0=算法默认 |
default-publish-cdnskey / default-publish-cds | 空 | CDNSKEY/CDS 记录发布策略(空=不发布) |
default-api-rectify | yes | API 修改记录后自动 rectify(维护 NSEC 排序与附加链) |
max-nsec3-iterations | 100 | NSEC3 哈希迭代上限(RFC 9276 建议趋零) |
dnssec-key-cache-ttl | 30 | 密钥缓存秒数 |
实测佐证: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 参数
| 参数 | 默认值 | 说明 |
|---|---|---|
webserver | no | 开启内置 HTTP 服务(监控页) |
webserver-address | 127.0.0.1 | HTTP 监听地址 |
webserver-port | 8081 | HTTP 监听端口 |
webserver-password | 空 | 监控页 Basic Auth 口令(示例测试口令 q1w2e3r4) |
webserver-allow-from | 127.0.0.1,::1 | HTTP 访问来源白名单,开放内网需追加网段 |
webserver-loglevel | normal | HTTP 日志量(none/normal/detailed) |
webserver-max-bodysize | 2 | 请求体上限(MB) |
webserver-max-concurrent-connections | 100 | HTTP 并发连接上限 |
webserver-hash-plaintext-credentials | no | 是否要求明文凭据以哈希形式配置(5.1 新增) |
api | no | 开启 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 安全与运行时参数
| 参数 | 默认值 | 说明 |
|---|---|---|
daemon | no | 自守护进程化;systemd 形态必须保持 no(单元已注入) |
guardian | no | guardian 监督模式;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-string | full | CHAOS version.bind 应答内容(full/anonymous/powerdns/自定义);对外暴露版本,生产建议 anonymous |
server-id | 空(默认取主机名) | id.server/NSID 应答 |
security-poll-suffix | secpoll.powerdns.com. | 安全状态轮询后缀(保持默认可及时获知 CVE 预警) |
rng | 空(自动选择) | 随机源(auto/sodium/openssl/getrandom/urandom) |
entropy-source | 空 | 额外熵源文件(4.x 默认 /dev/urandom,5.x 改为空=系统自动) |
traceback-handler | yes | 崩溃时生成调用栈,排障保留开启 |
max-ent-entries | 100000 | 空非终结符上限(防区域膨胀) |
dname-processing | no | 启用 DNAME 记录处理 |
edns-subnet-processing | no | 启用 EDNS Client Subnet(配合 views/geo 后端) |
dnsupdate | no | RFC 2136 动态更新;开启必须同步收紧 allow-dnsupdate-from(默认 127.0.0.0/8,::1) |
version 相关:upgrade-unknown-types | no | 透明升级 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 节方式二——该输出只含非默认项,是配置漂移核查的第一入口。
八、参考链接
- 官方参数文档(settings 列表):https://doc.powerdns.com/authoritative/settings.html
- gsqlite3 后端参数:https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html
- 主从与 AXFR 官方指南:https://doc.powerdns.com/authoritative/modes-of-operation.html
- DNSSEC 操作指南:https://doc.powerdns.com/authoritative/dnssec/index.html
- HTTP API/监控页说明:https://doc.powerdns.com/authoritative/http-api/README.html
- 同系列文档:《Ubuntu 22.04 安装 PowerDNS 5.1.4 指南》(安装与排障实录)、《PowerDNS 5.1.4 常用 CLI 命令与工具详解》(pdns_control/pdnsutil 实测)、《PowerDNS 5.1.4 介绍与选型指南》(架构与同类对比)