URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

CentOS 7にPowerDNS/Poweradminをインストール

 検証用にDNSを構築することになったのですが、Bind以外のDNSに挑戦したかったのでPowerDNSと管理GUIとしてPoweradminをインストールしてみました。

 キャッシュサーバのPowerDNS Recursorも一緒に入れて、キャッシュにないものだけを権威サーバに問い合わせに行くようにしたつもり。
 本当はノードを分けるべきなのだけど、環境の都合で1つのサーバ内で構築しています。

 主な環境は、以下の通り。

OSCentOS 7 (x86_64)
DNSPowerDNS 3.4.0
PowerDNS Recursor 3.6.1
管理GUIPoweradmin 2.1.7
Apache 2.4ディストリビューション標準パッケージ
バックエンドDBMariaDB 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