PowerDNS 是把 DNS 区数据放进数据库做解析的开源方案,配合 Web 管理端可以直接在页面上增删解析记录。这篇记录完整链路:MySQL 打底、部署权威服务、装 Poweradmin 管理界面、dig 验证解析。环境为 CentOS 7 + MySQL 8.0。
PowerDNS 是什么
项目始于 1990 年代后期,2015 年成为 Open-Xchange 的一部分,既能做权威 DNS 也能做递归。有 Win32 和 Linux/Unix 两个版本:Windows 下用 Access 的 mdb 文件记录 DNS 信息,Linux/Unix 下用 MySQL,并提供功能完整的 Web 管理端。官网 powerdns.com,手册在 doc.powerdns.com。
数据库准备
先装 MySQL 8.0:YUM 源、启动、从日志取临时密码、重置 root 密码:
# MySQL安装YUM源
yum install -y https://repo.mysql.com//mysql80-community-release-el7-7.noarch.rpm
# 清除YUM缓存并重新生成YUM缓存
yum clean all
yum makecache
yum --disablerepo="*" --enablerepo= -y install mysql mysql-community-server mysql-community-devel
# 启动 MySQL
systemctl start mysqld.service
systemctl enable mysqld.service
systemctl status mysqld.service
# 获取初始密码
old_pass=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1`
# 重置root密码
mysql> alter user 'root'@'localhost' identified by 'Root@123456';
建 powerdns 库和专属账号。注意 MySQL 8.0 的身份验证与 5.7 不同,要显式写 identified with mysql_native_password,授权后刷新:
# 创建数据库
[root@localhost ~]# mysql -uroot -p
mysql> create database powerdns character set utf8 collate utf8_bin;
# 创建账号;MySQL8.0的账号身份验证和MySQL5.7不同
mysql> create user 'powerdns'@'localhost' identified with mysql_native_password by 'Root@123456';
# 授权
mysql> grant all privileges on powerdns.* to 'powerdns'@'localhost';
刷新权限
mysql> flush privileges;
数据表完全按官方 generic MySQL backend 的默认 schema 创建——domains、records、supermasters、comments、domainmetadata、cryptokeys、tsigkeys 七张表及索引:
mysql> use powerdns;
CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INT UNSIGNED DEFAULT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
options VARCHAR(64000) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id BIGINT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX ordername ON records (ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE TABLE comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
comment TEXT CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
#检查是否可以通过powerdns用户查看到powerdns库
[root@localhost ~]# mysql -upowerdns -pRoot@123456 -e "show databases;"
建完用 powerdns 账号连一次,show databases 能看到库名说明授权无误。
安装并配置 PowerDNS
epel 源、官方 repo 源,然后装 pdns 主程序和 MySQL 后端:
# 安装epel源
[root@localhost ~]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@localhost ~]# yum install epel-release yum-plugin-priorities
# 安装官方repo源
[root@localhost ~]# curl -o /etc/yum.repos.d/powerdns-rec-47.repo https://repo.powerdns.com/repo-files/el-rec-47.repo
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
# 安装PowerDNS
[root@localhost ~]# yum install -y pdns pdns-backend-mysql

需要递归服务的话再装 pdns-recursor:
# 安装PowerDNS-Recursor
yum install pdns-recursor
编辑 /etc/pdns/pdns.conf,末尾追加 gmysql 后端参数(主机、端口 3306、库名、账号、密码),开启 webserver 并用 webserver-allow-from 圈定能访问 API 的 IP 网段,监听地址设 0.0.0.0:
[root@localhost ~]# vim /etc/pdns/pdns.conf
#配置文件最后添加即可
launch=gmysql
gmysql-host=localhost # 需要连接的mysql的IP地址
gmysql-port=3306 # 需要连接的mysql的端口号,默认是3306
gmysql-dbname=powerdns # 需要连接的数据库,默认:powerdns
gmysql-user=powerdns # 连接数据库的用户名,默认:powerdns
gmysql-password=Root@123456 # 连接数据库的用户的密码
# 启动webserver
webserver=yes
webserver-address=192.168.66.10
# webserver-allow-from指定允许访问webserver和API的IP白名单,多个IP可以使用英文逗号隔开;这里指定的是一个网段
webserver-allow-from=192.168.66.0/24
# pdns监听地址
local-address=0.0.0.0
启动并设置开机自启:
[root@localhost ~]# systemctl start pdns.service
[root@localhost ~]# systemctl status pdns.service
[root@localhost ~]# systemctl enable pdns.service
Poweradmin 管理界面部署
Poweradmin 是 PowerDNS 配套的 Web DNS 管理工具,支持全部区域类型(主、本机、从属)、supermaster 自动配置从属区域、完整 IPv6 和多语言。官网 poweradmin.org。
Web 侧用 Nginx 承载,站点根目录指向 /var/www/poweradmin,PHP 请求转发到 127.0.0.1:9000:
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.22.0-1.el7.ngx.x86_64.rpm
yum install nginx-1.22.0-1.el7.ngx.x86_64.rpm
# 修改访问nginx配置
cat > /etc/nginx/conf.d/default.conf <<EOF
server {
listen 80;
server_name localhost;
client_max_body_size 150m;
client_body_timeout 180;
client_body_buffer_size 16K;
client_header_buffer_size 1K;
root /var/www/poweradmin;
tcp_nodelay on;
sendfile on;
tcp_nopush on;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 444;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 32 32k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
include fastcgi_params;
}
}
EOF
# 创建网站目录
mkdir -p /var/www/poweradmin
# 启动nginx
systemctl start nginx
systemctl status nginx
systemctl enable nginx
PHP 版本要求 7.2.5+。用 remi 源装 php-fpm 与相关扩展,www.conf 里把 apache 用户组换成 nginx,再启动:
#安装remi源地址
rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install yum-utils
yum --enablerepo=remi-php74 -y install php-cli php-pear bcmath php-pecl-jsond-devel php-mysqlnd php-gd php-common php-fpm php-intl php-xml php-opcache php-pecl-apcu php-pdo php-gmp php-process php-pecl-imagick php-devel php-mbstring php-zip php-ldap php-imap php-pecl-mcrypt --skip-broken
# 修改php.ini配置
sed -i 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
# 授权
chown -R nginx. /var/lib/php/
# 启动PHP服务
systemctl start php-fpm.service
systemctl status php-fpm.service
systemctl enable php-fpm.service
从 poweradmin 的 GitHub releases 下载压缩包,解压拷进站点目录,属主交给 nginx:

[root@localhost ~]# tar -zxvf poweradmin-3.2.0.tar.gz
[root@localhost ~]# mv poweradmin-3.2.0/* /var/www/poweradmin/
[root@localhost ~]# chown -R nginx. /var/www/poweradmin/
浏览器访问 服务器IP/install/ 进入安装向导:



注意:向导生成的 SQL 在 MySQL 8.0 上无法直接执行,创建 poweradmin 账号这步要换成下面 identified with mysql_native_password 的写法:
mysql> create user 'poweradmin'@'localhost' identified with mysql_native_password by 'Root@123456';
# 授权
mysql> grant SELECT, INSERT, UPDATE, DELETE on powerdns.* to 'poweradmin'@'localhost';
# 刷新权限
mysql> flush privileges;

配置文件核心是数据库连接参数、session_key、NS 地址,$ignore_install_dir 置 true 后不必保留安装页:
[root@localhost ~]# vim /var/www/poweradmin/inc/config.inc.php
<?php
$db_host = 'localhost';
$db_name = 'powerdns';
$db_user = 'poweradmin';
$db_pass = 'admin@123';
$db_type = 'mysql';
$session_key = 'NVz*9Iem6HIpe!iDoq1*d@V4IgEpbtj563M6R^5jLu3Gi2';
$iface_lang = 'en_EN';
$dns_hostmaster = '';
$dns_ns1 = '192.168.66.10';
$dns_ns2 = '192.168.66.10';
$ignore_install_dir = true;

安装完成后删掉安装目录:
[root@localhost ~]# rm -rf /var/www/poweradmin/install
登录使用与解析验证
用向导里设置的账号登录:

添加主域:填入域名、选择 master 类型,再进记录页添加解析条目:



验证:客户端装 bind-utils,把 /etc/resolv.conf 的 nameserver 指向 PowerDNS 服务器,dig 一条自己配置的域名,返回预期记录即通。
#安装dig命令;192.168.66.110的机器上配置dns解析地址
[root@localhost ~]# yum install bind-utils
#添加PowerDNS服务器地址
[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.66.10
[root@localhost ~]# dig test.dqzboy.cn



















暂无评论内容