| Works
CentOS 7にPowerDNS/Poweradminをインストール
検証用にDNSを構築することになったのですが、Bind以外のDNSに挑戦したかったのでPowerDNSと管理GUIとしてPoweradminをインストールしてみました。
キャッシュサーバのPowerDNS Recursorも一緒に入れて、キャッシュにないものだけを権威サーバに問い合わせに行くようにしたつもり。
本当はノードを分けるべきなのだけど、環境の都合で1つのサーバ内で構築しています。
主な環境は、以下の通り。
OS | CentOS 7 (x86_64) | |
DNS | PowerDNS 3.4.0 | |
PowerDNS Recursor 3.6.1 | ||
管理GUI | Poweradmin 2.1.7 | |
Apache 2.4 | ディストリビューション標準パッケージ | |
バックエンドDB | MariaDB 5.5 | ディストリビューション標準パッケージ |
IPアドレス | 192.168.40.90 |
OSはminimalでインストールし、必要なパッケージを随時インストールします。
いきなり端折ってしまっていますが、RPMがあるものは使わせてもらうことにします。
# yum -y install epel-release
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y update
# yum -y install pdns pdns-backend-mysql pdns-recursor pdns-tools mariadb-server bind-utils wget httpd php php-cli php-pdo php-mysql php-mcrypt
続いてデータベースを作成して、ユーザーやテーブルを作成します。
まずはサービスの起動
# systemctl start mariadb
# systemctl enable mariadb
データベースのrootパスワードを設定し、PowerDNS用データベースとユーザーを作成します。
(ここではrootパスワードは"mysql"、PowerDNS用のデータベース名、ユーザー、パスワードは全て"powerdns"にしています。)
# mysqladmin -u root password "mysql"
# mysql -u root -pmysql -e "CREATE DATABASE powerdns CHARACTER SET utf8;"
# mysql -u root -pmysql -e "CREATE USER 'powerdns'@'localhost' IDENTIFIED BY 'powerdns';"
# mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns'@'localhost';"
PowerDNS用データベースに接続し、以下のSQL文でテーブル等を作成します。
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 DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id INT 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;
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;
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) NOT NULL,
comment VARCHAR(64000) NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE INDEX comments_domain_id_idx ON comments (domain_id);
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;
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,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB;
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;
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
PowerDNSの設定を行います。
デフォルトファイル"/etc/pdns/pdns.conf"を待避して、以下の設定を入れます。
(再帰問い合わせ先はGoogle Public DNSを指定しています。)
setuid=pdns
setgid=pdns
local-address=127.0.0.1
recursor=8.8.8.8
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=password
gmysql-dbname=powerdns
PowerDNSの設定が完了したらサービスを起動し、正常に起動することを確認します。
ここでファイアウォールも開けておきます。
# systemctl start pdns.service
# systemctl enable pdns.service
# firewall-cmd --add-service=dns --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload
次にPowerDNS Recursorの設定を行います。
こちらもデフォルトファイル"/etc/pdns-recursor/recursor.conf"を待避して、以下の設定を入れます。
setuid=pdns-recursor
setgid=pdns-recursor
allow-from=192.168.40.0/24
local-address=192.168.40.90
forward-zones-recurse=.=127.0.0.1
同様にPowerDNS Recursorサービスを起動します。
# systemctl start pdns-recursor.service
# systemctl enable pdns-recursor.service
ここまでで基本的なDNSとしては機能するようになったはずです。
このままでも使うことはできますが、管理しやすいようにPHPベースのGUIであるPoweradminを導入します。
まずはファイルをダウンロード、展開、WEBサーバの公開パスへの配置をします。
# wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
# tar -zxvf ./poweradmin-2.1.7.tgz
# mv ./poweradmin-2.1.7/inc/config-me.inc.php ./poweradmin-2.1.7/inc/config.inc.php
# mkdir -p /var/www/html/poweradmin
# mv ./poweradmin-2.1.7/* /var/www/html/poweradmin
設定ファイル"config.inc.php"にデータベースへの接続情報を記述します。
(ここでは"/var/www/html/poweradmin/inc/config.inc.php"の変更部分のみ抜粋、ただし"$session_key"については後述)
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'powerdns';
$db_pass = 'powerdns';
$db_name = 'powerdns';
$db_type = 'mysql';
$session_key = 'xxx';
Apacheのサービスを起動します。
(主旨が違うのでApacheの設定についてはここでは記載しませんが、必要に応じて行います。)
# systemctl start httpd
# systemctl enable httpd
WEBブラウザから"http://192.168.40.90/poweradmin/install"にアクセスして指示に従ってウィザードを進めます。
ウィザードではGUI管理ユーザーのパスワード、データベースの接続情報等を入力します。(データベースの入力情報は先の設定ファイルに合わせます。)
ウィザードの最後で"$session_key"の文字列が表示されるので、この文字列を設定ファイルに記載してください。(データベース接続情報等が異なる場合も修正。)
ウィザードが完了したらinstallディレクトリ(ここでは"/var/www/html/poweradmin/install")を削除します。
これで"http://192.168.40.90/poweradmin/"へアクセスすればPoweradminのログオン画面が表示されます。
GUIを操作するなり、SQL文で直接データベースに入れるなりでゾーンやレコードを入れていきます。
P.S.
Bind等で使用しているゾーンファイルをSQLに変換してインポートすることができます。
(Bindの設定から変換)
# zone2sql --named-conf=/etc/named.conf --gmysql > named.sql
(ゾーンファイルごとに変換)
# zone2sql --zone=zonefile --zone-name=test.local --gmysql > zone.sql