PowerDNS
PowerDNS 是一个用 C++ 编写并采用 GPL 许可的 DNS 服务器。PowerDNS 支持大量不同的后端,范围从简单的 BIND 风格区域文件到关系型数据库以及负载均衡/故障转移算法。
安装
接下来,您可以查看位于 /etc/powerdns/pdns.conf 的配置文件。
后端
要配置 PowerDNS 使用特定的后端,您需要在配置文件中设置 launch 选项。此外,根据您使用的具体后端,您还需要对其进行相应配置。
对于 PostgreSQL、MySQL 和 SQLite,您可以在 /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 提交给父区域(例如,通过填写注册商的网页表单)。
技巧与提示
绑定地址和/或端口
默认的 /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-address 或 local-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.40 和 10.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