珍惜你身边自架DNS和邮件服务器的人吧,他们很可能互相都认识。 #晦涩难懂的码农段子
— 𝓧𝓲𝓷 𝓛𝓲 (@delphij) April 27, 2019
设计目标
- PowerDNS权威DNS
- PostgreSQL后端
- 双节点HA
- 管理面板
PostgreSQL服务器
安装过程不再赘述。
安装PowerDNS
以Debian 10为例:
1 2 3 4 5 |
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。
初始化数据库
创建数据库和用户:
1 2 3 4 |
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 |
为了避免权限问题,我们用刚创建的新用户来初始化表结构:
1 |
psql --host=your.postgresql.host --username=pdns --password -f /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql pdns |
配置PowerDNS
1 |
cp /usr/share/pdns-backend-pgsql/pdns.local.gpgsql.conf /etc/powerdns/pdns.d |
编辑配置文件,填入Postgres连接参数,然后重启PowerDNS:
1 |
systemctl restart pdns |
配置管理面板
随便找了个在维护而且看起来比较好看的PowerDNS-Admin。这个项目的安装比较脏所以我自己写了一个Docker镜像。
管理面板要求PowerDNS打开API功能。我们先配置PowerDNS:在/etc/powerdns/pdns.d/api.conf
写入
1 2 3 4 5 6 7 8 |
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服务:
1 |
systemctl restart pdns |
接下来我们来配置PowerDNS-Admin。
生成一个salt(需要安装bcrypt):
1 |
python3 -c "import bcrypt; print(bcrypt.gensalt().decode())" |
创建数据库表和用户:
1 2 3 |
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
:
1 2 3 4 5 |
SECRET_KEY=your-secret-key TIMEOUT=10 SALT=your-salt SQLALCHEMY_TRACK_MODIFICATIONS=True |
创建Systemd服务/etc/systemd/system/powerdns-admin.service
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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 |
启动服务:
1 |
systemctl enable --now powerdns-admin |
在PowerDNS-Admin面板中根据实际情况填写PowerDNS API信息。如果不在同一台机器上,建议HTTPS反代一下PowerDNS API(必须放在根目录下)。
DNSSEC
- 在面板启用DNSSEC
- 在域名注册商那里添加三条DS记录
- 在权威服务器上添加到自己的NS记录