NSDをFreeBSDとUbuntu上に建ててみた

備忘録です。過去に作ったものなので写真等の資料は少なめです
nsd.confとかの説明はほかのサイト見たほうがいいです
いちばんは公式

# 構築環境
プライマリ：FreeBSD
- Proriant DL380 Gen9上のproxmoxにインストール
- ファイアウォール：ipfw

セカンダリ：Ubuntu
- サクラのVPS上にインストール
- ファイアウォール：ufw

権威DNSの実装には双方でNSDを使用
IP等については<○○のIP>みたいな感じで書いていきます
ドメインはお名前で作ったものを使用。ここではexample.comと表記。ホスト登録をお忘れなく

## プライマリの実装
まずはFreeBSDにNSDを入れるところから。こちらの作業はすべてrootでやってます
```shell
pkg install nsd
```
自分の場合NSDのコンフィグ等のファイルは/usr/local/etc/nsd/上に作られた
早速nsd.confをいじっていく

こんな感じにした
```text:nsd.conf
server:
        server-count: 4
        ip-address: <プライマリのIP>
        do-ip4: yes
        do-ip6: no
        port: 53
        username: nsd
        hide-version: yes
        hide-identity: yes
        zonesdir: "/usr/local/etc/nsd/zones"
        zonefiles-check: yes
        logfile: "/usr/local/etc/nsd/nsd.log"
        pidfile: "/usr/local/etc/nsd/nsd.pid"
        verbosity: 2

remote-control:
        control-enable: yes
        control-interface: 127.0.0.1
        server-key-file: "/usr/local/etc/nsd/nsd_server.key"
        server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
        control-key-file: "/usr/local/etc/nsd/nsd_control.key"
        control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"

pattern:
        name: "myzones"
        zonefile: "%s.zone"
        outgoing-interface: <プライマリのIP>

zone:
        name: example.com
        zonefile: example.com.zone
        allow-notify: <セカンダリのIP> NOKEY
        notify: <セカンダリのIP> NOKEY
        notify-retry: 5
        provide-xfr: <セカンダリのIP> NOKEY

verify:
```

お次にzoneファイル。ここにゾーンの情報を書き込んでいく、このファイルはnsd内のzonesフォルダ内に作成した。修正したときはSOAレコードのserialを書き直すことを忘れずに(2敗)
```text:example.com.zone
$TTL 3600 IN SOA ns1.example.com. root.example.com. ( 
		202503231 ;Serial Number 
		7200 	  ;Refresh
		3600 	  ;Retry 
		1209600   ;Expire
		3600 	  ;TTL
) 

	IN NS ns1.example.com. 
	IN NS ns2.example.com. 

ns1 IN A <プライマリのIP>
ns2 IN A <セカンダリのIP> 
```

最後にファイアウォール
```text:/usr/local/etc/ipfw.rules
#!/bin/bash

IPF="ipfw -q add" 
ipfw -q -f flush 

#loopback 
$IPF 10 allow all from any to any via lo0 
$IPF 20 deny all from any to 127.0.0.0/8 
$IPF 30 deny all from 127.0.0.0/8 to any 
$IPF 40 deny top from any to any frag 

#statefull 
SIPF 50 check-state 
$IPF 60 allow tcp from any to any established 
$IPF 70 allow all from any to any out keep-state 
$IPF 80 allow icmp from any to any 

$IPF 90 allow tcp from any to <プライマリのIP> <sshのポート> in 
$IPF 100 allow tcp from any to <プライマリのIP> <sshのポート> out 
$IPF 110 allow tcp from any to <プライマリのIP> in 
$IPF 115 allow udp from any to <プライマリのIP> in 
$IPF 120 allow tcp from any to <プライマリのIP> out 
$IPF 125 allow udp from any to <プライマリのIP> out
```

(rc.confももちろん書かないといけないけど、nsd系の記事調べたら大体書いてあった＆それ参照したら動けたので省略)

とりあえずこっちは終わり。

## セカンダリの実装
こっちはubuntuだけどさっきとやることはほぼ同じ。
ユーザー権限で作業してますが、適宜sudoで操作してます。

ここでは/etc/nsd/上にファイルができた

```text:nsd.conf
server:
        server-count: 4
        ip-address: <セカンダリのIP>
        do-ip4: yes
        do-ip6: no
        port: 53
        username: nsd
        hide-version: yes
        zonesdir: "/etc/nsd/zones"
        zonefiles-check: yes
        logfile: "/var/log/nsd.log"
        pidfile: "/run/nsd/nsd.pid"
        verbosity: 2

remote-control:
        control-enable: yes
        control-interface: 127.0.0.1
        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"

pattern:
        name: "myzones"
        zonefile: "%s.zone"
        outgoing-interface: <セカンダリのIP>

zone:
        name: example.com
        zonefile: example.com.zone
        allow-notify: <プライマリのIP> NOKEY
        notify: <プライマリのIP> NOKEY
        request-xfr: <プライマリのIP> NOKEY

verify:
```

セカンダリではゾーンファイルを書く必要がない

ufw 
```
80                         ALLOW       Anywhere
64297/tcp                  ALLOW       Anywhere
53/udp                     ALLOW       Anywhere
Anywhere on lo             ALLOW       Anywhere
Anywhere                   DENY        127.0.0.0/8
53/tcp                     ALLOW       Anywhere
53                         ALLOW       127.0.0.1
53                         ALLOW       <プライマリのIP>
80 (v6)                    ALLOW       Anywhere (v6)
64297/tcp (v6)             ALLOW       Anywhere (v6)
53/udp (v6)                ALLOW       Anywhere (v6)
Anywhere (v6) on lo        ALLOW       Anywhere (v6)
53/tcp (v6)                ALLOW       Anywhere (v6)
```
どれがnsdを作るときに追加したものか忘れてしまった...
まあ問題なく動いているので後々に修正する
これで設定は終わり

logみてエラー吐いてなければ多分OK
さいごにdig
```shell
dig <プライマリのIP> -t ns example.com +norec
```

nsの部分が設定通りに返ってきてるかを確認
TTLとかの部分はだいぶ適当にやってるので、自分で調べて適宜変えてください