□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
とすると、
にアクセスすると、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アドレス
その他あちこち追記が必要ですョ。