本文講述了我在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()函數。
若有侵權請聯系作者,所有內容僅代表個人認知觀點,如有錯誤,歡迎校正; 郵箱:admin@happytang.org 博客地址:https://www.cnblogs.com/happytang/
