BIND9 からの卒業 – NSD4 beta4 編

BIND9  の脆弱性の対応に疲れた今日この頃、

(前回のPOSTと以下同文)

この Post では NSD4 beta4 にフォーカスする。

NSD と言えば趣味で DNS をやっているハートビーツ社の滝澤さんが
大変参考になる資料を公開してくれているのでありがたく参考にさせていただきます。
(いつもありがとうございます)

 

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 : NSD4 beta4

 

1. 構築手順(メモ程度)

※大先生にダメ出しされたので configure option などを見直しました。(2013/04/01)
https://twitter.com/ipv6labs/status/318402235610583043

  • 必要なパッケージのインストール

# apt-get install gcc make libssl-dev libevent-dev

  • グループとユーザの追加

# groupadd nsd

# useradd nsd -g nsd

  • ソースを落としてきて make する

# cd /tmp

# wget http://nlnetlabs.nl/downloads/nsd/nsd-4.0.0b4.tar.gz

# tar xf nsd-4.0.0b4.tar.gz

# cd nsd-4.0.0b4/

# ./configure \
–prefix=/usr/local \
–enable-ratelimit \
–with-user=nsd \
–with-libevent \
–with-ssl \
–with-configdir=/etc/nsd4 \
–with-zonesdir=/etc/nsd4/zones \
–with-zonelistfile=/var/cache/nsd4/zone.list \
–with-dbfile=/var/cache/nsd4/zone.db \
–with-xfrdfile=/var/cache/nsd4/xfrd.state \
–with-pidfile=/var/run/nsd4/nsd4.pid \
–with-logfile=/var/log/nsd4.log

# make && make install

  • ちなみに以下のファイルがインストールされるみたいです。

./install-sh -c -d /usr/local/sbin
./install-sh -c -d /etc/nsd4
./install-sh -c -d /var/run/nsd4
./install-sh -c -d /tmp
./install-sh -c -d /var/cache/nsd4
./install-sh -c -d /usr/local/share/man
./install-sh -c -d /usr/local/share/man/man8
./install-sh -c -d /usr/local/share/man/man5
./install-sh -c nsd /usr/local/sbin/nsd
./install-sh -c nsd-control-setup.sh /usr/local/sbin/nsd-control-setup
./install-sh -c nsd-checkconf /usr/local/sbin/nsd-checkconf
./install-sh -c nsd-control /usr/local/sbin/nsd-control
./install-sh -c -m 644 ./nsd.8 /usr/local/share/man/man8
./install-sh -c -m 644 ./nsd-checkconf.8 /usr/local/share/man/man8/nsd-checkconf.8
./install-sh -c -m 644 ./nsd-control.8 /usr/local/share/man/man8/nsd-control.8
./install-sh -c -m 644 ./nsd.conf.5 /usr/local/share/man/man5/nsd.conf.5
./install-sh -c -m 644 nsd.conf.sample /etc/nsd4/nsd.conf.sample

  • 必要なディレクトリを作ってユーザ/グループを変更

# mkdir /etc/nsd4/zones

# chown -R nsd:nsd /etc/nsd4/zones/ /var/cache/nsd4/

  • nsd-control に必要な鍵の生成

# nsd-control-setup

  • コンフィグを書く

# vi /etc/nsd4/nsd.conf

server:
username: nsd
zonesdir: “/etc/nsd4/zones”
zonelistfile: “/var/cache/nsd4/zone.list” # <- これがないと patterns (ゾーンの動的追加・削除)が使用できない
database: “/var/cache/nsd4/zone.db”
logfile: “/var/log/nsd4.log”
pidfile: “/var/run/nsd4/nsd4.pid”
xfrdfile: “/var/cache/nsd4/xfrd.state”

remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: “/etc/nsd4/nsd_server.key”
server-cert-file: “/etc/nsd4/nsd_server.pem”
control-key-file: “/etc/nsd4/nsd_control.key”
control-cert-file: “/etc/nsd4/nsd_control.pem”

# ここから下が NSD4の目玉「patterns」

pattern:
name: “masterzone”
zonefile: “%s.zone”
notify: 10.200.4.226 NOKEY
provide-xfr: 10.200.4.226 NOKEY

pattern:
name: “slavezone”
zonefile: “%s.zone”
allow-notify: 10.200.4.226 NOKEY
request-xfr: AXFR 10.200.4.226 NOKEY

 

2. 既存のゾーンファイルを登録

以下のコマンド1行でゾーンの追加が可能だ。

便利過ぎて吐き気がするぜ。

  • 文法

# nsd-control addzone [DOMAINNAME] [pattern]

  • 実行例

# nsd-control addzone mykw.jp masterzone

ok

# nsd-control addzone wktk.so slavezone
ok

数万ゾーンあるといちいち手打ちするのは骨が折れるのでワンライナー

# for i in `ls -1 | sed ‘s/\(.*\).zone/\1/g’` ; do nsd-control addzone $i masterzone ; done

登録されたか確認

# nsd-control zonestatus
zone: mykw.jp
pattern: masterzone
state: master
zone: wktk.so
pattern: slavezone
state: refreshing
served-serial:  “2013031900 since 2013-04-01T22:48:39”
commit-serial:  “2013031900 since 2013-04-01T22:48:39”

これでお引越しは完了したはずだ。

 

3. 動作確認

適当に dig とかして動作確認をしてみよう。

ちゃんと回答が帰ってくれば動いているはずだ。

# dig @10.200.4.230 mykw.jp soa

ついでに dnsperf でベンチマーク

前回と同じ条件で 32110 行のクエリリストを食わせて 4thread でいじめてみた

  • NSD4 beta4

# dnsperf -c 4 -s 10.200.4.226 -d querylist -l 300
DNS Performance Testing Tool
Nominum Version 2.0.0.0

[Status] Command line: dnsperf -c 4 -s 10.200.4.226 -d querylist -l 300
[Status] Sending queries (to 10.200.4.226)
[Status] Started at: Mon Apr 1 00:41:22 2013
[Status] Stopping after 300.000000 seconds
[Status] Testing complete (time limit)

Statistics:

Queries sent: 44570073
Queries completed: 44570073 (100.00%)
Queries lost: 0 (0.00%)

Response codes: NOERROR 44427108 (99.68%), SERVFAIL 56908 (0.13%), NXDOMAIN 86057 (0.19%)
Average packet size: request 36, response 98
Run time (s): 300.002108
Queries per second: 148565.866077

Average Latency (s): 0.000619 (min 0.000157, max 0.035287)
Latency StdDev (s): 0.000160

 



ちなみに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.118632

Average Latency (s): 0.000313 (min 0.000227, max 0.060098)
Latency StdDev (s): 0.000382

 

4. まとめ

前項の結果でも分かるようにまたもや BIND9 は意外に早かった。

とはいえ、今年も夏のアップデート祭り(略)

クエリを捌く速さが劣っていたとしても NSD4 の素晴らしさは以下の点にあると思っているので
導入するメリットは十分あると思っている。

  • 権威サーバのみのシンプルな構成
  • 脆弱性が発見されることが少ない
  • pattern (macro) によるシンプルな設定ファイル
  • シンプルなオペレーション

シンプルなものほど美しいものはありません。

beta でも十分使えるレベルなので正式版が出るのが楽しみですね。