---
title: "Debian / Ubuntu 安装 PowerDNS 和 PowerDNS-Admin 自建权威 DNS 教程"
tags: ['Debian', 'Ubuntu', 'Docker', 'Docker Compose', 'PowerDNS', 'PowerDNS-Admin']
published: 2022-02-11 01:52:00
updated: 2024-04-04 00:00:00
excerpt: "本文将指导如何在 Debian 和 Ubuntu 下安装 PowerDNS 以及 PowerDNS-Admin,本教程略复杂,学习者需要有一定的 Linux 运维经验以及熟读本站之前的教程。"
---
> 本文件是烧饼博客文章的 Markdown 原文,正式版本见 https://u.sb/debian-install-powerdns/
> 全站文章与页面索引见 https://u.sb/llms.txt,建议先读索引再继续抓取。
本文将指导如何在 Debian 和 Ubuntu 下安装 PowerDNS 以及 PowerDNS-Admin,本教程略复杂,学习者需要有一定的 Linux 运维经验以及熟读本站之前的教程。
以下操作需要 root 权限,本文命令均已带上 `sudo` 前缀,请确保当前用户拥有 `sudo` 权限;或者直接使用 root 用户操作并省略命令中的 `sudo`。
本文的教程同时适用于 [Debian Stable](https://www.debian.org/releases/stable/) 以及 [Ubuntu LTS](https://releases.ubuntu.com/)。
## 什么是权威 DNS?
DNS 分为两种类型,一种是权威 DNS (Authoritative DNS),一种是递归 DNS (Recursive DNS),权威 DNS 提供 DNS 的解析记录,递归 DNS 提供解析 DNS 记录的功能,是不是有点拗口?
通俗来讲,权威 DNS 就是负责储存你的 DNS 解析记录,然后提供给递归 DNS 进行解析操作,举个例子,典型的权威 DNS 即为类似 Cloudflare 的域名解析服务,比如可能分配给你的 `bob.ns.cloudflare.com`,典型的递归 DNS 即为 Cloudflare 的公共 DNS 服务 `1.1.1.1`,你的域名的 DNS 记录储存在 `bob.ns.cloudflare.com` 这台服务器上,而你本地的电脑通过 `1.1.1.1` 来解析你的域名。
*本文要介绍的是权威 DNS,递归 DNS 在国内没有相关资质和备案是无法在公网自建的。*
## 为什么使用 PowerDNS?
按照我们多年的维护经验,[PowerDNS](https://doc.powerdns.com/authoritative/) 比 [Bind 9](https://www.isc.org/bind/) 维护起来更方便,且原生[支持](https://doc.powerdns.com/authoritative/backends/)各种数据库方便储存 DNS 记录,而 Bind 9 目前还是仅支持文本储存,其他储存需要安装第三方插件。
## 准备工作
首先,我们默认你已经拥有
1. 一个或者两个域名
2. 至少两台不同网络的 VPS 服务器
本文教程举例的域名和对应的 A/AAAA 解析记录如下:
| 域名 | IPv4 | IPv6 |
| --------------- | ------------- | ------------- |
| `example.com` | 203.0.113.2 | 2001:db8::2 |
| `example.org` | 233.252.0.2 | 2001:db8:3 |
| `ns1.example.com` | 192.0.2.53 | 2001:db8::53 |
| `ns2.example.com` | 198.51.100.53 | 2001:db8::153 |
这里我们假设你已经拥有 `example.com` 这个域名以及 `192.0.2.53` 和 `192.0.2.153` 这两台 VPS 服务器,分别对应 `ns1.example.com` 和 `ns2.example.com`,那么我们需要分两种情况
1、你需要 `example.com` 也使用 `ns1.example.com` 和 `ns2.example.com` 的 DNS 服务:
请前往你的域名注册商,添加 NS 记录,也称为 Glue 胶水记录,分别对应
- `ns1.example.com` - `192.0.2.53` 和 `2001:db8::53`
- `ns2.example.com` - `198.51.100.53` 和 `2001:db8::153`
然后修改 `example.com` 的 NS 记录为 `ns1.example.com` 和 `ns2.example.com`,这样就完成了域名的 NS 记录的更新。
2、你不需要 `example.com` 使用 `ns1.example.com` 和 `ns2.example.com` 的 DNS 服务,仅仅需要 `example.org` 使用这个 DNS 服务:
前往你的 DNS 服务商,添加 A/AAA 记录,分别对应
- `ns1.example.com` - `192.0.2.53` 和 `2001:db8::53`
- `ns2.example.com` - `198.51.100.53` 和 `2001:db8::153`
此时所有的 `ns1.example.com` 和 `ns2.example.com` 的请求会经过你的 DNS 服务商,请务必保证你的 DNS 服务商比较稳定,如果不稳定,就会导致所有的域名 DNS 都无法解析
本文以第一种情况为例,假设你要使用的域名 `example.com` 也同时会使用 `ns1.example.com` 和 `ns2.example.com` 的 DNS 服务,每个服务商的后台 UI 可能不一样,我们以 [Riven Cloud](https://sa.net/) 为例,注册完域名以后在域名管理页面里找到 `Private Nameservers` (私人 DNS 服务器) 然后注册 NS 即可:

然后在 `Nameservers` (DNS 服务器) 添加 `ns1.example.com` 和 `ns2.example.com` 即可。

## 安装 PowerDNS + Mariadb
首先使用 `root` 进入 `ns1.example.com`,更新系统
```bash
sudo apt update
sudo apt upgrade -y
```
然后我们添加 PowerDNS 的官方源,添加 PowerDNS 的 GPG 公钥后增加 apt 源文件:
```bash
curl -sSL https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /usr/share/keyrings/powerdns.gpg
sudo bash -c 'cat > /etc/apt/sources.list.d/pdns.list << EOF
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/debian $(lsb_release -sc)-auth-50 main
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/debian $(lsb_release -sc)-rec-53 main
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/debian $(lsb_release -sc)-dnsdist-20 main
EOF'
```
```bash
curl -sSL https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /usr/share/keyrings/powerdns.gpg
sudo bash -c 'cat > /etc/apt/sources.list.d/pdns.list << EOF
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/ubuntu $(lsb_release -sc)-auth-50 main
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/ubuntu $(lsb_release -sc)-rec-53 main
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/powerdns.gpg] http://repo.powerdns.com/ubuntu $(lsb_release -sc)-dnsdist-20 main
EOF'
```
您也可以修改使用 `repo.powerdns.com` 官方源优先安装 Powerdns 软件:
```bash
sudo bash -c 'cat >> /etc/apt/preferences.d/pdns << EOF
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF'
```
然后安装 Mariadb,可以参考本站教程[《Debian 使用源安装 LEMP 教程》](/debian-install-nginx-php-mysql/#4、安装-mariadb-t5):
下载并导入 GPG Key:
```bash
curl -sSL https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY | sudo gpg --dearmor -o /usr/share/keyrings/mariadb.gpg
```
然后添加 MariaDB 的源:
```bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/mariadb.gpg] https://dlm.mariadb.com/repo/mariadb-server/11.8/repo/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/mariadb.list
```
```bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/mariadb.gpg] https://dlm.mariadb.com/repo/mariadb-server/11.8/repo/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/mariadb.list
```
然后我们就可以更新系统并安装 PowerDNS + Powerdns MySQL Backend + Mariadb:
```bash
sudo apt update
sudo apt install pdns-server pdns-backend-mysql mariadb-server
```
然后我们重复 `ns1.example.com` 的操作,安装完成 `ns2.example.com` 服务器,这里不再赘述。
## 配置 MySQL 主从同步
我们使用 `ns1.example.com` 作为 Master,`ns2.example.com` 作为 Slave,则需要配置 MySQL 主从同步:
首先,在 `ns1.example.com` 上执行以下命令:
建立文件夹,方便以后保存 Bin 日志:
```bash
sudo mkdir /var/lib/mysql-bin
sudo chown mysql:mysql /var/lib/mysql-bin
```
添加 MariaDB 配置文件,让 MySQL 监听在所有的 IP:
```bash
sudo bash -c 'cat > /etc/mysql/mariadb.conf.d/61-master.cnf < /etc/nftables.conf < /etc/mysql/mariadb.conf.d/61-slave.cnf < /etc/nftables.conf <> /etc/powerdns/pdns.d/dns.conf << EOF
launch=gmysql
gmysql-host=localhost
gmysql-user=pdns_user
gmysql-dbname=pdns_database
gmysql-password=pdns_password
gmysql-dnssec=yes
default-soa-content=ns1.example.com hostmaster.example.com 0 3600 14400 604800 3600
api=yes
api-key=random_api_key
local-address=0.0.0.0 ::
local-port=53
webserver-address=0.0.0.0
webserver-allow-from=127.0.0.1, ::1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
webserver-port=8081
EOF'
```
注意几个地方
```bash
gmysql-host=localhost
gmysql-user=pdns_user
gmysql-dbname=pdns_database
gmysql-password=pdns_password
gmysql-dnssec=yes
```
这几个 `gmysql` 开头的参数即 MySQL 数据库连接信息,以及开启 DNSSEC
```bash
default-soa-content=ns1.example.com hostmaster.example.com 0 3600 14400 604800 3600
```
这是添加的域名的默认 SOA 记录
`ns1.example.com` 为默认 DNS 服务器域名,`hostmaster.example.com` 为默认 DNS 管理员邮箱 `hostmaster@example.com`,在 SOA 记录里,需要替换 `@` 为英文点号
第一个 `0` 为 Serial,没有特殊需求可以从 `0` 开始
后面四个数字分别对应 `Refresh`,`Retry`,`Expire` 和 `Minimum TTL`,单位都是秒,没有特殊需求建议设置 `300` 以上
```bash
api=yes
api-key=random_api_key
local-address=0.0.0.0 ::
local-port=53
webserver-address=0.0.0.0
webserver-allow-from=127.0.0.1, ::1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
webserver-port=8081
```
这段配置则是我们开启了 API 和内置 API Web 服务器,请替换 `random_api_key` 为你需要的 API Key,随机字符即可,默认我们设置了 Web 服务器监听在所有 IP 并且只能内网 IP 访问,可以按照需求自行更改。
```bash
local-address=0.0.0.0 ::
local-port=53
```
这段配置表示你的权威 DNS 服务监听在本机所有 IPv4 和 IPv6 地址,并且使用默认的 `53` 端口。
然后我们重启 PowerDNS 服务
```bash
sudo systemctl restart pdns
```
没有报错即配置成功。
然后我们进入 Slave 机器,即 `ns2.example.com` 按照同样的配置操作一次。
至此,PowerDNS + MySQL 主从已经配置完毕,但是添加域名解析等记录需要直接操作 MySQL 数据库,略显麻烦,此时我们的神奇 PowerDNS-Admin 登场
## 安装并使用 PowerDNS-Admin
[PowerDNS-Admin](https://github.com/PowerDNS-Admin/PowerDNS-Admin) 是一款 Python 写的 PowerDNS Web 管理软件,我们需要准备一台单独的机器,测试的时候您也可以直接装在 `ns1` 或 `ns2` 上 (不建议) 甚至装在本地电脑上。
首先,我们需要安装 Docker 和 Docker Compose,具体方法请参考[《Debian 安装 Docker 以及 Docker Compose 教程》](/debian-install-docker/)
安装完毕后,我们在 `/opt` 目录新建一个 `docker-compose.yaml`
```bash
sudo bash -c 'cat > /opt/docker-compose.yaml <