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 が設定ファイルとなるので、ここでサーバの動作やゾーンファイルを指定してあげます。
$ 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"
デフォルトだとコメント文だけが書かれたファイルですが、最終行から追記してゆきます。
$ 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で設定したゾーンファイル格納用ディレクトリを作ります。
$ sudo mkdir /etc/nsd/zones/
$ sudo vim /etc/nsd/zones/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で作るわけではありません。
$ sudo service nsd rebuild
$ sudo service nsd reload
ゾーンファイルを更新したら、毎度rebuildしてDB作り直すこと。
これで動きます。
7.試す
自分自身に www.example.org
のAレコードを聞いてみましょう
$ dig @localhost www.example.com +norec
すると
; <<>> 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もきちんと動作している。