Unbound(DNS)導入メモ

自室IPv6化計画の一環です

後日NSDと連携させました

https://qiita.com/jp_ibis/items/57c567654b71eff00559

# 動機

IPv4の時はサーバ系のアドレスを192.168.11.xxxで手動設定しており、覚えるのは最後の３桁だけだったので簡単に覚えられました。

IPv6にしたらULAの先頭のfdxx.xxxx.xxxxが覚えきれない／(^o^)＼

覚えるのを諦めてDNSを導入することにしましたが、以前BINDを使ってものすごく疲弊してDNS自体が暫くトラウマになってたので、簡単と噂のUnboundを使ってみることにしました。

実際めちゃくちゃ簡単で書く内容がほぼなかったのですが、ちょっとだけ躓いたところもあるのでメモだけ残しておきます。

# インストール

Fedora40です。
SELinuxはEnforcingにしてますが、特に問題は起きませんでした。

```bash
# unboundを使うのでsystemd-resolvedを止める
$ systemctl disable systemd-resolved
$ systemctl stop systemd-resolved
$ mv /etc/resolv.conf /etc/resolv.conf.bk

# unboundのインストール
$ dnf install unbound
$ systemctl enable unbound
$ systemctl start unbound
```

IPv6のport:53が開いていればOKです

```bash
$ ss -na | grep 53
udp   UNCONN 0      0                  [::]:53             [::]:*
tcp   LISTEN 0      256                [::]:53             [::]:*

$ lsof -i:53
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
unbound 1167 unbound    3u  IPv6   9153      0t0  UDP *:domain 
unbound 1167 unbound    4u  IPv6   9154      0t0  TCP *:domain (LISTEN)
```

最終的にavahi(mDNS|port:5353)も止めました

```bash
$ systemctl stop avahi-daemon.socket
$ systemctl stop avahi-daemon.service
$ systemctl disable avahi-daemon.socket
$ systemctl disable avahi-daemon.socket
```

## resolv.confの修正

systemd-resolvedを止めたのでNetworkManagerが起動時に/etc/resolv.confを作るようになります。なのでNetworkManagerのDNSの設定を修正しておきます。

```bash
$ vi /etc/NetworkManager/system-connections/<IFの名前>.nmconnection
[ipv4]
...
# IPv4でも使うなら127.0.0.1、IPv6でのみ利用ならルーターのアドレスや1.1.1.1等
dns=127.0.0.1
dns-priority=10

[ipv6]
...
dns=::1
dns-priority=9
```

dns-priorityは小さな値ほど優先されるようなので、今回IPv6でDNSをしたい！ってことなのでIPv6を優先させます。

これでNetworkManagerを再起動するとresolv.confが書き換わっています。

```bash
$ systemctl restart NetworkManager
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver ::1
nameserver 127.0.0.1
```

# unbound.confの設定
```bash
$ vi /etc/unbound/unbound.conf
```
confの中の項目ごとにめっちゃドキュメント書いてあるのが素敵ですね。

だらだら眺めているとremote-controlとか怖い文字列の項目を見たのでセキュリティ対応が必要かなってinclude先まで探ってみると、待ち受けがportではなくファイル(socket)になっていたのでまぁ一安心。unbound-controlコマンドを受け付けるsocketになっているようです。

unbound.confやその下のconf.dやlocal.dの中身を書き換えた後は一部を除いてreloadすれば有効になります。

```bash
$ systemctl reload unbound
```
## IFの設定

```conf
# 待ち受けアドレス。他の端末からIPv6で参照できるように
interface: ::0

# portがLISTENされてても、アクセスコントロールの許可がないとRefuseを食らう
access-control: fdxx:xxxx:xxxx::/64 allow

# IPv4でも使うならコチラも設定
interface: 0.0.0.0
access-control: 192.168.xx.xxx/24 allow
```

この辺書き換えた後はunboundの再起動が必要だって書いてました。

`# The listen interfaces are not changed on reload, only on restart.`

## ログの設定

```conf
# デフォルトはログ無しだけど、初心者なのでトラブル対応用に
logfile: "/var/log/unbound/unbound.log"
use-syslog: no
```

トラブル対応用にログはいるよね～って出そうとしたら、ログの出力でトラブルやがな(´・ω・`)

ログがでないなーって思ったらunboundのユーザーがunboundなので/var/log以下へのアクセス拒否を食らってました。

```bash
$ mkdir /var/log/unbound
$ chown unbound:unbound /var/log/unbound
```

## 上位DNSの設定

室内端末以外は丸投げです。

nameでドメイン名を指定すればそのドメインに対してだけforwardを設定することができますが、丸投げの時は"."だけ書けばいいようです。

`Use an entry with name "." to forward all queries.`

```conf
forward-zone:
        name: "."
        forward-addr: 1.1.1.1
        forward-addr: 8.8.8.8
```

## おしまい

簡単！☺️

一応digったりpingしたりして、上位サーバから名前を引っ張ってこれているか確かめておきます。

```bash
$ systemctl restart unbound
$ dig www.google.com
$ dig www.google.com aaaa
```

# ローカルアドレスを設定する

お待ちかねローカルアドレスの設定です。ローカルアドレスと名前はlocal.dの下に書くのがお作法のようです。

```bash
$ cd /etc/unbound/local.d
$ vi home.conf
```

今回はdesktop.homeとかnotepc.homeとかhomeドメインにしたのでhome.confとしましたが、unbound.confで次のようになっているので.confがついていればファイル名は何でもOKです。

`include: /etc/unbound/local.d/*.conf`

home.confの中にAAAAレコードを記述します。

```conf
# FQDNは.を名前の最後に付けるのがお作法(一応無しで試しても動いた)
local-data: "minipc.home. IN AAAA fdxx:xxxx:xxxx::1000"
local-data: "desktop.home. IN AAAA fdxx:xxxx:xxxx::1"
local-data: "notepc.home. IN AAAA fdxx:xxxx:xxxx::2"
```
後はreloadすれば有効になります。

```bash
$ systemctl reload unbound
$ dig desktop.home aaaa
```

# Windows側の設定

サーバのFirewallでDNSが通るようになっているか確認しておいてください。

```
$ firewall-cmd --list-services
dns ssh
```
Windowsのネットワークの設定でIPv6のDNSにサーバのアドレスを突っ込みます。DHCPv6やRDNSSを使えばDNSの設定を自動化できますが、それはまた次回。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/72b9eaf6-bc82-4183-97f3-84bf8f1b16c0.png)

これでもう名前解決ができるようになってます。

```cmd
> nslookup desktop.home
```