はじめに
以前はDNSサーバと言えば、
DNSはサイト固有の要件が増えることが多く、
PowerDNSとは
ここでは、
PowerDNSは豊富なバックエンドをサポートするDNSサーバです。コンテンツDNSサーバとキャッシュDNSサーバの両方をサポートしており、
前提
ここではOSにGentoo/
- 使用するバックエンドはPostgreSQL
- ドメインはexample.
org - example.
orgのauthoritativeなDNSサーバはns. example. org - PostgreSQLサーバはpostgres.
example. org - PowerDNSは127.
0.0. 1でlisten - 既存のBINDから移行
PostgreSQLへデータの移行
BINDの設定をデータベースに移行します。移行には付属のzone2sqlコマンドを使用します。
> cd /etc/namedb > zone2sql --gpgsql > ~/domain.sql
既存のBINDの設定ファイルが利用できない場合は、
> dig example.org any @ns.example.org > db.example.org > vim named.conf zone "example.org" { type master; file "db.example.org"; }; > zone2sql --gpgsql > ~/domain.sql
PostgreSQLにユーザを作成します。
> psql -U postgres --password -h postgres.example.org template1 template1=# CREATE USER pdns PASSWORD 'password'; template1=# CREATE DATABASE pdns owner pdns; template1=# \q
テーブルを作成します。
> vim pdsn.sql CREATE TABLE domains ( id SERIAL PRIMARY KEY, 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 ); CREATE UNIQUE INDEX name_index ON domains(name); CREATE TABLE records ( id SERIAL PRIMARY KEY, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(6) DEFAULT NULL, content VARCHAR(255) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, CONSTRAINT domain_exists FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ); CREATE INDEX rec_name_index ON records(name); CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); CREATE TABLE supermasters ( ip VARCHAR(25) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) DEFAULT NULL ); GRANT SELECT ON supermasters TO pdns; GRANT ALL ON domains TO pdns; GRANT ALL ON domains_id_seq TO pdns; GRANT ALL ON records TO pdns; GRANT ALL ON records_id_seq TO pdns; > psql -U pdns --password -h postgres.example.org pdns < ~/pdns.sql
データをPostgreSQLにインポートします。
> psql -U pdns --password -h postgres.example.org pdns < ~/domain.sql
PowerDNSのインストールと設定
PostgreSQLを使用するので、
> sudo vim /etc/portage/package.use net-dns/pdns postgres
PowerDNSをemergeします。
> sudo emerge pdns
127.
> sudo vim /etc/powerdns/pdns.conf local-address=127.0.0.1 launch=gpgsql gpgsql-host=postgres.example.org gpgsql-user=pdns gpgsql-dbname=pdns
PowerDNSの起動
起動時にPowerDNSを起動するように、
> sudo rc-config add pdns default
BINDが起動している場合は停止します。
> sudo /etc/init.d/named stop
PowerDNSを起動します。
> sudo /etc/init.d/pdns start
状態を確認します。pdns_
> sudo -u pdns pdns_control status 17506: Child running on pid 17515 > ps ax | grep 17515 17515 ? Sl 0:00 /usr/sbin/pdns_server-instance --daemon=yes --guardian=yes > sudo -u pdns pdns_control uptime 9.8 minutes > dig example.org any @127.0.0.1
``pdns_
> sudo -u pdns pdns_control show udp-queries 1
各種統計データをブラウザから参照することもできます。以下の設定を追加します。
> sudo vim /etc/powerdns/pdns.conf webserver=yes webserver-password=password webserver-address=ip.add.re.ss
PowerDNSを再起動します。
> sudo /etc/init.d/pdns restart
ブラウザでhttp://

SSLには対応していませんので、
レコードとドメインの追加
レコードを追加するには、
INSERT INTO records (
domain_id,
name,
type,
content,
ttl
) VALUES (
1,
"host.example.org",
"A",
"10.10.0.1",
86400
);
ドメインを追加するには、
INSERT INTO domains ( name, type ) VALUES ( 'example.com', 'NATIVE' );
おまけ:Catalystアプリケーション
PowerDNSにはRDBMSのデータを管理するためのUIがありませんので、
- Catalyst
- Catalyst::Model::DBIC::Schema
- Catalyst::View::TT
- DBD::Pg
執筆時点で、
> sudo emerge PAR-Dist > sudo g-cpan --install Module-CoreList Module-ScanDeps DBIx-Class-Schema-Loader Data-Dump
必要なモジュールをインストールします。
> sudo emerge DBD-Pg > sudo g-cpan --install Catalyst Catalyst-Devel Catalyst-View-TT Catalyst-Model-DBIC-Schema
アプリケーションを作成します。
> catalyst.pl -short Padmin > cd Padmin
modelを作成します。
> ./script/padmin_create.pl model DNS DBIC::Schema DNS::Schema create=static "dbi:Pg:dbname=pdns;host=postgres.example.org" pdns password
controllerを作成します。
> ./script/padmin_create.pl controller Cat > vim lib/Padmin/C/Cat.pm package Padmin::C::Cat; use strict; use warnings; use base 'Catalyst::Controller'; sub index : Private { my ( $self, $c ) = @_; my @domains = $c->model('M::DNS::Domains')->search( {}, ); $c->stash->{domains} = \@domains; return; } sub domain : Local { my ( $self, $c ) = @_; my ( $domain_name ) = $c->req->arguments; my ( $domain ) = $c->model('M::DNS::Domains')->search( { name => $domain_name } ); $c->stash->{domain} = $domain; return; } 1;
viewを作成します。
> ./script/padmin_create.pl view TT TTSite
ドメインの一覧を表示するテンプレートを作成します。
> mkdir root/src/cat > vim root/src/cat/index [% c = Catalyst %] <h1>Domains</h1> [% FOR domain IN domains %] <ul> <li><a href="[% c.uri_for('/cat/domain') | html %]/[% domain.name | html %]">[% domain.name | html %]</a></li> </ul> [% END %]
ドメインのレコード一覧を表示するテンプレートを作成します。
> vim root/src/cat/domain <h1>[% domain.name | html %]</h1> <ul> [% FOR record IN domain.records %] <li>[% record.name | html %] <ul> <li>ID: [% record.id | html %]</li> <li>name: [% record.name | html %]</li> <li>type: [% record.type | html %]</li> <li>ttl: [% record.ttl | html %]</li> </ul> </li> [% END %] </ul>
アプリケーションを起動します。
> ./script/padmin_server.pl
ブラウザでhttp://
おわりに
サイト固有の要件をフロントエンドに実装すれば、
今回は紹介しませんでしたが、