NSD 4.0.0b1 のゾーンの動的追加・削除を試す

NSD 3 系で悩みだったのが、ゾーンの追加・削除の際に、デーモンをリスタートしないといけない事でした。

僕の会社のコンテンツサーバは、結構な頻度でゾーンの追加・削除があるので、NSD に乗り換え候補にあげつつも、ちょっとなーなんて思っていた所、、、

NSD 4.0.0b1 がリリースされました。
[nsd-users] NSD 4.0.0b1 beta

The zone handling allows to addition and removal of zones on the fly.

との通り、ゾーンの追加・削除が動的にできるようになったとの事で、さっそく試して見ました。

  • 環境
    • CentOS 6.2 x86_64

インストールから起動まで

NSD3 系と同じ手順でインストールできました。

ビルド・インストール

# cd /usr/local/src
# wget http://nlnetlabs.nl/downloads/nsd/nsd-4.0.0b1.tar.gz
# tar zxvf nsd-4.0.0b1.tar.gz 
# cd nsd-4.0.0b1
# ./configure --prefix=/usr/local/nsd
# make
# make install

ユーザ追加・パーミッション変更

# useradd -s /sbin/nologin -M nsd
# chown nsd:nsd /usr/local/nsd/var/db/nsd

<prefix>/var/db/nsd は、nsd ユーザで書き込みが発生するので、パーミッションを変更する。

起動スクリプト配置

# cd /usr/local/src/nsd-4.0.0b1/contrib
# vi nsd.init
------
#configfile="/etc/nsd.conf"
configfile="/usr/local/nsd/etc/nsd/nsd.conf"

#sbindir="/usr/sbin"
sbindir="/usr/local/nsd/sbin"  
------
# install -o root -g root -m 755 nsd.init /etc/init.d/nsd
# chkconfig --add nsd

設定

# /usr/local/nsd/etc/nsd
# cp -a nsd.conf.sample nsd.conf
# cat nsd.conf | grep -v "#" | grep -v "^$"
------
server:  
        username: nsd
        zonelistfile: "/usr/local/nsd/var/db/nsd/zone.list"
        database: "/usr/local/nsd/var/db/nsd/nsd.db"
        pidfile: "/usr/local/nsd/var/db/nsd/nsd.pid"
        xfrdfile: "/usr/local/nsd/var/db/nsd/xfrd.state"
        hide-version: yes
remote-control:  
        control-enable: yes
pattern:  
        name: "myzones"
        zonefile: "zones/%s"
------

→ 動的な追加・削除用に pattern ディレクティブを設定します。
→ zone ディレクティブは従来通りの動作をします。

remote-control 準備

# cd /usr/local/nsd/sbin
# ./nsd-control-setup

ゾーンファイル作成

# cd /usr/local/nsd/etc/nsd
# mkdir zones
# vi zones/example.com
------
$TTL 3600
@               IN      SOA     ns1.example.com. hostmaster.example.com. (
                                2012121301      ;serial
                                10800           ;refresh
                                3600            ;retry
                                604800          ;expire
                                600 )           ;negcache

@               IN      NS      ns1.example.com.
@               IN      NS      ns2.example.com.
ns1             IN      A       10.0.0.11  
ns2             IN      A       172.16.0.11

@               IN      A       192.0.43.10
------

起動

# /etc/init.d/nsd start

いざ実験

# dig +noall +answer @localhost example.com a

まず引いてみる。
まだゾーンはないので、引けない。

# /usr/local/nsd/sbin/nsd-control addzone example.com myzones
ok  

ゾーンを動的に追加する。
"myzones" は pattern ディレクティブの name ディレクティブの値。

# dig +noall +answer @localhost example.com a
example.com.            3600    IN      A       192.0.43.10  

もう一度引く。
ゾーンが追加され、レコードが引けた!

# /usr/local/nsd/sbin/nsd-control delzone example.com
ok  

ゾーンの動的削除

# dig +noall +answer @localhost example.com a

引けなくなった。

最後に

ずっと前から欲しかった機能なので、とてもうれしいです。
まだ 4 系最初のベータですが、正式版がいまから楽しみですね!