设计目标
- 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:
配置管理面板
随便找了个在维护而且看起来比较好看的 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 服务:
接下来我们来配置 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:password@your.postgres.host: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
- 在面板启用 DNSSEC
- 在域名注册商那里添加三条 DS 记录
- 在权威服务器上添加到自己的 NS 记录