PowerDNS 部署实践:权威解析加 Poweradmin 管理

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
powerDNS01

需要递归服务的话再装 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:

powerDNS02
[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/ 进入安装向导:

powerDNS03
powerDNS04
powerDNS05

注意:向导生成的 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;
powerDNS06

配置文件核心是数据库连接参数、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;
powerDNS07

安装完成后删掉安装目录:

[root@localhost ~]# rm -rf /var/www/poweradmin/install

登录使用与解析验证

用向导里设置的账号登录:

powerDNS08

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

powerDNS09
powerDNS10
powerDNS11

验证:客户端装 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
powerDNS12
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容