BIND9 の脆弱性の対応に疲れた今日この頃、
なぜ BINDを使っているのか自問自答して欝になりかけた日もある(嘘)
そんなこんなで、 BIND9 との決別を決めた。
次の相棒は今 最もホットでナウい PowerDNS と NSD4 (beta)
この Post では PowerDNS にフォーカスする。
0. 検証環境
CPU : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz stepping 07
Memory : DDR3 1333 NonReg ECC 16GB
HDD : 146GB 15000rpm SAS RAID 1
OS : Ubuntu 12.04.2
DNS : PowerDNS 3.0
DB : MySQL 5.5.29
1. 構築手順(メモ程度)
- MySQL と PowerDNS のパッケージインストール
# apt-get install pdns-server pdns-backend-mysql mysql-server mysql-client
- MySQL にログインしてデータベースとテーブルを作る
# mysql -u root -p
mysql> create database pdns;
Query OK, 1 row affected (0.00 sec)
Create MySQL Usermysql> GRANT ALL ON pdnstest.* TO ‘pdns’@’localhost’ IDENTIFIED BY ‘hogehogepasswd’;
mysql> FLUSH PRIVILEGES;
Change Databasemysql> use pdns;
Database changed
Create Tablesmysql> create table domains (
id INT auto_increment,
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,
primary key (id)
) Engine=InnoDB;CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
) Engine=InnoDB;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
) Engine=InnoDB;mysql> quit;
- コンフィグを編集
ここでは Masterでの動作を念頭において設定している。
# vi /etc/powerdns/pdns.conf
allow-axfr-ips=10.200.8.0/24 # <- AXFRできるネットワーク or IPアドレス
config-dir=/etc/powerdns
daemon=yes
default-soa-name=ns0.mykw.jp # <- SOAレコードに書くDNSのホスト名
disable-axfr=no
disable-tcp=no
local-port=53
log-dns-details=yes
log-failed-updates=yes
logfile=/var/log/pdns.log
logging-facility=0
loglevel=4
master=yes
module-dir=/usr/lib/powerdns
negquery-cache-ttl=60
setgid=pdns
setuid=pdns
use-logfile=yes
version-string=powerdns
include=/etc/powerdns/pdns.d
DB接続情報は別ファイルに分けて書く
# vi /etc/powerdns/pdns.d/pdns.local.gmysql
# MySQL Configuration
#
# Launch gmysql backendlaunch=gmysql
gmysql-socket=/var/run/mysqld/mysqld.sock # <-ローカルの DB 使うなら Socket 使った方が
gmysql-user=pdns
gmysql-password=hogehogepasswd
gmysql-dbname=pdns
これで一通り使う準備は完了。
2. 既存のゾーンファイルを SQL に変換
PowerDNS には zone2sql という便利な SQL 変換スクリプトが標準で用意されている。
BIND で使っていたゾーンファイルを以下の手順で変換・DBへの投入を行う。
素直に変換できないことが多いので、named.conf 調整しながら変換しよう。
- ゾーンファイルを変換
# zone2sql –gmysql –dnssec=no –named-conf=/etc/bind/named.conf –start-id=1 > zone.sql
- 変換したレコードをDBにぶち込む
# mysql -updns -phogehogepasswd pdns < zone.sql
- 変換したゾーンに MASTER のフラグを立てる
これをしないと AUTOSERIAL が有効にならない。
# mysql -u pdns -phogehogepasswd -e “update pdns.domains set type=’MASTER’;”
詳しい説明については公式サイトの Wiki にお任せしよう。
http://wiki.powerdns.com/trac/wiki/Zone2SQLFAQ
これでお引越しは完了したはずだ。
3. 動作確認
適当に dig とかして動作確認をしてみよう。
ちゃんと回答が帰ってくれば動いているはずだ。
# dig @10.200.4.230 mykw.jp soa
ついでに dnsperf でベンチマーク
32110 行のクエリリストを食わせて 4thread でいじめてみた
- PowerDNS
# dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300 DNS Performance Testing Tool Nominum Version 2.0.0.0 [Status] Command line: dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300 [Status] Sending queries (to 10.200.4.230) [Status] Started at: Fri Mar 15 18:01:29 2013 [Status] Stopping after 300.000000 seconds n[Status] Testing complete (time limit) Statistics: Queries sent: 33040355 Queries completed: 33040355 (100.00%) Queries lost: 0 (0.00%) Response codes: NOERROR 32976558 (99.81%), NXDOMAIN 63797 (0.19%) Average packet size: request 36, response 52 Run time (s): 300.000634 Queries per second: 110134.283916 Average Latency (s): 0.000890 (min 0.000144, max 0.431226) Latency StdDev (s): 0.001421
ちなみにBINDは以下のような結果になった。
- BIND 9.8.1-P1
# dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
DNS Performance Testing Tool
Nominum Version 2.0.0.0[Status] Command line: dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
[Status] Sending queries (to 10.200.4.230)
[Status] Started at: Sun Mar 31 00:28:16 2013
[Status] Stopping after 300.000000 seconds[Status] Testing complete (time limit)
Statistics:
Queries sent: 58084969
Queries completed: 58084969 (100.00%)
Queries lost: 0 (0.00%)Response codes: NOERROR 57898647 (99.68%), NXDOMAIN 112154 (0.19%), REFUSED 74168 (0.13%)
Average packet size: request 36, response 225
Run time (s): 300.003788
Queries per second: 193614.118632Average Latency (s): 0.000313 (min 0.000227, max 0.060098)
Latency StdDev (s): 0.000382
4. まとめ
前項の結果でも分かるように BIND9 は意外に早かった。
とはいえ、今年も夏のアップデート祭り(予定)に参戦するのはイヤということで
しばらく自宅環境はPowerDNSで頑張ってみることにした。
ちなみに今回使ったマシンの前にはRAIDキャッシュなしのマシンで検証していたのだが、
スコアは半分ぐらいであまりふるわない成績だった。
SQL を使っているので Disk I/O に引っ張られる印象があるが、
update が多いようなアプリケーションではないので DISKが遅いマシンでも
querycache をたんまり盛ってあげればそこそこ捌いてくれそうな気がする。
SSDとかNANDフラッシュ系の高級ストレージって楽するという選択もありですかね。
空から iodrive か intel SSD 910 降ってこないかな。
“BIND9 からの卒業 – PowerDNS 3.0 編” への1件の返信