本文讲述了我在Centos 7系统(其他版本的Centos未尝试)中基于PowerDNS和poweradmin自建域名解析服务器替代DnsPod的过程。通过本文所述方法,可以建立权威域名解析服务器的master server。并通过可视化的管理界面poweradmin来管理所有解析的域名。所搭建的平台可替代DnsPod的功能。
以下步骤实验环境为:我用的服务器是在kimsufi上购买的独立服务器,假设这个权威域名解析服务器的master server的IP地址为:215.1.1.1。所需要构建的权威域名解析服务器为ns1.happytang.org
第一步
参照官方网站说明文档,首先加载EPEL库,代码如下:
1 # yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
2 # subscription-manager repos --enable "rhel-*-optional-rpms" --enable "rhel-*-extras-rpms" --enable "rhel-ha-for-rhel-*-server-rpms"
第二步
安装powerdns(4.2.1版本)以及基于mysql数据库存储域名解析信息的backend,代码如下:
1 # yum install pdns
2 # yum install pdns-backend-mysql
第三步
由于centos默认yum install mysql会指向mariadb。同时,我们的poweradmin可视化域名管理界面需要在apache、mysql(mysql版本本次选择的是5.7版本)、php环境下运行(由于poweradmin运行需要mcrypt扩展,所以php版本不能高于7.2,请采用php 7.1版本及以下。如果你已经安装了7.2版本,请参考这篇文章为你的7.2版本php安装mcrypt)。因此,此处利用oneinstack来一键安装mysql、apache和php。代码如下:
1 # yum -y install wget screen
2 # wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz
3 # tar xzf oneinstack-full.tar.gz
4 # cd oneinstack
5 # screen -S oneinstack
6 # ./install.sh
第四步
给mysql安装client工具,以便于在命令行使用mysql
1 # wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
2 # rpm -ivh mysql57-community-release-el7-8.noarch.rpm
3 # yum install mysql-community-client
第五步
给powerdns配置好mysql,以便powerdns与mysql进行配合,代码如下:
1 # systemctl start mysql
2 # systemctl enable mysql
3 # mysql_secure_installation
4 # mysql -u root -p
5 # create database powerdns;
6 # grant all privileges on powerdns.* to pdns@localhost identified by 'pdnspassword2020';
7 # grant all privileges on powerdns.* to pdns@127.0.0.1 identified by 'pdnspassword2020';
8 # flush privileges;
9 # use powerdns;
接下来,继续在命令行下,执行下述sql代码(在此处,对于records表,相比于官方网站给的建议,我们新增了change_date INT DEFAULT NULL,以便与后面安装的poweradmin配合使用):
CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT UNSIGNED DEFAULT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
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,
change_date 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);
继续执行下述代码:
ALTER TABLE records ADD CONSTRAINT `records_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE comments ADD CONSTRAINT `comments_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE domainmetadata ADD CONSTRAINT `domainmetadata_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE cryptokeys ADD CONSTRAINT `cryptokeys_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
第六步
更改powerdns配置文件,便于powerdns与mysql进行通信
1 # yum install bind-utils
2 # cd /etc/pdns/
3 # cp pdns.conf pdns.conf.old
4 # vi pdns.conf
在pdns.conf中,在"launch=bind"前面加"#",注释其作用,然后在下面加入以下文本:
launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-password=pdnspassword2020
gmysql-dbname=powerdns
然后启动pdns
1 # systemctl start pdns
2 # systemctl enable pdns
最后记得千万记得在防火墙中放行tcp 53端口和udp 53端口。
第七步
安装poweradmin。执行下述代码:
1 # /data/wwwroot/default/
2 # wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
3 # tar xvf poweradmin-2.1.7.tgz
4 # mv poweradmin-2.1.7/ poweradmin/
记得在防火墙里放行80端口和443端口
第八步
访问:http://215.1.1.1/poweradmin/install,选择语言后,进入"Go to Step 2",按提示,进入"Go to Step 3",在这里填入我们之前的powerdns数据,pdns用户及相应的密码,进入"Go to Step 4",后续可以按照图中所示进行。如果出现mysql的socket问题,就重启mysql服务。
第九步
访问:http://215.1.1.1/poweradmin/,在“Add master zone”中,添加happytang.org域,并添加解析如下:
留空,NS,ns1.happytang.org
留空,NS,ns2.happytang.org
ns1,A,215.1.1.1
ns2,A,215.2.2.2
至此,在Centos系统中基于PowerDNS和Poweradmin自建域名解析服务器替代DnsPod,就全部完成了。可以随意添加自己需要解析的域名了。
下一篇文章讲述,如何配置一个master server(ns1.happytang.org)和slave server(ns2.happytang.org),实现域名解析的备份。
特别注意:本文的ns1.happytang.org和ns2.happytang.org需要在域名注册商处注册成域名解析服务器,才能实现全部功能。即英文中的glue records,或Authoritative name Server ,或personal name server。
特别注意2:poweradmin需要开放php的exec()权限。你需要修改php.ini,以便允许执行exec()函数。