PowerDNS

DNSゾーンを保存するバックエンドにMySQL・PostgreSQLなどのデータベースを利用出来る権威DNSサーバ。
APIも用意されており、スクリプトで直にAPIを叩いたり、WebGUIから間接的に操作する事も出来る。
BINDのテキストゾーンファイルを読み込んだりTinyDNSとの連携もでき、他の権威DNSサーバとの親和性も高い。
WebGUIでゾーン編集ができる事から、PowerDNSをHiddenPrimaryにして実クエリは別の権威DNSで処理させる構成が多い。

参考サイト

構築環境

今回は下記構成のPowerDNSをchrootモードで構築する。
バックエンドにはMySQLを利用するので、事前にビルドしておく。

OSはopenSUSEを利用しているがプログラムはソースからビルドしているので、
他ディストリビューションでも同様の手順で構築する事が出来る。

OS  :openSUSE Leap 42.3
PDNS:PowerDNS v4.1.4
DB  :MariaDB v10.1.17
---
> PDNS Parameter
user :pdns
group:pdns
---
> DB Parameter
database:pdns_zone
user    :pdns_user
password:pdns_pass


インストール

DNSゾーン登録

バックエンドにMySQLを使っている場合、SQLコマンドでDNSゾーンを流し込むか、
BINDテキスト形式でゾーンを作った後に変換しながらDBに登録する方法がある。
今回はテスト用にDNSゾーンを登録する為、SQLコマンドで登録を行う。

# vi example.com-sql
---
INSERT INTO domains (name,type) values ('example.com','NATIVE');
INSERT INTO records (domain_id,name,content,type,ttl,prio) VALUES (1,'example.com','localhost postmaster@example.com 1','SOA',86400,NULL);
INSERT INTO records (domain_id,name,content,type,ttl,prio) VALUES (1,'example.com','ns1.example.com','NS',86400,NULL);
INSERT INTO records (domain_id,name,content,type,ttl,prio) VALUES (1,'ns1.example.com','127.0.0.1','A',120,NULL);

# mysql -u pdns_user -p pdns_zone < example.com-sql
# dig @127.0.0.1 ns1.example.com


起動テスト

起動テストを行う場合、『pdns_server』コマンドをそのまま実行するとログが出てくる。
コンフィグを書き換えれば、ログを標準出力にしながらdaemon起動させる事も出来る。

・起動
---
systemctl start pdns

・停止
---
systemctl stop pdns

・リロード
---
systemctl reload pdns


PDNS Manager

PowerDNSをGUIで操作するフロントWebアプリケーション。
PHPで出来ているので、LAMPを構築してあれば大抵の環境で動作する。
アプリの構造上、サブディレクトリを掘ってPDNS Managerを動かす事が出来ないので、
他にもWebアプリを動かしている環境下では、VirtualHostで別FQDNにホスティングする必要がある。
 
なお、PowerDNSのバックエンドDBをPDNS Manager用に作り直す必要があるので注意。
頑張れば、DB設定を直書きしたり個別にInsertすれば既存DBでも動くが説明は割愛。