PowerDNS

バックエンドにMySQL・PostgreSQLなどのデータベースを利用出来る権威DNSサーバ(PowerDNS Authoritative Server)と、
端末からのDNSクエリを中継するキャッシュDNSサーバ(PowerDNS Recursor)の二種類がある。
DNS専用リバースプロキシのdnsdistも組み合わせる事で、
BIND相当の権威DNS・キャッシュDNSの同居DNSサーバを構築する事も出来る。
 
PowerDNSはAPIも用意されており、スクリプトで直にAPIを叩いたり、WebGUIから間接的に操作する事も出来る。
BINDのテキストゾーンファイルを読み込んだりTinyDNSとの連携もでき、他の権威DNSサーバとの親和性も高い。
WebGUIでゾーン編集ができる事から、PowerDNSをHiddenPrimaryにして実クエリは別の権威DNSで処理させる構成が多い。

参考サイト

構築環境

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

  • 共通環境
    OS  :openSUSE Leap 42.3
    PDNS:PowerDNS v4.1.4
     
     PowerDNS Authoritative Server

インストール

  • 1. インストール
    最近のOSはsystemdを使っている事が多いので、systemdモジュールを有効化する。
    また、今回はバックエンドにMySQLを使うのでDBモジュールもビルドする。
    luaは使う時が来そうなので一応ビルド。必要なければconfigureオプションから外す。
    # zypper install lua53 lua53-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
     
  • 2. コンフィグ作成
    PowerDNSのコンフィグはテキストで作成する必要がある。
    APIはPowerDNS単体では使わないので無効化しておき、APIを利用する外部ツールを使う時に有効化する。
    DB接続は別ファイル化して必要に応じてパーミッションを絞っておく。
    起動スクリプトについては、ソースコード同梱の物が上手く動かないので自作する。
     
     /etc/powerdns/pdns.conf
     /etc/powerdns/extra/gmysql.conf
     /usr/lib/systemd/system/pdns.service
     
  • 3. 起動準備
    chrootディレクトリの作成、パーミッション設定、DBスキーマの流し込みを行う。
    PowerDNSはログ出力をsyslog経由でしか出来ない為、ログを書き出せる様にsyslogサーバの設定も変更する。
    ただし、chroot環境下でPowerDNSのログをsyslog出力させるには、
    PowerDNSのログをsyslog側でフックさせる為に、ソケット(ログ出力デバイス)を作成する必要がある。
    ・ユーザ作成と起動スクリプト設定
    ---
    # 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

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

 
PowerDNSに登録したゾーン情報の書式確認を行う場合、チェックユーティリティを利用する。
セカンダリサーバへのゾーン転送が出来ない時は、書式間違いが多いので都度確認すること。

# /usr/local/powerdns/bin/pdnsutil check-all-zones
---
Nov 09 23:32:41 Reading random entropy from '/dev/urandom'
Checked 3 records of 'example.com', 0 errors, 0 warnings.
Checked 1 zones, 0 had errors.


PDNS Manager

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

  • PDNS Manager
     
     インストール
     VirtualHost設定
     データベース再生成
     データベース登録

添付ファイル: filewiki_powerdns_01.png 671件 [詳細]