本教程适用于以下操作系统版本

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 20.04 (Focal Fossa)

本页内容

  • 先决条件
  • 安装并配置 MariaDB 服务器
  • 安装 PowerDNS
  • 配置 PowerDNS
  • 安装 PowerDNS-Admin 安装所需的依赖项
  • 下载 PowerDNS-Admin 配置数据库连接 启用 PowerDNS-Admin API
  • 将 Nginx 配置为 PowerDNS-Admin 的反向代理
  • 为 PowerDNS-Admin 创建 Systemd 服务文件
  • 访问 PowerDNS-Admin
  • 结论
  • 安装所需的依赖项
  • 配置数据库连接
  • 启用 PowerDNS-Admin API

PowerDNS 是一个使用 C++ 编写的自由开源权威域名服务器。它是跨平台的,可以在 Unix、Linux 和 macOS 操作系统上运行。它支持 MySQL、MariaDB、PostgreSQL 和 Oracle 等多种数据库来存储区域文件和记录。

PowerDNS-Admin 是一个基于 Web 的应用程序,可用于通过 Web 浏览器管理 PowerDNS。它允许你使用 PowerDNS Web 界面创建和管理 DNS 区域。它提供了非常实用的功能,包括 IPv4 和 IPv6 支持、批量域名、DNSSec 支持、AD、LDAP、SAML 身份验证等。

在本文中,我们将介绍如何在 Ubuntu 22.04 服务器上安装 PowerDNS 和 PowerDNS-Admin。

先决条件

  • 一台运行 Ubuntu 22.04 的服务器。
  • 一个指向你服务器 IP 的有效域名。
  • 服务器上已配置 root 密码。

安装并配置 MariaDB 服务器

首先,你需要在系统上安装 MariaDB 数据库服务器。

apt-get install mariadb-server -y

MariaDB 安装完成后,你需要为 PowerDNS 创建一个数据库和用户。

首先,使用以下命令登录 MariaDB:

mysql

登录后,使用以下命令创建数据库和用户:

MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';

接下来,使用以下命令刷新权限并退出 MariaDB shell:

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;

安装 PowerDNS

在开始之前,你需要从系统中禁用 systemd-resolved 服务。可以使用以下命令将其禁用:

systemctl disable --now systemd-resolved

接下来,删除默认的 resolv.conf 文件并创建一个新文件:

rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf

接下来,使用以下命令安装 PowerDNS 服务器:

apt-get install pdns-server pdns-backend-mysql -y

PowerDNS 安装完成后,你可以继续下一步。

配置 PowerDNS

首先,使用以下命令将 PowerDNS 数据库架构导入到 PowerDNS 数据库:

mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

接下来,你需要创建 PowerDNS 配置文件并定义 PowerDNS 数据库连接信息:

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

添加以下行:

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdnsadmin
gmysql-password=password
gmysql-dnssec=yes
# gmysql-socket=

保存并关闭文件,然后为文件 pdns.local.gmysql.conf 设置正确的权限:

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

接下来,使用以下命令停止 PowerDNS 服务器并测试 PowerDNS:

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

如果一切正常,你将看到以下输出:

Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 Done launching threads, ready to distribute questions

接下来,使用以下命令启动 PowerDNS 服务器:

systemctl start pdns

你现在可以使用以下命令检查 PowerDNS 的状态:

systemctl status pdns

你应该看到以下输出:

? pdns.service - PowerDNS Authoritative Server
     Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:37:28 UTC; 8s ago
       Docs: man:pdns_server(1)
             man:pdns_control(1)
             https://doc.powerdns.com
   Main PID: 93982 (pdns_server)
      Tasks: 8 (limit: 2242)
     Memory: 43.1M
        CPU: 166ms
     CGroup: /system.slice/pdns.service
             ??93982 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no

Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: UDP server bound to [::]:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to 0.0.0.0:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to [::]:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS Authoritative Server 4.5.3 (C) 2001-2021 PowerDNS.COM BV
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Using 64-bits mode. Built using gcc 11.2.0.
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redi>
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Creating backend connection for TCP
Aug 06 10:37:28 ubuntu2204 systemd[1]: Started PowerDNS Authoritative Server.
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: About to create 3 backend threads for UDP
Aug 06 10:37:29 ubuntu2204 pdns_server[93982]: Done launching threads, ready to distribute questions

此时,PowerDNS 已启动并在 53 端口监听。你可以使用以下命令进行检查:

ss -alnp4 | grep pdns

你应该获得以下输出:

udp   UNCONN 0      0             0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=5))
tcp   LISTEN 0      128           0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=7))

安装 PowerDNS-Admin

在本节中,我们将向你展示如何配合 Nginx 安装 PowerDNS-Admin。

安装所需的依赖项

首先,使用以下命令安装 PowerDNS-Admin 所需的所有依赖项:

apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask 
libpq-dev
 -y

所有依赖项安装完成后,使用以下命令添加 Node.js 仓库:

curl -sL https://deb.nodesource.com/setup_16.x | bash -

接下来,使用以下命令安装 Node.js:

apt-get install nodejs -y

接下来,使用以下命令添加 yarn 仓库:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

接下来,使用以下命令更新仓库并安装 Yarn:

apt-get update -y
apt-get install yarn -y

此时,所有必需的依赖项均已安装,你可以继续下一步。

下载 PowerDNS-Admin

接下来,从 Git 仓库下载最新版本的 PowerDNS-Admin 到 Nginx 根目录:

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

接下来,切换到下载的目录并使用以下命令创建 Python 虚拟环境:

cd /var/www/html/pdns/
virtualenv -p python3 flask

接下来,激活虚拟环境并使用以下命令安装所有 Python 依赖项:

source ./flask/bin/activate
pip install -r requirements.txt

接下来,使用以下命令退出虚拟环境:

deactivate

配置数据库连接

接下来,你需要将 PowerDNS 数据库连接信息定义到 default_config.py 文件:

nano /var/www/html/pdns/powerdnsadmin/default_config.py

修改以下行:

SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False

SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

保存并关闭文件,然后切换到 pdns 目录并激活虚拟环境:

cd /var/www/html/pdns/
source ./flask/bin/activate

接下来,使用以下命令更新数据库:

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build

接下来,使用以下命令退出虚拟环境:

deactivate

启用 PowerDNS-Admin API

PowerDNS-Admin 使用 JSON API 来读取统计信息并修改区域内容、元数据和 DNSSEC 密钥材料。你可以通过编辑 pdns.conf 文件来启用它:

nano /etc/powerdns/pdns.conf

修改以下行:

api=yes
api-key=yoursecretekey

保存并关闭文件,然后重启 PowerDNS 服务以应用更改:

systemctl restart pdns

将 Nginx 配置为 PowerDNS-Admin 的反向代理

接下来,你需要将 Nginx 配置为 PowerDNS-Admin 的反向代理。为此,使用以下命令创建一个 Nginx 虚拟主机配置文件:

nano /etc/nginx/conf.d/pdns-admin.conf

添加以下行:

server {
  listen	*:80;
  server_name               pdnsadmin.example.com;

  index                     index.html index.htm index.php;
  root                      /var/www/html/pdns;
  access_log                /var/log/nginx/pdnsadmin_access.log combined;
  error_log                 /var/log/nginx/pdnsadmin_error.log;

  client_max_body_size              10m;
  client_body_buffer_size           128k;
  proxy_redirect                    off;
  proxy_connect_timeout             90;
  proxy_send_timeout                90;
  proxy_read_timeout                90;
  proxy_buffers                     32 4k;
  proxy_buffer_size                 8k;
  proxy_set_header                  Host $host;
  proxy_set_header                  X-Real-IP $remote_addr;
  proxy_set_header                  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_headers_hash_bucket_size    64;

  location ~ ^/static/  {
    include  /etc/nginx/mime.types;
    root /var/www/html/pdns/powerdnsadmin;

    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires 365d;
    }

    location ~* ^.+.(css|js)$ {
      expires 7d;
    }
  }

  location / {
    proxy_pass            http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }

}

保存并关闭文件,然后使用以下命令检查 Nginx 是否存在语法错误:

nginx -t

你应该获得以下输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

接下来,将 pdns 的所有权更改为 www-data:

chown -R www-data:www-data /var/www/html/pdns

最后,重启 Nginx 服务以应用更改:

systemctl restart nginx

为 PowerDNS-Admin 创建 Systemd 服务文件

接下来,你需要创建一个 systemd 服务文件来管理 PowerDNS 服务。

首先,使用以下命令创建一个 pdns 服务文件:

nano /etc/systemd/system/pdnsadmin.service

添加以下行:

[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target

[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

保存并关闭文件,然后使用以下命令创建一个 pdnsadmin 套接字文件:

nano /etc/systemd/system/pdnsadmin.socket

添加以下行:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target

保存并关闭文件,然后使用以下命令创建所需的文件和目录:

echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/

接下来,使用以下命令重新加载 systemd 守护进程:

systemctl daemon-reload

接下来,使用以下命令启用 pdnsadmin 服务以便在系统重启时自动启动:

systemctl enable --now pdnsadmin.service pdnsadmin.socket

接下来,使用以下命令检查两个服务的状态:

systemctl status pdnsadmin.service pdnsadmin.socket

你应该获得以下输出:

? pdnsadmin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:52:44 UTC; 9s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 98696 (gunicorn)
      Tasks: 2 (limit: 2242)
     Memory: 63.1M
        CPU: 913ms
     CGroup: /system.slice/pdnsadmin.service
             ??98696 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>
             ??98697 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>

Aug 06 10:52:44 ubuntu2204 systemd[1]: Started PowerDNS-Admin.
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Starting gunicorn 20.0.4
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Listening at: unix:/run/pdnsadmin/socket (98696)
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Using worker: sync
Aug 06 10:52:44 ubuntu2204 gunicorn[98697]: [2022-08-06 10:52:44 +0000] [98697] [INFO] Booting worker with pid: 98697

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:52:44 UTC; 9s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Aug 06 10:52:44 ubuntu2204 systemd[1]: Listening on PowerDNS-Admin socket.

访问 PowerDNS-Admin

你现在可以打开 Web 浏览器,使用 URL http://pdnsadmin.example.com 访问 PowerDNS-Admin Web 界面。你将被重定向到以下页面:

如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin

点击 Create an account(创建账户)按钮。你应该看到以下界面:

如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin

填写你的管理员用户详细信息,然后点击 Register(注册)按钮创建账户。你应该在以下界面中看到 PowerDNS-Admin Web 界面:

如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin

填写 PowerDNS API URL 以连接到 PowerDNS 并进行管理。然后,点击 Update(更新)按钮保存更改。你应该看到以下页面:

如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin

点击 Dashboard(仪表盘)按钮。你应该在以下界面中看到 PowerDNS-Admin 仪表盘:

如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin

结论

恭喜!你已成功在 Ubuntu 22.04 服务器上通过 Nginx 安装并配置了 PowerDNS 和 PowerDNS-Admin。你现在可以通过 PowerDNS-Admin Web 界面创建区域并添加记录,然后进行测试。如果你有任何问题,随时可以问我。