如何在 Ubuntu 22.04 上安装 PowerDNS 和 PowerDNS-Admin
本教程适用于这些操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 20.04(Focal Fossa)
在此页
- 先决条件
- 安装和配置 MariaDB 服务器
- 安装 PowerDNS
- 配置 PowerDNS
- 安装 PowerDNS 管理
- 安装所需的依赖项
- 配置数据库连接
- 启用 PowerDNS 管理 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 指向的有效域名。
- 在服务器上配置了根密码。
安装和配置 MariaDB 服务器
首先,您需要在您的系统上安装 MariaDB 数据库服务器。
apt-get install mariadb-server -y
安装 MariaDB 后,您需要为 PowerDNS 创建数据库和用户。
首先,使用以下命令登录 MariaDB:
mysql
登录后,使用以下命令创建数据库和用户:
MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to 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 管理员
在本节中,我们将向您展示如何使用 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 -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 管理员
接下来,从 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 管理 API
PowerDNS 管理员使用 JSON API 读取统计信息和修改区域内容、元数据和 DNSSEC 密钥材料。您可以通过编辑文件 pdns.conf 来启用它:
nano /etc/powerdns/pdns.conf
更改以下行:
api=yes api-key=yoursecretekey
保存并关闭文件,然后重新启动 PowerDNS 服务以应用更改:
systemctl restart pdns
将 Nginx 配置为 PowerDNS Admin 的反向代理
接下来,您需要将 Nginx 配置为 PowerDNS 管理员的反向代理。为此,请使用以下命令创建 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 服务文件来管理 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 sockt 文件:
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 管理员
您现在可以打开 Web 浏览器并使用 URL http://pdnsadmin.example.com 访问 PowerDNS 管理 Web 界面。您将被重定向到以下页面:
单击创建帐户按钮。您应该看到以下屏幕:
提供您的管理员用户详细信息,然后单击“注册”按钮创建一个帐户。您应该会在以下屏幕上看到 PowerDNS 管理 Web 界面:
提供 PowerDNS API URL 以连接到 PowerDNS 并对其进行管理。然后,单击“更新”按钮以保存更改。您应该会看到以下页面:
单击仪表板按钮。您应该会在以下屏幕上看到 PowerDNS 管理仪表板:
结论
恭喜!您已经在 Ubuntu 22.04 服务器上使用 Nginx 成功安装并配置了 PowerDNS 和 PowerDNS admin。您现在可以通过 PowerDNS 管理 Web 界面创建区域和添加记录,然后对其进行测试。如果您有任何问题,请随时问我