NLnet Labs - Name Server Daemon (NSD) -

会社の新Webサーバの更改も大詰めを迎えています(近日の早朝リリースです)。CenOS 7でのサーバ構築は、仕事としては初なので、プライベートサーバの構築とは違った苦労があります。まぁ、一人で作業しているので、独断で決めますけどね。他人に相談しているとまとまる話もまとまらないんで。最近は意見が立派な割に「責任を負いたくない=自分ではやりたくない」アドバイス専門というか机上の空論を唱える人が少なからず居るので、誰かがえいやってやってしまわないと先に進めないのです。それが良いか悪いかは別にして(笑)。

話が脱線しますが、「結婚しない人が増えた」のは相手が居る居ない以前の話として

結婚という名の責任を負いたくない男性が増えて、そんな男性に女性が愛想を尽かした

結果なのでは?と考えています。少食系男子なんて...ねぇ、声高らかに謳うもんじゃないですよ(オマエが言うなって話ですが)。とある職場では

社員が義務を果たさずに権利ばかりを主張して困る

という声も聞かれました。世界的情勢を見ても自国の利益ばかり求めているのは、個々のそういった利己主義が国家レベルに反映されているのかもしれません。

さて、新Webサーバ上でのDNSサーバはセカンダリとして動作させるのですが、BINDは脆弱性が多いので、NSDで動かすことにしました。タイムリーなことに日経ネットワークの2017年5月号に「安全DNSの極意」という特集記事が載っています。NSDの記事は少なすぎて参考になりませんでしたが。

NSD(権威DNSサーバ専用)のインストール

さくらインターネットのサーバはデフォルトでEPELが有効になっているため、yumコマンドで簡単にインストールできます。

[root@localhost ~]# yum -y install nsd
(-snip-)
===================================================================...
 Package                     Arch                      Version     
===================================================================...
Installing:
 nsd                         x86_64                    4.1.14-2.el7...
Installing for dependencies:
 libevent                    x86_64                    2.0.21-4.el7...

Transaction Summary
===================================================================...
Install  1 Package (+1 Dependent package)
(-snip-)
[root@localhost ~]#

ディレクトリの作成

chrootで動作させることもあり、標準ディレクトリ以外は自動で作成されませんので、手動で作成します。パーミッションも変更しておきます。

[root@localhost ~]# mkdir -p /etc/nsd/{,conf.d/}backup /var/lib/nsd/{zones,db,tmp,etc}
[root@localhost ~]# chown -R nsd:nsd /var/lib/nsd

timezoneをsymlinkさせる

chrootしてしまうとログの時間がローカルタイムではなくなるので、timezoneファイルをシンボリックリンクで作成しますコピーします(シンボリックリンクではchrootした後にアクセスできなくなる為)。

[root@localhost ~]# cp -p /usr/share/zoneinfo/Asia/Tokyo /var/lib/nsd/etc/localtime
[root@localhost ~]#

設定ファイル(/etc/nsd/nsd.conf)の編集

オリジナルをバックアップしてから編集するようにします。編集というか、丸々上書きしちゃうのですが(笑)

[root@localhost ~]# mv -v /etc/nsd/nsd.conf /etc/nsd/backup/nsd.conf-orig
'/etc/nsd/nsd.conf' -> '/etc/nsd/backup/nsd.conf-orig'
[root@localhost ~]# cat > /etc/nsd/nsd.conf <<'EOF'
server:
    server-count:   1
    ip-address:     0.0.0.0
    ip-address:     ::0
    ip-transparent: no
    ip-freebind:    no
    reuseport:      no
    debug-mode:     no
    do-ip4:         yes
    do-ip6:         yes
    port:           53
    verbosity:      0
    username:       nsd
    chroot:         "/var/lib/nsd"
    zonesdir:       "/var/lib/nsd/zones"
    zonelistfile:   "/var/lib/nsd/zone.list"
    database:       "/var/lib/nsd/db/nsd.db"
    logfile:        "/var/lib/nsd/nsd.log"
    pidfile:        "/var/lib/nsd/nsd.pid"
    xfrdfile:       "/var/lib/nsd/ixfr.state"
    xfrdir:         "/var/lib/nsd/tmp"
    hide-version:   no
    version:        "NSD"
    identity:       "unidentified server"

    # Optional local server config
    include:        "/etc/nsd/server.d/*.conf"

    # Include zone configs.
    include:        "/etc/nsd/conf.d/*.conf"

# Remote control config section.
remote-control:
    control-enable:    yes
    control-interface: 127.0.0.1
    control-interface: ::1
    control-port:      8952
    server-key-file:   "/etc/nsd/nsd_server.key"
    server-cert-file:  "/etc/nsd/nsd_server.pem"
    control-key-file:  "/etc/nsd/nsd_control.key"
    control-cert-file: "/etc/nsd/nsd_control.pem"
EOF
[root@localhost ~]#

設定項目の多くはデフォルト値のままですが、コメントを外して明示的に指定するようにしてあります。
chrootはデフォルトでは無効のため、有効にするためには明示的にディレクトリを指定する必要があります。標準の/etc/nsdのままだと不都合が多かったので、以下のように変更しました。全てのファイルをchrootで指定したディレクトリに移動する必要はないようです(デーモンが起動時に読むファイルは/etc/nsdにあっても問題ありませんでした)。

chroot: "/etc/nsd" → "/var/lib/nsd"
zonesdir: "/etc/nsd" → "/var/lib/nsd/zones"
database: "" → "/var/lib/nsd/db/nsd.db"
logfile: "/var/log/nsd.log" → "/var/lib/nsd/nsd.log"
xfrdir: "/tmp" → "/var/lib/nsd/tmp"

個別ドメインファイル(/etc/nsd/conf.d/*.conf)の作成

各ドメイン毎に設定ファイルを作成することにしました。ドメインの追加・削除があってもそのファイルを消すだけになり、運用が楽になります(ケアレスミスを減らせます...まったく別のファイルを操作されたらアウトですが)。

[root@localhost ~]# cat > /etc/nsd/conf.d/206rc.net.conf <<EOF
zone:
    name: "206rc.net"
    zonefile: "206rc.net.zone"
    request-xfr: プライマリDNSサーバのIPアドレス NOKEY
    allow-notify: プライマリDNSサーバのIPアドレス NOKEY
EOF
[root@localhost ~]#

自動起動設定の有効化

サーバ起動時に自動でサービスが起動するように設定します。nsd-keygen.serviceは有効化しませんでしたが、nsd.serviceから呼ばれているようなので自動起動しなくとも問題はなさそうです。

[root@localhost ~]# systemctl list-unit-files --type=service | grep nsd
nsd-keygen.service                            disabled
nsd.service                                   disabled
[root@localhost ~]# systemctl enable nsd
Created symlink from /etc/systemd/system/multi-user.target.wants/nsd.service to /usr/lib/systemd/system/nsd.service.
[root@localhost ~]# systemctl list-unit-files --type=service | grep nsd
nsd-keygen.service                            disabled
nsd.service                                   enabled
[root@localhost ~]#

NSDサービスの起動

systemctlコマンドを使ってサービスを手動で起動させます。

[root@localhost ~]# systemctl start nsd
[root@localhost ~]# systemctl status nsd
* nsd.service - NSD DNS Server
   Loaded: loaded (/usr/lib/systemd/system/nsd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-04-18 16:03:22 JST; 4s ago
 Main PID: 11901 (nsd)
   CGroup: /system.slice/nsd.service
           |-11901 /usr/sbin/nsd -d -c /etc/nsd/nsd.conf
           |-11902 /usr/sbin/nsd -d -c /etc/nsd/nsd.conf
           `-11903 /usr/sbin/nsd -d -c /etc/nsd/nsd.conf

Apr 18 16:03:22 localhost.localdomain systemd[1]: Started NSD DNS Server.
Apr 18 16:03:22 localhost.localdomain systemd[1]: Starting NSD DNS Server...
[root@localhost ~]#

サービスが正常に起動すれば、プライマリDNSサーバからゾーン情報が転送されます。
BINDとは違って/var/lib/nsd/zonesディレクトリにファイルは作成されませんが、正常な動作です。
nsd-controlコマンドを使って

[root@localhost ~]# nsd-control write 206rc.net
ok
[root@localhost ~]#

とやると、初めてファイルが作成されます。このファイルが勝手に更新されるか...は試していません。
あとはdigコマンドで動作確認をしておしまいです。