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

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

# 2.構築する環境
サーバは[さくらのクラウド](http://cloud.sakura.ad.jp/)を利用しますが、既にサーバを持っている場合にでも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 が設定ファイルとなるので、ここでサーバの動作やゾーンファイルを指定してあげます。

```bash: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"
```

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

```bash: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で設定したゾーンファイル格納用ディレクトリを作ります。

```bash:mkdir
$ sudo mkdir /etc/nsd/zones/
```

```bash:open_zonefile
$ sudo vim /etc/nsd/zones/example.com.zone
```
　

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

```bash: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で作るわけではありません。

```bash:nsd_rebuild_reload
$ sudo service nsd rebuild
$ sudo service nsd reload
```
ゾーンファイルを更新したら、毎度rebuildしてDB作り直すこと。
これで動きます。


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

```bash:dns_query
$ dig @localhost www.example.com +norec
```

すると

```bash: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もきちんと動作している。