Linux Install Memo

サーバー管理者によるLinux関連ソフトのインストールメモ

Home » □PowerDNS3.1のインストール

□PowerDNS3.1のインストール

□PowerDNS3.1のインストール

CentOS6.2からは完全になくなったので、新しいのを入れる。

・インストール

cd /etc/yum.repos.d/
wget http://www.monshouwer.eu/download/3rd_party/pdns-server/el6/pdns-server.el6.repo

としてリポジトリを追加してから

yum -y install pdns-server pdns-server-backend-postgresql

インストールが成功したら /etc/powerdns/ の中とかPostgreSQLとかを設定

・動作テスト

まず /etc/powerdns/pdns.conf に

launch=bind

が最後に書いてあるか確認。
(途中のはコメントアウトになっているが気にしない)

そしてテスト起動

/etc/init.d/pdns-server monitor

すると、

> Jun 19 02:17:14 Reading random entropy from ‘/dev/urandom’
> Jun 19 02:17:14 This is a standalone pdns
> Jun 19 02:17:14 It is advised to bind to explicit addresses with the –local-address option
> Jun 19 02:17:14 UDP server bound to 0.0.0.0:53
> Jun 19 02:17:14 TCP server bound to 0.0.0.0:53
> Jun 19 02:17:14 PowerDNS 3.1 (C) 2001-2012 PowerDNS.COM BV (May  4 2012, 13:04:27, gcc 4.4.6 20110731 (Red Hat 4.4.6-3)) starting up
> Jun 19 02:17:14 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
> Jun 19 02:17:14 Set effective group id to 25
> Jun 19 02:17:14 Set effective user id to 25
> Jun 19 02:17:14 Creating backend connection for TCP
> Jun 19 02:17:14 About to create 3 backend threads for UDP
> % Jun 19 02:17:14 Done launching threads, ready to distribute questions

と、こんな感じで起動して、モニターモードとなる。

show *

とすると、見れるステータスとその現在の数値が表示される。

> corrupt-packets=0,deferred-cache-inserts=0,deferred-cache-lookup=0,latency=0,packetcache-hit=0,packetcache-miss=0,packetcache-size=0,qsize-q=0,query-cache-hit=0,query-cache-miss=0,recursing-answers=0,recursing-questions=0,servfail-packets=0,tcp-answers=0,tcp-queries=0,timedout-packets=0,udp-answers=0,udp-queries=0,udp4-answers=0,udp4-queries=0,udp6-answers=0,udp6-queries=0,

抜けるには quit とする。

・PowerDNSのデータベースに関する設定

PostgreSQLを使うので /etc/powerdns/pdns.conf に必要事項を追記

emacs /etc/powerdns/pdns.conf

launch=gpgsql
gpgsql-host=192.168.100.200
gpgsql-user=hogehoge
gpgsql-password=hogepasswd
gpgsql-port=5432
gpgsql-dbname=hogehoge_db

として、さらにPostgreSQLの設定をする。
(まだここでは本格起動しない)

・PostgreSQLの設定

service postgresql initdb
/etc/init.d/postgresql start

su – postgres
createuser -A -D -P -E hogehoge

hogepasswd をパスワードとする。

createdb hogehoge_db –encoding=UTF8 –owner hogehoge

外部からアクセスができるようにpostgresql.confに以下を追加する。

emacs /var/lib/pgsql/9.2/data/postgresql.conf

> listen_addresses = ‘*’                  # what IP address(es) to listen on;
>                                         # comma-separated list of addresses;
>                                         # defaults to ‘localhost’, ‘*’ = all
>                                         # (change requires restart)
> port = 5432                             # (change requires restart)
> max_connections = 1000                  # (change requires restart)
> # Note:  Increasing max_connections costs ~400 bytes of shared memory per
> # connection slot, plus lock space (see max_locks_per_transaction).
> superuser_reserved_connections = 20     # (change requires restart)
> shared_buffers = 128MB                  # min 128kB
> temp_buffers = 32MB                     # min 800kB
> work_mem = 128MB                        # min 64kB
> maintenance_work_mem = 128MB            # min 1MB
> max_stack_depth = 2MB                   # min 100kB
> effective_io_concurrency = 2            # 1-1000. 0 disables prefetching
> random_page_cost = 2.0                  # same scale as above

さらに共有メモリも少なかったら増やす。

emacs /etc/sysctl.conf

> # Controls the maximum shared segment size, in bytes
> kernel.shmmax = 68719476736
>
> # Controls the maximum number of shared memory segments, in pages
> kernel.shmall = 4294967296

さらにpg_hba.confに以下を追加する。

emacs /var/lib/pgsql/9.2/data/pg_hba.conf

> # TYPE  DATABASE        USER            ADDRESS                 METHOD
>
> # “local” is for Unix domain socket connections only
> local   all             all                                     peer
> # IPv4 local connections:
> host    all             all             127.0.0.1/32            ident
> # IPv6 local connections:
> host    all             all             ::1/128                 ident
> # Allow replication connections from localhost, by a user with the
> # replication privilege.
> #local   replication     postgres                                peer
> #host    replication     postgres        127.0.0.1/32            ident
> #host    replication     postgres        ::1/128                 ident
> host    hogehoge_db     hogehoge        192,168.100.0/24        md5

これだけだとiptablesではじかれるので、/etc/sysconfig/iptablesとか
/etc/sysconfig/ip6tablesに以下を追加する。

emacs /etc/sysconfig/iptables; emacs /etc/sysconfig/ip6tables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 5432 -j ACCEPT

/etc/init.d/iptables restart
/etc/init.d/postgresql-9.2 restart

※共有メモリも設定したならサーバーも再起動すること

psql -d hogehoge_db -h 192.168.100.200 -U hogehoge

として、接続できる事を確認したら次に進む

・基本的なテーブル生成

drop table domains;
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);

ALTER SEQUENCE domains_id_seq CYCLE;

drop table records;
CREATE TABLE records (
        id              SERIAL PRIMARY KEY,
        domain_id       INT DEFAULT NULL,
        name            VARCHAR(255) DEFAULT NULL,
        type            VARCHAR(10) 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);

ALTER SEQUENCE records_id_seq CYCLE;

drop table supermasters;
create table supermasters (
   ip VARCHAR(25) NOT NULL,
   nameserver VARCHAR(255) NOT NULL,
   account VARCHAR(40) DEFAULT NULL
);

GRANT SELECT ON supermasters TO hogehoge;
GRANT ALL ON domains TO hogehoge;
GRANT ALL ON domains_id_seq TO hogehoge;
GRANT ALL ON records TO hogehoge;
GRANT ALL ON records_id_seq TO hogehoge;

・さらにDNSSECを使う場合のテーブル生成

alter table records add ordername       VARCHAR(255);
alter table records add auth bool;
create index orderindex on records(ordername);

drop table domainmetadata;
create table domainmetadata (
 id             SERIAL PRIMARY KEY,
 domain_id      INT REFERENCES domains(id) ON DELETE CASCADE,
 kind           VARCHAR(16),
 content        TEXT
);

ALTER SEQUENCE domainmetadata_id_seq CYCLE;

drop table cryptokeys;
create table cryptokeys (
 id             SERIAL PRIMARY KEY,
 domain_id      INT REFERENCES domains(id) ON DELETE CASCADE,
 flags          INT NOT NULL,
 active         BOOL,
 content        TEXT
);              

GRANT ALL ON domainmetadata TO hogehoge;
GRANT ALL ON domainmetadata_id_seq TO hogehoge;
GRANT ALL ON cryptokeys TO hogehoge;
GRANT ALL ON cryptokeys_id_seq TO hogehoge;

ALTER SEQUENCE cryptokeys_id_seq CYCLE;

drop table tsigkeys;
create table tsigkeys (
 id             SERIAL PRIMARY KEY,
 name           VARCHAR(255),
 algorithm      VARCHAR(255),
 secret         VARCHAR(255)
);

create unique index namealgoindex on tsigkeys(name, algorithm);

GRANT ALL ON tsigkeys TO hogehoge;
GRANT ALL ON tsigkeys_id_seq TO hogehoge;
alter table records alter column type type VARCHAR(10);

ALTER SEQUENCE tsigkeys_id_seq CYCLE;

作ったら全てちゃんと出来ているか確認すること。

> hogehoge_db=> \d
>                    リレーションの一覧
>  スキーマ |         名前          |     型     | 所有者
> ———-+———————–+————+——–
>  public   | cryptokeys            | テーブル   | hogehoge
>  public   | cryptokeys_id_seq     | シーケンス | hogehoge
>  public   | domainmetadata        | テーブル   | hogehoge
>  public   | domainmetadata_id_seq | シーケンス | hogehoge
>  public   | domains               | テーブル   | hogehoge
>  public   | domains_id_seq        | シーケンス | hogehoge
>  public   | records               | テーブル   | hogehoge
>  public   | records_id_seq        | シーケンス | hogehoge
>  public   | supermasters          | テーブル   | hogehoge
>  public   | tsigkeys              | テーブル   | hogehoge
>  public   | tsigkeys_id_seq       | シーケンス | hogehoge
> (11 行)
さて、ここまでできたら下準備完了なので、PowerDNSをモニターモードで
起動して、PostgreSQLと通信ができている事を確認する。

/etc/init.d/pdns-server monitor

として、

> Jun 19 02:31:46 Reading random entropy from ‘/dev/urandom’
> Jun 19 02:31:46 This is module gpgsqlbackend.so reporting
> Jun 19 02:31:46 This is a standalone pdns
> Jun 19 02:31:46 It is advised to bind to explicit addresses with the –local-address option
> Jun 19 02:31:46 UDP server bound to 0.0.0.0:53
> Jun 19 02:31:46 TCP server bound to 0.0.0.0:53
> Jun 19 02:31:46 PowerDNS 3.1 (C) 2001-2012 PowerDNS.COM BV (May  4 2012, 13:04:27, gcc 4.4.6 20110731 (Red Hat 4.4.6-3)) starting up
> Jun 19 02:31:46 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
> Jun 19 02:31:46 Creating backend connection for TCP
> % Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 About to create 3 backend threads for UDP
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 gpgsql Connection successful
> Jun 19 02:31:46 Done launching threads, ready to distribute questions

と、こんな感じで繋がっていることが確認できたらOK。

いったんquitでモニターモード抜けて、今度はちゃんと起動してクエリを
投げてみましょう。

/etc/init.d/pdns-server start

> Starting PowerDNS authoritative nameserver: started

としてスタートしたら

host www.test.com 127.0.0.1

とでもしてみて

> Using domain server:
> Name: 127.0.0.1
> Address: 127.0.0.1#53
> Aliases:

というようにちゃんと繋がればOK。
動いていないとだんまりになる。

これじゃ面白くないので、サンプルデータを入れてみる。

psql -d hogehoge_db -h 192.168.100.200 -U hogehoge

INSERT INTO domains (name, type) values (‘test.com’, ‘NATIVE’);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
  VALUES (1,’test.com’,’localhost ahu@ds9a.nl 1′,’SOA’,86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
  VALUES (1,’test.com’,’dns-us1.powerdns.net’,’NS’,86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
 VALUES (1,’test.com’,’dns-eu1.powerdns.net’,’NS’,86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
 VALUES (1,’www.test.com’,’199.198.197.196′,’A’,120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
 VALUES (1,’mail.test.com’,’195.194.193.192′,’A’,120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
 VALUES (1,’localhost.test.com’,’127.0.0.1′,’A’,120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
 VALUES (1,’test.com’,’mail.test.com’,’MX’,120,25);

ちゃんと入ったら、さっきのコマンドをもう一度やってみると

> # host www.test.com 127.0.0.1
> Using domain server:
> Name: 127.0.0.1
> Address: 127.0.0.1#53
> Aliases:
>
> www.test.com has address 199.198.197.196

とか

> # nslookup -type=NS test.com 127.0.0.1
> Server:         127.0.0.1
> Address:        127.0.0.1#53
>
> test.com        nameserver = dns-us1.powerdns.net.
> test.com        nameserver = dns-eu1.powerdns.net.

と、ちゃんとでてきました。:-)

ステータスを取得してみると

/etc/init.d/pdns-server dump

> corrupt-packets=0,deferred-cache-inserts=0,deferred-cache-lookup=0,latency=0,packetcache-hit=3,packetcache-miss=10,packetcache-size=0,qsize-q=1,query-cache-hit=30,query-cache-miss=12,recursing-answers=0,recursing-questions=0,servfail-packets=0,tcp-answers=0,tcp-queries=0,timedout-packets=0,udp-answers=13,udp-queries=13,udp4-answers=13,udp4-queries=13,udp6-answers=0,udp6-queries=0,

ちゃんと udp-answers=13,udp-queries=13,udp4-answers=13,udp4-queries=13
などとカウントアップしているのがわかる。

あとは自動起動するように設定して、

chkconfig –add pdns-server
chkconfig –level 345 pdns-server on

外部からのリクエストにも答えよう

emacs /etc/sysconfig/iptables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 53 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 53 -j ACCEPT

/etc/init.d/iptables restart

> # host www.test.com 192.168.100.200
> Using domain server:
> Name: 192.168.100.200
> Address: 192.168.100.200#53
> Aliases:
>
> www.test.com has address 199.198.197.196

・WEBでステータス確認

pdns.confに以下を追記

emacs /etc/powerdns/pdns.conf

> #
> # PostgreSQL Setting
> #
> launch=gpgsql
> gpgsql-host=192.168.100.200
> gpgsql-user=hogehoge
> gpgsql-password=hogepasswd
> gpgsql-port=5432
> gpgsql-dbname=hogehoge_db
> #
> # Web Status Setting
> #
> webserver=yes
> webserver-address=0.0.0.0
> webserver-password=hogepasswd
> webserver-port=8023

emacs /etc/sysconfig/iptables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 8023 -j ACCEPT

/etc/init.d/iptables restart
/etc/init.d/pdns-server restart

とすると、

http://192.168.100.200:8023/

にアクセスすると、IDとパスワードを聞かれるので、IDはアルファベット
を『適当に』入れて、パスワードは設定したものを入れる。
(IDは必ず入れないとダメ)

あとは、もし動作状況をsyslog経由で出力したい場合には

emacs /etc/powerdns/pdns.conf

> #
> # SYSLOG Setting
> #
> logging-facility=4
> loglevel=4

emacs /etc/syslog.conf

> # PowerDNS
> local0.info                                             -/var/log/pdns.info
> local0.warn                                             -/var/log/pdns.warn
> local0.err                                              /var/log/pdns.err

/etc/init.d/syslog restart

こんな感じで追加すればよい。

ここまででとりあえずの設定は終わり。

あとはデータベースの中の情報をこねくり回す、ということになる。

□PowerDNSの実際の検証

・/etc/powerdns/pdns.confの各パラメーターの説明

http://doc.powerdns.com/all-settings.html

emacs /etc/powerdns/pdns.conf

> #
> # PowerDNS Setting
> #
> do-ipv6-additional-processing=yes
> soa-expire-default=600
> soa-minimum-ttl=300
> soa-refresh-default=600
> soa-retry-default=180

この辺は要設定&調整かと。

・domains_idはカウントアップしていくだけ

1から始まって、最大値は9223372036854775807なんだけど、これって最大値
に達したらどうなるんだろ?

というわけで、暗黙的に生成されるシーケンシャルテーブルを輪番モード
(is_cycled=ture)にしてみる。

ALTER SEQUENCE domains_id_seq CYCLE;
ALTER SEQUENCE records_id_seq CYCLE;
ALTER SEQUENCE domainmetadata_id_seq CYCLE;
ALTER SEQUENCE cryptokeys_id_seq CYCLE;
ALTER SEQUENCE tsigkeys_id_seq CYCLE;

・IPv6でもDNSクエリを受ける場合には、pdns.confに以下のように設定すること。

local-ipv6=IPv6アドレス

その他あちこち追記が必要ですョ。

 

Name of author

Name: admin

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です