跳转至内容

PowerDNS

来自 ArchWiki

PowerDNS 是一个用 C++ 编写并采用 GPL 许可的 DNS 服务器。PowerDNS 支持大量不同的后端,范围从简单的 BIND 风格区域文件到关系型数据库以及负载均衡/故障转移算法。

安装

安装 powerdns 软件包。

接下来,您可以查看位于 /etc/powerdns/pdns.conf 的配置文件。

后端

要配置 PowerDNS 使用特定的后端,您需要在配置文件中设置 launch 选项。此外,根据您使用的具体后端,您还需要对其进行相应配置。

对于 PostgreSQLMySQLSQLite,您可以在 /usr/share/doc/powerdns 找到数据库表创建的 SQL 文件。

PostgreSQL 后端

首先,您需要创建用户和数据库供 PowerDNS 存储数据,然后导入模式 (schema)

$ psql -U <user> -d <database name> -a -f /usr/share/doc/powerdns/schema.pgsql.sql

最后,更新配置文件以使用该后端

/etc/powerdns/pdns.conf
launch=gpgsql
gpgsql-host=/run/postgresql # if PostgreSQL is listening to unix socket
# gpgsql-host=127.0.0.1
# gpgsql-port=5432
gpgsql-dbname=<database name>
gpgsql-user=<user to use>
gpgsql-password=
# Uncomment for dnssec support
#gpgsql-dnssec=yes

MySQL 后端

安装并运行 MySQL 服务器。创建一个新用户和一个新数据库,并将模式导入到数据库中

$ mysql -u root -p pdns < /usr/share/doc/powerdns/schema.mysql.sql

然后,配置 Powerdns 使用 MySQL

/etc/powerdns/pdns.conf
launch=gmysql
gmysql-host=127.0.0.1
gmysql-socket=/run/mysqld/mysqld.sock
gmysql-user=pdns
gmysql-password=Pa$$w0rd
gmysql-dbname=pdns
# Uncomment for dnssec support
#gmysql-dnssec=yes

您也可以使用 localhost 代替 127.0.0.1,但这会导致 PowerDNS 使用套接字文件。由于 PowerDNS 默认在 chroot 环境中运行,因此无法访问套接字文件。

SQLite 后端

配置 Powerdns 使用 sqlite

/etc/powerdns/pdns.conf
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
# Uncomment for dnssec support
#gsqlite3-dnssec=yes

创建数据库

# mkdir /var/lib/powerdns
# sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/doc/powerdns/schema.sqlite3.sql
# chown -R powerdns:powerdns /var/lib/powerdns

启动

启动/启用 pdns.service

区域管理

PowerDNS 附带了 pdnsutil(1) 工具,用于轻松管理托管区域。

创建一个新的空区域

[powerdns]$ pdnsutil create-zone example.net

编辑区域

[powerdns]$ pdnsutil edit-zone example.net
注意 必须设置 EDITOR 环境变量 才能以此方式编辑区域。
警告 编辑区域时,所有名称必须使用全限定形式,且末尾不带点(例如 www.example.net)。

保存并退出编辑器后,系统将要求您确认提交更改。请仔细阅读显示的 diff 差异,仅在确定更改正确时才按下 a。如果您保持 SOA 记录不变,系统还会询问是否增加序列号。在大多数情况下,您可以直接回答 y 来增加该号码。

当您不再希望提供该区域的服务时,可以将其从后端删除

[powerdns]$ pdnsutil delete-zone example.net

DNSSEC

PowerDNS 提供了易于使用的设施,可以用极低的管理开销来提供 DNSSEC 签名的区域服务。它利用了在线签名架构,在收到来自互联网的查询时按需生成签名。

在大多数情况下,将现有的不安全区域转换为 DNSSEC 签名区域非常简单,只需:

[powerdns]$ pdnsutil secure-zone example.net

这将使用单个 (CSK) ECDSA 256 位(算法 13)密钥和 NSEC 否定存在证明对区域进行签名。

为了在密钥生成方面获得更大的灵活性,可以使用 pdnsutil add-zone-key 命令。例如,生成传统的 KSK/ZSK 分离的 ECDSA 256 位密钥:

[powerdns]$ pdnsutil add-zone-key example.net ksk active published ecdsa256
[powerdns]$ pdnsutil add-zone-key example.net zsk active published ecdsa256
[powerdns]$ pdnsutil increase-serial example.net

查看 DS 记录(以及其他区域信息)

[powerdns]$ pdnsutil show-zone example.dns

将 DS 提交给父区域(例如,通过填写注册商的网页表单)。

注意主/从设置中,DNSSEC 签名区域在从服务器上作为预签名区域提供。这可以减轻从服务器的 CPU 负载,因为这些区域的签名在区域传输期间已在主服务器(可设置为隐藏主服务器)上以在线签名模式生成。
警告 PowerDNS 目前没有自动密钥管理功能。如果您想更换密钥,请参阅上游指南(KSK 轮转ZSK 轮转以及算法轮转),以避免导致您的区域失效的陷阱。

技巧与提示

绑定地址和/或端口

默认的 /etc/powerdns/pdns.conf 绑定到 0.0.0.0:53(所有 IP 地址)。这将与任何其他绑定到 53 端口的进程冲突,例如 systemd-resolved 使用 127.0.0.53:53。这将导致错误:

Unable to bind UDP socket to '0.0.0.0:53': Address already in use

这可以通过多种方式解决,例如更改 local-addresslocal-port 选项(或两者都改)

/etc/powerdns/pdns.conf
local-address=127.0.0.1:54

通过 AXFR 进行区域复制(主/从设置)

默认情况下,PowerDNS 中的区域是原生 (native) 的,这意味着区域复制由后端处理。这仅对 MySQL 和 PostgreSQL 后端有意义,因为它们具有数据库复制功能。

您也可以将 PowerDNS 配置为经典的主/从设置。首先,在 /etc/powerdns/pdns.conf 中启用相应的模式。

在主服务器上

/etc/powerdns/pdns.conf
primary=yes
allow-axfr-ips=10.20.30.50/32

在从服务器上

/etc/powerdns/pdns.conf
secondary=yes
allow-notify-from=10.20.30.40/32

其中 10.20.30.4010.20.30.50 分别是主服务器和从服务器的 IP 地址。

重启 pdns.service

在主服务器上将区域类型设置为 primary zone

[powerdns]$ pdnsutil set-kind example.net primary

在从服务器上创建 secondary zone,并指定从中获取数据的主服务器 IP 地址

[powerdns]$ pdnsutil create-secondary-zone example.net 10.20.30.40

区域将在一段时间后完成传输。

TSIG 认证

您还可以使用 TSIG 密钥对区域传输进行认证。

在主服务器上,生成 hmac-sha256 密钥

[powerdns]$ pdnsutil generate-tsig-key example hmac-sha256
Create new TSIG key example <secret>

为原区域的传出传输启用该密钥

[powerdns]$ pdnsutil activate-tsig-key example.net example primary

在从服务器上,导入该密钥

[powerdns]$ pdnsutil import-tsig-key example hmac-sha256 '<secret>'

为从区域的传输请求启用该密钥

[powerdns]$ pdnsutil activate-tsig-key example.net example secondary

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.