Unbound+NSDの構成に変更

自室IPv6化計画の続きです

前回

https://qiita.com/jp_ibis/items/9d149bd6548f71c535c2

Unbound回

https://qiita.com/jp_ibis/items/42d6bf9af6ab8cbf2a5d


# local-dataをやめてNSDを入れよう
Unboundのlocal-data便利ですね。なんの不満もなかったのですが安定しすぎてつまらないので、nsdを入れてlocal-dataを止めてみようと思いました。

もちろんほんのりトラブりました😇

# インストール
Fedora41です。
SELinuxはEnforcingにしてますが、今回はトラブルを起こしました。

NSD4系からパッケージ配布が始ってるそうで、なんかネットみるとコンパイルしろー的な記事ばかりですが普通にパッケージインストールできました。

```bash
$ dnf install nsd
```

そして起動する前に先に設定を行います。Unboundでポート53を使っているのでDNS系のサーバは競合を起こします。

`/etc/nsd/nsd.conf`をざっと眺めてみて特に必要な設定はポートくらいで、conf.d/とserver.d/の下をインクルードしているのでそちらに追加設定のファイルを置けばよさそうです。

サーバの設定をserver.d/の下に`server.conf`という名前で置くことにしました。また、zoneの設定ファイルを`/etc/nsd/zones`の下にまとめることにしました。

```/etc/nsd/server.d/server.conf
ip-address: ::1@8053
zonesdir: "/etc/nsd/zones"
```

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

それでは早速起動してみましょう。

```bash
$ systemctl start nsd
...
エラー
```

早速エラー('A`)

/var/lib/nsdにファイルが書き込めないどうのってでてきました。まじか

```bash
$ chown nsd:nsd /var/lib/nsd
```

では気を取り直して。

```bash
$ systemctl start nsd
...
エラー
```

まだか('A`)

今度はポート8053にbindできません(permission deny)と言われます。いやそこ誰も使ってないはず……と調べていると久々にSELinuxに阻まれていました。

SELinuxを設定するより許可されているポート853をそのまま使うのが楽そうだったのでserver.confを修正。

```bash
$ semanage port -l | grep dns
dns_port_t                     tcp      53, 853
dns_port_t                     udp      53, 853
dnssec_port_t                  tcp      8955
opendnssec_port_t              tcp      15354
opendnssec_port_t              udp      15354
```
```/etc/nsd/server.d/server.conf
ip-address: ::1@853
zonesdir: "/etc/nsd/zones"
```
```bash
$ systemctl start nsd
```

無事起動しました。

```bash
$ systemctl enable nsd
```

# ゾーン設定

NSDにzoneを追加します。まずは各zoneを置く場所を用意。

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

ゾーンの追加。

```/etc/nsd/conf.d/zones.conf
zone:
  name: "home"
  zonefile: "/etc/nsd/zones/home.zone"
```

追加したゾーンのレコード。

```/etc/nsd/zones/home.zone
$TTL    86400
@       IN      SOA     ns1.home. admin.home. (
                                2025010101 ; serial
                                3600           ; refresh
                                1800           ; retry
                                604800         ; expire
                                86400          ; minimum
                                )
        IN      NS      ns1.home.

ns1     IN AAAA fdxx:xxxx:xxxx::1000
minipc  IN AAAA fdxx:xxxx:xxxx::1000
desktop IN AAAA fdxx:xxxx:xxxx::1
notepc  IN AAAA fdxx:xxxx:xxxx::5
```

home.zoneはひな形をGemini先生に作ってもらいました。下の方はUnboundのlocal-dataの設定と同じです。

## 確認

`-p 853`を付けてポート指定でdigります。

```
$ systemctl restart nsd
$ dig desktop.home @::1 -p 853 aaaa
...
;; ANSWER SECTION:
desktop.home.           86400   IN      AAAA    fdxx:xxxx:xxxx::1
```

NSDが上手く動いていればここまでで名前からIPアドレスを引けるようになります。

# Unboundの設定

Unboundのlocal-dataを消しておきます。digって名前が解決できないことを確認しておきましょう。

```bash
$ rm /etc/unbound/local.d/home.conf
$ systemctl restart unbound
$ dig desktop.home aaaa
...
(失敗)
```

Unboundの設定でstub-zoneを追加します。権威DNSサーバが同じサーバ内にあるときは`do-not-query-localhost`の設定も必要です。

```/etc/unbound/conf.d/unbound.conf
server:
...
        do-not-query-localhost: no
...
stub-zone:
        name: "home"
        stub-addr: ::1@853
```

これでUnboundにhomeゾーンを問い合わせると`::1@853`に再帰問い合わせしてくれるようになります。

今回homeというグローバルで使わないzone名なので不要ですが、zone名がグローバルでも使えるものの場合は外に見に行かないようにprivate-domain設定も入れておくのがよさげです。

```
server:
...
        private-domain: "home"
```

それでは、いざ！

```bash
$ systemctl restart unbound
$ dig desktop.home aaaa
...
(失敗)
```

引けねー('A`)

ログを見るとverify云々とでておりGemini先生に聞いたところDNSSECで弾かれているとのことでした。

`/etc/unbound/unbound.conf`を見てみると`module-config: "validator iterator"`がデフォルトになっていてこの`validator`がDNSSECのことだそうです。さすがに`validator`を抜くのははばかられたのでNSDにDNSSECを導入しようかと思ったら、導入もだけど運用がメンドクサ過ぎてヤバイ。

最初だけならともかくずっとメンドクサイのはツライので、ローカルホスト内だしhomeゾーンに対してはDNSSECを外すことにしました。

```/etc/unbound/conf.d/unbound.conf
server:
...
        private-domain: "home"
        domain-insecure: "home"
```

serverセクションを変えたときは再起動が安定。

```bash
$ systemctl restart unbound
```

## 確認

```bash
$ dig desktop.home aaaa
...
;; ANSWER SECTION:
desktop.home.           86400   IN      AAAA    fdxx:xxxx:xxxx::1
```

キャッシュを消して再度確認。

```bash
$ unbound-control flush_zone home
$ dig desktop.home aaaa
...
;; ANSWER SECTION:
desktop.home.           86400   IN      AAAA    fdxx:xxxx:xxxx::1
```

DNSSECはもっと楽に運用ができるようになったら考えます('A`)