使用PowerDNS自建权威DNS服务器

设计目标

  • PowerDNS权威DNS
  • PostgreSQL后端
  • 双节点HA
  • 管理面板

PostgreSQL服务器

安装过程不再赘述。

安装PowerDNS

以Debian 10为例:

curl https://repo.powerdns.com/FD380FBB-pub.asc | apt-key add -
echo "deb [arch=amd64] http://repo.powerdns.com/debian buster-auth-42 main" | tee /etc/apt/sources.list.d/pdns.list
echo -e "Package: pdns-*\nPin: origin repo.powerdns.com\nPin-Priority: 600" | tee /etc/apt/preferences.d/pdns
apt-get update
apt-get install pdns-server pdns-backend-pgsql

其它系统参见PowerDNS repositories

初始化数据库

创建数据库和用户:

apt install postgresql-client-11
createdb --host=your.postgresql.host --username=postgres --password pdns
createuser --host=your.postgresql.host --username=postgres --password --pwprompt pdns
psql --host=your.postgresql.host --username=postgres --password -c "GRANT ALL PRIVILEGES ON DATABASE pdns TO pdns;" pdns

为了避免权限问题,我们用刚创建的新用户来初始化表结构:

psql --host=your.postgresql.host --username=pdns --password -f /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql pdns

配置PowerDNS

cp /usr/share/pdns-backend-pgsql/pdns.local.gpgsql.conf /etc/powerdns/pdns.d

编辑配置文件,填入Postgres连接参数,然后重启PowerDNS:

systemctl restart pdns

配置管理面板

随便找了个在维护而且看起来比较好看的PowerDNS-Admin。这个项目的安装比较脏所以我自己写了一个Docker镜像

管理面板要求PowerDNS打开API功能。我们先配置PowerDNS:在/etc/powerdns/pdns.d/api.conf写入

webserver=yes
webserver-address=0.0.0.0
# Docker LAN
webserver-allow-from=127.0.0.1,::1,172.17.0.0/24
webserver-password=some-strong-password
webserver-port=8081
api=yes
api-key=some-strong-api-key

然后重启PowerDNS服务:

systemctl restart pdns

接下来我们来配置PowerDNS-Admin。

生成一个salt(需要安装bcrypt):

python3 -c "import bcrypt; print(bcrypt.gensalt().decode())"

创建数据库表和用户:

createdb --host=your.postgresql.host --username=postgres --password pdnsadmin
createuser --host=your.postgresql.host --username=postgres --password --pwprompt pdnsadmin
psql --host=your.postgresql.host --username=postgres --password -c "GRANT ALL PRIVILEGES ON DATABASE pdnsadmin TO pdnsadmin;" pdnsadmin

创建配置文件/etc/default/powerdns-admin

SECRET_KEY=your-secret-key
TIMEOUT=10
SALT=your-salt
SQLALCHEMY_TRACK_MODIFICATIONS=True
SQLALCHEMY_DATABASE_URI=postgres://pdnsadmin:[email protected]:5432/pdnsadmin

创建Systemd服务/etc/systemd/system/powerdns-admin.service

[Unit]
Description=PowerDNS Admin
Requires=docker.service

[Service]
ExecStartPre=-/usr/bin/docker pull jamesits/powerdns-admin:latest
ExecStart=/usr/bin/docker run --rm --name=pdnsadmin -p 127.0.0.1:9191:80 --env-file /etc/default/powerdns-admin jamesits/powerdns-admin:latest
ExecStop=/usr/bin/docker stop pdnsadmin
ExecReload=/usr/bin/docker restart pdnsadmin
TimeoutStartSec=5min

[Install]
WantedBy=multi-user.target

启动服务:

systemctl enable --now powerdns-admin

在PowerDNS-Admin面板中根据实际情况填写PowerDNS API信息。如果不在同一台机器上,建议HTTPS反代一下PowerDNS API(必须放在根目录下)。

DNSSEC

  1. 在面板启用DNSSEC
  2. 在域名注册商那里添加三条DS记录
  3. 在权威服务器上添加到自己的NS记录

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据