UbuntuServer14.04にNSDを入れてサクッと権威DNSサーバを作る

  • 4
    いいね
  • 0
    コメント

1.NSDとは

QiitaにNSDネタが少なかったので書くことにしました。
コンテンツサーバの機能のみを持ったオープンソースのDNSサーバで、シンプルかつ高速に動作することが特徴のようです。
キャッシュサーバが欲しければ、同じ開発元であるUnboundが吉でしょう。
当然権威DNSサーバなので、フルリゾルバとしては動きません。クライアントからの再帰問い合わせは受け付けてくれないので、digしてレコードを確かめる時は +norec を付けないと怒られます。
NSDとUnbound、BINDとの比較はこのSlideshareを参考にしてみて下さい。
とりあえず example.com が正引きできるところまでを構築してゆきます。

2.構築する環境

サーバはさくらのクラウドを利用しますが、既にサーバを持っている場合にでもOSがUbuntu Server 14.04であれば同じように導入可能と思われます。

サーバ構成
・CPU : 1Core
・Mem : 1GByte
・Storage : 20GB SSD
・OS : Ubuntu Server 14.04 LTS

3.サーバの事前準備

3.1 パッケージのアップデート

さくらのクラウドではサーバを通常作成するとグローバルIPアドレスが割り当てられるので、自身の端末からTeraTermなりでSSHします。
とりあえず

・sudo apt update
・sudo apt upgrade

はやっておきましょう。
後は自分が欲しいパッケージを入れます。(僕はvimが好きなのでvimを入れます。nanoでもいいですよ!)

・sudo apt install vim
・sudo apt install dnsutils ※

※さくらのUbuntu14.04アーカイブではdigが最初から利用できるのですが、入っていない方は dnsutils で入ります。

3.2 NSDのインストール

sudo apt install nsd3 で入ります。

4.NSDの設定

NSDは、ubuntuだと /etc/nsd/nsd.conf が設定ファイルとなるので、ここでサーバの動作やゾーンファイルを指定してあげます。

NSD_Setting
$ sudo vim /etc/nsd/nsd.conf

# NSD configuration file for Debian.
#
# See the nsd.conf(5) man page.
#
# See /usr/share/doc/nsd/examples/nsd.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/nsd/nsd.conf.d directory.
# WARNING: The glob style doesn't work yet...
# include: "/etc/nsd/nsd.conf.d/*.conf"

デフォルトだとコメント文だけが書かれたファイルですが、最終行から追記してゆきます。

NSD_Setting
$ sudo vim /etc/nsd/nsd.conf

# 上のコメント文は省略
server:

logfile: "/var/log/nsd.log"
zonesdir: "/etc/nsd/zones"

zone:
    name: "example.com"
    zonefile: "example.com.zone"

ログファイルのディレクトリ、ゾーンファイルが格納されているディレクトリを指定します。
DNSサーバで管理したいゾーンは、ゾーンディレクトリ内に hoge.zone 形式でゾーンファイルを作ります。
そのゾーンファイルを読み込ませるために、 nsd.conf にもゾーンの追記が必要です。
nameとzonefileを同じにしておくと管理しやすくてGood

5.ゾーンファイルの設定

4でNSDの基礎設定が完了したので、ゾーンファイルの設定を行います。
そのまえに、nsd.confで設定したゾーンファイル格納用ディレクトリを作ります。

mkdir
$ sudo mkdir /etc/nsd/zones/
open_zonefile
$ sudo vim /etc/nsd/zones/example.com.zone

 

とりあえずガーッと一気にレコードを書きます。

example.com.zone
$TTL    1
$ORIGIN example.com.
@ IN  SOA ns.example.com. root.example.com. (
        2016121601      ; serial number
        10800           ; Refresh
        3600            ; Retry
        604800          ; Expire
        1               ; Min TTL
)
                IN      NS      ns.example.com.
                IN      A       192.0.2.53
www             IN      A       192.0.2.80
ns              IN      A       192.0.2.53

最低限SOA/NS/Aを書きました。(普通はTTL1なんかで使わないので、実環境で利用される場合は十分注意してください)
ゾーンファイルの書き方詳細は以下を参照
http://www.obenri.com/_dnsserver/zone_form.html

6.設定の反映・NSDの起動

NSDはデータベースで動くため、ゾーンを編集するとDBの作り直しが必要になります。.dbファイルは /var/lib/nsd にあります。
DBと言っても、PostgresやMySQLで作るわけではありません。

nsd_rebuild_reload
$ sudo service nsd rebuild
$ sudo service nsd reload

ゾーンファイルを更新したら、毎度rebuildしてDB作り直すこと。
これで動きます。

7.試す

自分自身に www.example.org のAレコードを聞いてみましょう

dns_query
$ dig @localhost www.example.com +norec

すると

dns_answer
; <<>> DiG 9.9.5-3ubuntu0.10-Ubuntu <<>> @localhost www.example.com +norec
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4919
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.example.com.               IN      A

;; ANSWER SECTION:
www.example.com.        1       IN      A       192.0.2.80

;; AUTHORITY SECTION:
example.com.            1       IN      NS      ns.example.com.

;; ADDITIONAL SECTION:
ns.example.com.         1       IN      A       192.0.2.53

;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Dec 16 20:07:20 JST 2016
;; MSG SIZE  rcvd: 93

おお、ちゃんと設定した192.0.2.80が返ってきた。authority/glueもきちんと動作している。