おうちサーバー構築報告：LAN内DNSサーバー Unbound

## 能書き

[おうちサーバー構築報告：予告](https://qiita.com/katz_engineer/items/471408eda1d09507c451)からのおうちサーバー構築の続きです。

Unboundは[以前](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e)も何度か取り扱っている訳ですが、今回はUbuntu24.04LTSにシェルスクリプトで自動的に導入します。対象が1マシンだけなのでAnsibleは止めました。

### 目標

Unboundで家庭内DNSサーバーを実現します。

### 参考文献

- [私的サーバー構築日誌：LAN内DNSサーバー Unbound - Qiita](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e)

少し調べました。mDNS用には`.local`が予約されているとか。情報源がWikipediaというのは感心しませんが。

- [.local - Wikipedia](https://en.wikipedia.org/wiki/.local)

## 準備

### 家庭内ドメイン

能書きは[以前の記事](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e)に任せて、端的に要点だけ書いときます。

- 公開するサーバーを立てるつもりなら、きちんと年間予算を捻出してドメインを買おう
- 家庭内限定ドメインという事で、今回はお手軽に`.local`にする
    - 本当は家庭内の非公開サーバーでも購入したドメインを使う方が良い（けど今回はゴニョゴニョ）

### スナップショット

[対象コンテナの名前は`network`、IPアドレスは`172.16.1.101`です](https://qiita.com/katz_engineer/items/471408eda1d09507c451#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)。
該当コンテナのスナップショットを撮ります。ProxmoxVEはGUIでスナップショットを撮れます。分かり易いので手順の詳細は省略。

念の為に該当コンテナをシャットダウンして、それからスナップショットを撮り、その後開始しておきます。

## インストールと基本設定

踏み台サーバーとして`172.16.1.100`を使用します。

```console:普段使いのクライアントマシン
ssh ansible@172.16.1.100
```

```console:サーバー172.16.1.100:ユーザーansible
ssh root@172.16.1.101
```

今回は手順をシェルスクリプトにまとめました。

```console:サーバー172.16.1.101
cd
cat <<___ >install_unbound.sh
SUBNET=\$1
IPADDR=\$2
PARENT=\$3

apt update
apt upgrade -y
apt install -y unbound

cd /etc
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -r svn add
svn ci -m"installed Unbound"
sed -i -e"/^#DNS=/c DNS=\$IPADDR" -e"/^#Domains=/c Domains=local" /etc/systemd/resolved.conf
systemctl restart systemd-resolved
svn ci -m"setting systemd-resolved"

cd /etc/unbound/unbound.conf.d/
cat >local.conf <<___A
server:
  username: unbound
  verbosity: 1
  interface: \$IPADDR
  access-control: \$SUBNET allow
  root-hints: "/etc/unbound/unbound.conf.d/parent.hints"
  include: "/etc/unbound/unbound.conf.d/machines.list"
  hide-identity: yes
  hide-version: yes
remote-control:
  control-enable: no
___A
touch machines.list
cat >parent.hints <<___B
.             3600000 NS ROUTER.LOCAL.
ROUTER.LOCAL. 3600000 A  \$PARENT
___B
systemctl enable unbound
systemctl restart unbound

cd /etc
svn st | grep "^?" | cut -b9- | sudo xargs -rt svn add
svn ci -m"Unbound initial settings"
___
chmod 755 install_unbound.sh
./install_unbound.sh 172.16.0.0/16 172.16.1.101 172.16.2.1
```

## 内向きDNS

### 設定

マシン名は`/etc/unbound/unbound.conf.d/machines.list`に追加します。正引きと逆引きの両方が必要です。[構築したコンテナと仮想マシンの名前とIPアドレス](https://qiita.com/katz_engineer/items/471408eda1d09507c451#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)をまとめて全部設定しておきます。

```console:サーバー172.16.1.101
cd /etc/unbound/unbound.conf.d/
cat >>machines.list <<___
local-data: "network.local. 3600000 IN A 172.16.1.101"
local-data-ptr: "172.16.1.101 3600000 network.local."
local-data: "mail.local. 3600000 IN A 172.16.1.102"
local-data-ptr: "172.16.1.102 3600000 mail.local."
local-data: "proxy.local. 3600000 IN A 172.16.1.103"
local-data-ptr: "172.16.1.103 3600000 proxy.local."
local-data: "docker.local. 3600000 IN A 172.16.1.104"
local-data-ptr: "172.16.1.104 3600000 docker.local."
___
```

文法チェックします。

```console:サーバー172.16.1.101
unbound-checkconf
```

### 確認

設定ファイルを読み込みます。

```console:サーバー172.16.1.101
systemctl restart unbound
```

ちょっと確認。別のマシンからnslookupコマンドを実行してみます。

```console:クライアントマシン:Windows
nslookup network.local 172.16.1.101
```
```console:クライアントマシン:Windows
nslookup mail.local 172.16.1.101
```
```console:クライアントマシン:Windows
nslookup proxy.local 172.16.1.101
```
```console:クライアントマシン:Windows
nslookup docker.local 172.16.1.101
```

外部のドメイン名（example.com等）も、引き続き名前解決できる事を確認します。

```console:クライアントマシン:Windows
nslookup example.com 172.16.1.101
```

### 設定保存

うまくいったらSubversionコミットしておきます。

```console:サーバー172.16.1.101
cd /etc
svn st | grep "^?" | cut -b9- | sudo xargs -rt svn add
svn ci -m"DNS setting: network,mail,proxy,docker"
```

## その他の設定

### 無線LAN親機など

通常の家庭の場合、無線LANの親機がルータやDHCP等の設定も持っているでしょう。この内DNSを、[我が家](https://qiita.com/katz_engineer/items/471408eda1d09507c451#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)で言えば`172.16.1.101`に向けるように設定します。

1. DHCPサーバから通知するDNSサーバアドレスを設定
1. DNSルーティング設定とかいう機能で、家庭内で解決する名前のドメイン毎に、Unboundを立てたサーバのIPアドレスを設定

これは機種によって異なります。それぞれのマニュアルを確認して下さい。

但し。[我が家のマシン NUC13ANHI5000](https://qiita.com/katz_engineer/items/471408eda1d09507c451#%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2) はどういう訳か不安定で、電源を数日入れっ放しにしておくと、意味不明なエラーが発生します。たまに再インストールを余儀なくされます。余りにも不安定なので、我が家ではこの設定はしません。家人に不評なので。私のクライアントマシンに手作業で設定する事にします。

### 起動失敗は今回は発生せず

[前回問題になった起動失敗](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e)は、今回は発生しませんでした。コンテナにしたからでしょうか。

と言う訳で起動失敗への対応は実施しません。

## 仕舞い

これで家庭内の名前解決が出来るようになりました。