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
# zypper install lua lua-devel systemd systemd-devel # wget https://downloads.powerdns.com/releases/pdns-4.1.4.tar.bz2 # tar jxvf pdns-4.1.4.tar.bz2 # cd pdns-4.1.4 # ./configure --prefix=/usr/local/powerdns --enable-tools --enable-systemd --with-lua --with-mysql=/usr/local/mysql # make # make install # ln -s /usr/local/powerdns/etc /etc/powerdns # cp /etc/powerdns/pdns.conf-dist /etc/powerdns/pdns.conf
/etc/powerdns/pdns.conf |
/etc/powerdns/extra/gmysql.conf |
/usr/lib/systemd/system/pdns.service |
・ユーザ作成と起動スクリプト設定 --- # groupadd pdnsd # useradd -g pdnsd -s /sbin/nologin -d /var/powerdns pdnsd # chmod 644 /usr/lib/systemd/system/pdns.service # chown root.root /usr/lib/systemd/system/pdns.service # systemctl enable pdns
・chrootディレクトリ作成 --- # mkdir -p /var/powerdns/chroot # mkdir -p /var/powerdns/chroot/dev # mkdir -p /var/powerdns/chroot/var/log # mkdir -p /var/powerdns/chroot/var/run/pdnsd # chmod 755 /var/powerdns/chroot/var/run/pdnsd # chown root.pdnsd /var/powerdns/chroot/var/run/pdnsd # cd /var/powerdns/chroot # touch ./var/log/api # chmod -R 755 ./var/log # chown -R pdnsd.pdnsd ./var/log # cd /var/powerdns/chroot/dev # mknod -m 644 ./null c 1 3 # mknod -m 644 ./zero c 1 5 # mknod -m 644 ./full c 1 7 # mknod -m 644 ./random c 1 8 # mknod -m 644 ./urandom c 1 9
・DBスキーマ登録 --- MariaDB [(none)]> create database pdns_zone; MariaDB [(none)]> grant all on pdns_zone.* to pdns_user identified by 'pdns_pass'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> quit --- # cd ${PDNS_SRC}/modules/gmysqlbackend/ # mysql -u pdns_user -p pdns_zone < schema.mysql.sql
・rsyslog設定変更 --- # vi /etc/rsyslog.conf --- ## PowerDNS chroot log device $AddUnixListenSocket /var/powerdns/chroot/dev/log local0.* /var/log/powerdns & stop
バックエンドに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