--- 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 即可: ![Riven Cloud 后台 Private Nameservers 注册 NS 的界面](https://s.bh.sb/uploads/2022/02/10/qQHex3OzdXnSiJo.png) 然后在 `Nameservers` (DNS 服务器) 添加 `ns1.example.com` 和 `ns2.example.com` 即可。 ![Nameservers 设置中填入 ns1 和 ns2 的界面](https://s.bh.sb/uploads/2022/02/10/WQd1k7OrcACDnN3.png) ## 安装 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 <