在Debian 11/10上安装PowerDNS和PowerDNS Admin
本文介绍如何在Debian 11/10系统上安装配置PowerDNS和PowerDNS Admin的方法。PowerDNS是用C++语言编写的DNS服务器,提供权威服务器和递归DNS产品。PowerDNS Admin是一个web管理界面,允许您使用PowerDNS创建和管理DNS区域。在安装之前请先运行sudo apt update && sudo apt upgrade命令更新系统,并运行sudo apt install curl vim git -y命令安装所需的工具。
安装PowerDNS和PowerDNS Admin的方法
步骤1、安装PowerDNS关系数据库
PowerDNS支持无数数据库后端,如MySQL、PostgreSQL、Oracle。这里,我们将使用MariaDB作为PowerDNS区域文件的后端存储。使用以下步骤在Debian 11/Debian 10上安装MariaDB。
首先,安装所需的工具:
sudo apt install software-properties-common gnupg2 -y
然后继续,在系统上安装MariaDB 10.6存储库:
curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo bash mariadb_repo_setup
更新包索引并安装MariaDB:
sudo apt update
sudo apt install mariadb-server mariadb-client
安装完成后,启动并启用MariaDB:
sudo systemctl start mariadb
sudo systemctl enable mariadb
使用root用户登录shell:
sudo mysql -u root
现在创建一个PowerDNS数据库:
CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns_user'@'%' IDENTIFIED BY 'Strongpassword';
FLUSH PRIVILEGES;
EXIT
请记住,为用户设置的密码不应包含特殊字符,因为PowerDNS不喜欢这样,并且会导致错误“Access denied for user ‘powerdns_user’@’localhost’ (using password: YES)”。
步骤2、在Debian 11/Debian 10上安装PowerDNS
我们将首先禁用systemd解析服务。该服务在端口53上运行,提供用于加载应用程序的网络名称解析,但现在我们希望使用PowerDNS。
停止并禁用使用以下命令解析的systemd:
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
继续并删除文件的符号链接:
$ ls -lh /etc/resolv.conf
-rw-r--r-- 1 root root 49 Feb 06 04:53 /etc/resolv.conf
$ sudo unlink /etc/resolv.conf
更新resolv.conf文件:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
完成以上调整后,您可以使用以下命令从默认APT存储库安装PowerDNS:
sudo apt install pdns-server pdns-backend-mysql
在官方PowerDNS发布页面上安装最新版本的PowerDNS,地址在https://doc.powerdns.com/authoritative/changelog/。也可以安装需要的版本,比如可安装4.6版本,此版本的存储库可以添加到系统中,如下所示:
sudo vim /etc/apt/sources.list.d/pdns.list
对于Debian 11:
deb [arch=amd64] http://repo.powerdns.com/debian bullseye-auth-46 main
对于Debian 10:
deb [arch=amd64] http://repo.powerdns.com/debian buster-auth-46 main
导入存储库的GPG密钥签名:
curl -fsSL https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pdns.gpg
设置APT首选项:
$ sudo vim /etc/apt/preferences.d/pdns
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
更新APT包索引:
sudo apt update
现在安装PowerDNS服务器和MySQL后端,如下所示:
sudo apt install pdns-server pdns-backend-mysql
步骤3、配置PowerDNS数据库
现在我们已经在MariaDB上创建了PowerDNS数据库,我们将继续并将数据库模式导入其中。这通常保存在/usr/share/pdns-backend-mysql/schema/下,作为schema.mysql.sql文件。
现在,在步骤1中将此模式导入到创建的数据库(powerdns)中:
mysql -u powerdns_user -p powerdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
然后,您可以验证模式导入,如下所示:
sudo mysql -u root
use powerdns;
show tables;
导入模式后,我们现在将配置数据库的PowerDNS连接详细信息。
这可以通过创建下面的文件来完成:
sudo vim /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=powerdns
gmysql-user=powerdns_user
gmysql-password=Strongpassword
gmysql-dnssec=yes
# gmysql-socket=
为文件设置适当的权限:
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
现在可以验证数据库连接:
sudo systemctl stop pdns.service
sudo pdns_server --daemon=no --guardian=no --loglevel=9
可以通过输出信息,查看数据库是否连接成功。如在成功后,请重新启动并启用PowerDNS服务:
sudo systemctl restart pdns
sudo systemctl enable pdns
验证端口53是否为DNS打开,可用sudo ss -alnp4 | grep pdns命令,会看到udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:(("pdns_server",pid=18530,fd=5))之类的返回信息。
您还可以检查PowerDNS是否响应请求:
$ dig @127.0.0.1
; <<>> DiG 9.16.22-Debian <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 4882
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;. IN NS
;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; MSG SIZE rcvd: 28
步骤4、在Debian 11/Debian 10上安装PowerDNS Admin
使用这个基于Web的管理工具,我们可以轻松地管理PowerDNS服务器。要安装PowerDNS admin,首先安装Python开发包:
sudo apt install python3-dev
安装所需的生成工具:
sudo apt install libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv python3-venv build-essential libmariadb-dev git python3-flask -y
在Debian上安装Node.js。首先,添加存储库:
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
然后使用命令安装Nodejs:
sudo apt install -y nodejs
你还需要yarn。添加其存储库和GPG密钥,如下所示:
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
使用以下命令安装Yarn:
sudo apt update
sudo apt install yarn -y
现在克隆PowerDNS管理源代码:
sudo su -
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns
创建虚拟环境:
cd /var/www/html/pdns/
virtualenv -p python3 flask
激活环境并安装requirements.txt中指定的库:
source ./flask/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
现在配置到数据库的PowerDNS管理连接。首先,停用虚拟环境:
deactivate
编辑下面的文件:
vim /var/www/html/pdns/powerdnsadmin/default_config.py
在文件中,编辑以下行:
### DATABASE CONFIG
SQLA_DB_USER = 'powerdns_user'
SQLA_DB_PASSWORD = 'Strongpassword'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'powerdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True
现在创建一个数据库模式:
cd /var/www/html/pdns/
source ./flask/bin/activate
export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
如果您发现错误“ImportError: cannot import name ‘json’ from ‘itsdangerous’”,请按以下步骤操作:
pip uninstall itsdangerous
pip install itsdangerous==2.0.1
flask db upgrade
样本输出:
Add view column to setting table
INFO [alembic.runtime.migration] Running upgrade 59729e468045 -> 1274ed462010, Change setting.value data type
INFO [alembic.runtime.migration] Running upgrade 1274ed462010 -> 4a666113c7bb, Adding Operator Role
INFO [alembic.runtime.migration] Running upgrade 4a666113c7bb -> 31a4ed468b18, Remove all setting in the DB
INFO [alembic.runtime.migration] Running upgrade 31a4ed468b18 -> 654298797277, Upgrade DB Schema
INFO [alembic.runtime.migration] Running upgrade 654298797277 -> 0fb6d23a4863, Remove user avatar
INFO [alembic.runtime.migration] Running upgrade 0fb6d23a4863 -> 856bb94b7040, Add comment column in domain template record table
INFO [alembic.runtime.migration] Running upgrade 856bb94b7040 -> b0fea72a3f20, Update domain serial columns type
INFO [alembic.runtime.migration] Running upgrade b0fea72a3f20 -> 3f76448bb6de, Add user.confirmed column
INFO [alembic.runtime.migration] Running upgrade 3f76448bb6de -> 0d3d93f1c2e0, Add domain_id to history table
INFO [alembic.runtime.migration] Running upgrade 0d3d93f1c2e0 -> 0967658d9c0d, add apikey account mapping table
成功后,使用Yarn生成asset文件:
yarn install --pure-lockfile
flask assets build
停用虚拟环境:
deactivate
1]、启用PowerDNS API访问
随着REST API的公开,人们可以控制多个活动、读取统计信息、修改区域内容等。通过编辑下面的配置文件来启用它:
sudo vim /etc/powerdns/pdns.conf
在打开的文件中,进行以下更改:
# api Enable/disable the REST API (including HTTP listener)
#
# api=no
api=yes
#################################
# api-key Static pre-shared authentication key for access to the REST API
#
# api-key=
api-key=3ce1af6c-981d-4190-a559-1e691d89b90e #You can generate one from https://codepen.io/corenominal/pen/rxOmMJ
保存文件并重新启动PowerDNS:
sudo systemctl restart pdns
2]、创建PowerDNS虚拟主机文件
首先,安装Nginx web服务器:
sudo apt install nginx
创建虚拟主机文件:
vim /etc/nginx/conf.d/powerdns-admin.conf
添加以下内容:
server {
listen *:80;
server_name pdnsadmin.computingforgeeks.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文件:
mv /etc/nginx/sites-enabled/default{,.old}
检查上面创建的文件的语法:
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
设置文件的正确所有权:
chown -R www-data: /var/www/html/pdns
重新启动Nginx以应用更改:
systemctl restart nginx
3]、为PowerDNS Admin创建系统服务文件
为了能够像其他系统服务一样管理PowerDNS Admin,我们需要为其创建一个服务文件。
按如下所示创建文件:
vim /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
此外,创建套接字文件:
sudo vim /etc/systemd/system/pdnsadmin.socket
添加lines:
[Unit]
Description=PowerDNS-Admin socket
[Socket]
ListenStream=/run/pdnsadmin/socket
[Install]
WantedBy=sockets.target
创建环境文件:
mkdir /run/pdnsadmin/
echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
设置所需的权限:
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/
重新加载系统守护程序:
systemctl daemon-reload
启动并启用PowerDNS Admin服务:
systemctl enable --now pdnsadmin.service pdnsadmin.socket
检查服务状态:
systemctl status pdnsadmin.service pdnsadmin.socket
步骤5、访问PowerDNS管理Web UI
此时,应该可以使用URL访问PowerDNS web UI,地址格式为http://domain_name或者http://IP_address:
首先创建管理员用户帐户:
提供所需的详细信息后,单击注册以创建帐户。现在使用创建的用户凭据登录到PowerDNS Admin界面。
现在,为了能够管理PowerDNS服务器,请提供API密钥URL地址http://127.0.0.1:8081以及PowerDNS配置文件(/etc/powerdns/pdns.conf)中定义的API密钥:
单击更新以使错误消失。然后就可以管理PowerDNS了,即进入到控制中心里面就可以进行相应的配置了:
比如在+新建域选项卡下创建新域,也可以使用PowerDNS管理web UI对服务器进行许多其他配置,例如编辑域模板、删除域、管理用户帐户等。您还可以查看执行的活动的历史记录:
至此,您已经在Debian 11/Debian 10系统上成功安装并配置了PowerDNS和PowerDNS Admin。