内向けと外向けにNSDを２つ起動する

　NATの内側からは直接アクセスしたいという時などに、DNSサーバから内向けと外向けに返すIPアドレスを変えたいときって あるじゃないですか、そんなとき dnsdist が いい仕事して(リクエスト元におおじてフォワードするDNSサーバを切り替えて）くれるんですが、その先の権威サーバをどうするか という話です。

dnsdistのことは うまくいったら 別の記事として 投稿しますね。

　unbound をつかうとか dnsmasqで・・・ とか 別のソリューションもありますが、これが ベストプラクティスになるといいなぁと思います。

　dnsdistは ポート番号指定で 振り分けられるので 同じサーバ内にNSDを 2つ起動すればいいのではないかということです。
別のサーバで NSDを 起動することでも 実現可能ですが、リソースケチりたいのと DNSに関する処理を1台に集約したいという意図によるものです。

dnsdistのバージョン 1.1.0が 使いたかったので ubuntu17.04 を使います。

NSDのインストールは apt で行います。ついでに systemdにサービス登録もしておきましょう。

``` text:cmd
$ sudo apt-get install nsd
$ sudo systemctl enable nsd
```
## 1つ目のNSDの設定

まずは外向けのサービスの設定を行います。方針は次のとおり
* IPv4だけ(IPv6はサービスしない）
* localhost:8053 で サービスする
* 基本的に default設定で使う

```text:/etc/nsd/nsd.conf
nsd.conf for NSD4
# /etc/nsd/nsd.conf
# Master server
server:
        ip-address: 127.0.0.1
        port: 8053
        do-ip6: no
        username: nsd
        zonesdir: "/etc/nsd/zones"
remote-control:
        control-enable: yes
pattern:
        name: master
        zonefile: %s.zone
        notify: 10.11.7.102@8053 NOKEY
        notify-retry: 5
        provide-xfr: 10.11.7.102@8053 NOKEY
zone:
        name: example.com
        include-pattern: master
```

## 二つ目のNSDの設定
つぎに内向けのサービスの設定を行います。方針は次のとおり
* IPv4のみ
* localhost:8153で サービスする
* コントロールポートは 18952 にする。
* 競合するファイルは -localをつけて競合を回避する

ubuntuのデフォルトが 標準環境と違っている点に 注意が必要です。起動できなくててこずりました。
そんなときは ログを確認するのがいいですが、それに加えて nsd-configtest -v で デフォルトを含んだ設定が見れるので外向けの設定との差分を 確認すると いいと思います。

```text:/etc/nsd/nsd-local.conf
# nsd-local.conf for NSD4
# /etc/nsd/nsd-local.conf
# Master server
server:
        ip-address: 127.0.0.1
        port: 8153
        do-ip6: no
        username: nsd
        logfile: "/var/log/nsd-local.log"
        zonesdir: "/etc/nsd/zones-local"
        database: "/var/lib/nsd/nsd-local.db"
        zonelistfile: "/var/lib/nsd/zone.list-local"
        pidfile: "/run/nsd/nsd-local.pid"
        xfrdfile: "/var/lib/nsd/xfrd.state-local"

remote-control:
        control-port: 18952
        control-enable: yes

pattern:
        name: master
        zonefile: %s.zone
        notify: 10.11.7.102@8153 NOKEY
        notify-retry: 5
        provide-xfr: 10.11.7.102@8153 NOKEY

zone:
        name: example.com
        include-pattern: master
```

## ２つめの サービスを登録する。
systemd に ２つめのNSDサービスを登録します。

/lib/systemd/system/nsd.service のファイルをもとに nsd-local.service を作成します。

修正方針は コマンドに configファイルのターゲットを 先ほど作成した /etc/nsd/nsd-local.conf に することです。

```text:/etc/systemd/system/nsd-local.service
[Unit]
Description=Name Server Daemon
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/sbin/nsd -d -c /etc/nsd/nsd-local.conf
ExecReload=/usr/sbin/nsd-control -c /etc/nsd/nsd-local.conf reload

[Install]
WantedBy=multi-user.target
```
次に サービスを 登録します。list-unit-files サブコマンドで nsd-local が 登録されていることを 確認したあとで enableにします。

``` text:cmd
$ sudo systemctl list-unit-files --type=service |grep nsd
nsd-local.service                      disabled
nsd.service                            enabled
$ sudo systemctl enable nsd-local
$ sudo systemctl list-unit-files --type=service |grep nsd
nsd-local.service                      enabled
nsd.service                            enabled

```

## NSD 起動

systemctl コマンドで start するか OSごと 再起動することで サービスが 起動します。

psコマンド で プロセスを 
netstatコマンド で LISTENポートを
ログ で エラーが発生していないことを 
確認しましょう。