本教程适用于以下操作系统版本
- 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 界面。你将被重定向到以下页面:

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

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

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

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

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