自宅サーバー構築譚：LAN内DNSサーバー Unbound・Ubuntu 22.04

# 能書き

[自宅サーバー構築譚：基本構想](https://qiita.com/katz_engineer/items/cb592be44daa28a51d9b)に基づく自宅サーバー構築、[Ubuntu22.04LTSインストール](https://qiita.com/katz_engineer/items/1ffea0a145da7025e10d)のその後です。

[以前](https://qiita.com/katz_engineer/items/241c3667cae2e742d54f)も同じ内容を書きましたが、22.04になってどうも勝手が変わったようなので、改めて記事を立てます。

※DHCP サーバよりも先に DNS サーバを立てるべきです。

※22.04になってちょっと勝手が変わったような気がしますので、それに対応して参考文献を幾つか追加しました。

参考文献1：[Set Up Unbound DNS Resolver on Ubuntu 22.04/20.04 Server](https://www.linuxbabe.com/ubuntu/set-up-unbound-dns-resolver-on-ubuntu-20-04-server)参考文献2：[第386回　Unboundでお手軽に家庭内DNSサーバーを作ろう - Ubuntu Weekly Recipe](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0386)
参考文献3：[俺様サーバー構築記 - LAN内DNSサーバー Unbound @デスクトップパソコン(BIOS)](https://qiita.com/katz_engineer/items/b171b84504091c4d734d)
参考文献4：[Unbound - ArchWiki](https://wiki.archlinux.jp/index.php/Unbound)
参考文献5：[自宅サーバを立てる際の家庭内名前解決の落とし穴](https://qiita.com/katz_engineer/items/26c4718b3c3fc0164130)
参考文献6：[Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる](https://qiita.com/shora_kujira16/items/31d09b373809a5a44ae5)
参考文献7：[Ubuntuで指定されているDNSサーバ 127.0.0.53](https://pcvogel.sarakura.net/2022/09/06/36606)
参考文献8：[ubuntu systemd-resolved で ローカルドメインの解決をする](https://takuya-1st.hatenablog.jp/entry/2022/03/10/155657)

余談。こんな事もあった模様。

参考文献9：[Ubuntu 20.04 その64 - Unboundにアンプ攻撃やDoSの脆弱性・アップデートを - 
kledgeb](https://kledgeb.blogspot.com/2020/05/ubuntu-2004-64-unbounddos.html)

# 準備

## 家庭内ドメイン

自分ちのドメイン名、何にしますか？
一番正しいのはお金を出して買う事です。維持費も掛かります。しかし月に缶ジュース1～2本分も出せば、結構良い奴を維持できます。

ただ、家庭内限定ならロハで .home とかでも良さそうです。会社だったら .corp でしょうか。外部には公開できませんが、家庭内ですし。
我が家は .home に決めました。

因みに .local はやめましょう。

参考文献：[TLDにおける名前衝突 (Name Collision)問題 - JPNIC](https://www.nic.ad.jp/ja/newsletter/No57/0800.html)

## スナップショット

インストール前にスナップショットを撮りましょう。

```console
zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_Unbound
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_Unbound
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_Unbound
```

# 起動

## インストール

下記コマンドを実行。

```console
apt install -y unbound
```

インストールできたら```/etc```をバージョン管理します。

```console
cd /etc
svn st
```

こうなりました。

```console
# cd /etc
# svn st
?       apparmor.d/local/usr.sbin.unbound
?       apparmor.d/usr/sbin/unbound
M       group
M       gshadow
?       init.d/unbound
?       insserv.conf.d
M       ld.so.cache
M       passwd
?       rc0.d/K01unbound
?       rc1.d/K01unbound
?       rc2.d/K01unbound
?       rc3.d/K01unbound
?       rc4.d/K01unbound
?       rc5.d/K01unbound
?       rc6.d/K01unbound
?       resolvconf
M       shadow
?       unbound
M       zfs/zpool.cache
```

相変わらずな感じです。
- ```apparmor```はウイルス対策ソフトの一種と思われる
- ```ld.so.cache```はライブラリの場所のキャッシュ
- アカウントとグループの追加（```group```と```gshadow```と```passwd```と```shadow```）
- init.d 関連と systemd 関連
- ```unbound```は設定ファイルのディレクトリと思われる
- ```resolvconf```は何でしょう？

取り敢えず全部追加して更新。

```console
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -rt svn add
```

ちょっと警告が出ます(already under version control)が、こいつは無視して下さい。心配なら```svn st```で全部追加されてる事を確認すればOKです。

それからcommitします。

```console
svn ci -m"installed Unbound"
```

## systemd-resolved の設定を変更

こいつはDNSの名前解決をするsystemdサービスです。 IP アドレス 127.0.0.53 のポート 53 で待ち受けています。言いたい事は山程ありますが、それは置いときましょう。[以前](https://qiita.com/katz_engineer/items/241c3667cae2e742d54f)は放置で問題無かったと思うのですが、今回は放置してはダメでした。対策しないとUnboundが起動しません。

systemd-resolvedを止める方法もあります。

参考文献：[Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる](https://qiita.com/shora_kujira16/items/31d09b373809a5a44ae5)

ただ、止めなくても何とかなるようですな。

参考文献：[Dnsmasq で おうち DNS on Ubuntu 20.04 LTS](https://zenn.dev/jeffi7/articles/3c2ff2abd71143)
参考文献：[unbound.conf(5) - 日本Unboundユーザー会](https://unbound.jp/unbound/unbound-conf/)

とりあえず下記のように設定ファイルを修正しときます。

- DNSサーバーとして 172.16.1.3 （現在いじっているサーバーマシン）を指定する
- 家庭内ドメイン .home を自動で補う

```console
sed -i -e"/^#DNS=/c DNS=172.16.1.3" -e"/^#Domains=/c Domains=home" /etc/systemd/resolved.conf
systemctl restart systemd-resolved
```

## Unbound 設定ファイル

参考文献や上述の```/etc```に追加されたディレクトリなどから判断して、主な設定ファイルは```/etc/unbound/unbound.conf```です。この中身は```include: "/etc/unbound/unbound.conf.d/*.conf"```というだけの恐ろしく単純な1行、及び英語のコメント。従ってオレオレ設定は```/etc/unbound/unbound.conf.d```に適当なファイル名で置けば良いのでしょう。

今回は下記のように修正しました。

待ち受けるIPアドレスは、外部からの問い合わせも全部受けるなら```0.0.0.0```を指定するのが一般的です。が、これを指定するとsystemd-resolvedと衝突して起動に失敗します。そこで```172.16.1.3```（このマシンのIPアドレス）を指定する事にします。

もしIPアドレスを複数割り当てている場合には、その分だけ```interface```行を増やせば良いようです。

参考文献：[unbound.conf(5) - 日本Unboundユーザー会](https://unbound.jp/unbound/unbound-conf/)

```console
cd /etc/unbound/unbound.conf.d/
cat >home.conf <<___
server:
  username: unbound
  verbosity: 1
  interface: 172.16.1.3
  access-control: 172.16.0.0/16 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
___
touch machines.list
```

ルートヒントは、世界的に使用されているグローバル標準 https://www.internic.net/domain/named.cache がある訳ですが。家庭内LANなのでプロバイダが指定してくる物を上位DNSとすれば十分かなと。という訳で、ルートヒントは家庭内LANのルータ```172.16.2.1```を指定するだけのファイルを用意しました。定期的な更新なんかも不要ですしね。

（2023.05.24. 追加ここから）
どうやら家庭内LANのwifiルータ`172.16.2.1`を指定すると、思った通りには動かないようです。名前解決が時々できなくなってしまう模様。機種によるのかな？
プロバイダから指定されているDNSサーバーを指定したら上手くいった気がします。読者諸氏におかれましては御注意されたし。
（2023.05.24. 追加ここまで）

```console
cat >parent.hints <<___
.            3600000 NS ROUTER.HOME.
ROUTER.HOME. 3600000 A  172.16.2.1
___
```

Unbound の設定ファイルを修正したら、文法チェックのツールを実行しておきましょう。

参考文献：[unbound-checkconf(8) - 日本Unboundユーザー会](https://unbound.jp/unbound/unbound-checkconf/)

```console
unbound-checkconf
```

## 起動

unbound の設定変更時には、```systemctl reload```では駄目で```systemctl restart```が必要のようです。権限がどうとか。

```console
systemctl enable unbound
systemctl restart unbound
```

起動を確認。

```console
systemctl status unbound
```

外の名前解決を確認。

```console
nslookup example.com
```

## Subversion 登録

一応大丈夫そうなので```/etc```をコミットしましょう。

```console
cd /etc
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"Unbound initial settings"
```

# 内向きDNS

これです。この為に、家庭内名前解決とか面倒臭い事をするんです。

## 設定

マシン名は```/etc/unbound/unbound.conf.d/machines.list```に追加します。正引きと逆引きの両方が必要です。後は好きに設定して下さい。

参考文献：[2.5 内向きDNS - 2 Unboundのインストール - Unboundで内向きDNSを建てる - 純規の暇人趣味ブログ](https://jyn.jp/unbound-internal-dns/#DNS-2)

```console
cd /etc/unbound/unbound.conf.d/
cat >>machines.list <<___
local-data: "secondary.home. 3600000 IN A 172.16.1.3"
local-data-ptr: "172.16.1.3 3600000 secondary.home."
___
unbound-checkconf
```

## 確認

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

```console
systemctl restart unbound
```

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

```console
nslookup secondary.home
```

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

```console
nslookup example.com
```

## 設定保存

```console
cd /etc
svn ci -m"DNS setting: secondary"
```
## 設定：無線 LAN 親機

通常の家庭の場合、無線 LAN の親機がルータや DHCP 等の設定も持っているでしょう。この内 DNS を、[我が家で言えば](https://qiita.com/katz_engineer/items/a5cc92d7ca523ee3be14#nic-%E3%81%AE%E5%86%8D%E8%A8%AD%E5%AE%9A) 172.16.1.3 に向けるように設定します。

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

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

ウチは最近になって無線 LAN ルーターを買い替えました。とある有名なゲーミングルーターが安売りしてたので飛びついたのですが、ちょっと失敗だったかも知れません。良いと思っていた機能が無くなってしまったので。その内の一つが、DHCP の設定として DNS サーバーアドレスを指定する機能。残念。

仕方が無いのでクライアントマシン側で設定します。

しかも Windows は、Hyper-V を設定するとネットワーク環境は複雑怪奇になるんですな。しかもそれを解説した記事が出てきません。困った物です。

まずはタスクバー右端の wifi の電波マークを右クリックして、ポップアップメニューから「ネットワークとインターネットの設定を開く」

まずは Winキー>設定>ネットワークとインターネット

![ネットワークとインターネット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/3b1b0e91-96bc-9c61-084e-e65f012b85cc.png)

画面左のメニュー>イーサネット>ネットワークと共有センター

![イーサネット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/b2098957-51f1-0e56-3a4f-0700ba782e26.png)

画面右の接続>vEthernet (wifi)

![ネットワークと共有センター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/d3f49dd3-0519-687b-7b54-b7745d7f3aeb.png)

vEthernet (wifi)の状態ダイアログが表示されるので、プロパティボタンをクリック。

![vEthernet(wifi)の状態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/57932123-ee13-f9e3-6e11-7116a43c41cd.png)

vEthernet (wifi)のプロパティダイアログで「インターネット プロトコル バージョン4 (TCP/IPv4)」を選択し、プロパティボタンをクリック。

![vEthernet(wifi)のプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/f7f5b20b-a021-5777-b453-92a61e86a08a.png)

インターネット プロトコル バージョン 4 (TCP/IPv4)のプロパティダイアログが表示されます。「次の DNS サーバーのアドレスを使う」ラジオボタンを選択し、優先 DNS サーバーに、今回設定しているサーバーの IP アドレスを入力します。

![インターネットプロトコルバージョン4(TCP/IPv4)のプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/757ef46c-5519-4efe-84b9-7b4f67496710.png)

更にここから詳細設定ボタンをクリック。
TCP/IP 詳細設定ダイアログの「以下の DNS サフィックスを順に追加する」に home を追加すればOKです。

![TCPIP詳細設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/5b5e821a-85e5-bef2-4935-63efc274c10c.png)

こうして DNS サフィックスを設定しておけば、後で[内向きDNS](#%E5%86%85%E5%90%91%E3%81%8Ddns)を設定した時に、```secondary.home```ではなくて```secondary```だけで名前解決してくれるようになります。

## なぜか上手くいきません。

DOSプロンプトから```nslookup```コマンドを打ってみたのですが、なぜか、名前解決してくれません。[前](https://qiita.com/katz_engineer/items/241c3667cae2e742d54f)はこれで上手くいったんだけどなぁ。

第2引数としてDNSサーバーのIPアドレス 172.16.1.3 を与えると、きちんと名前解決します。従って問題はサーバー側ではなくてWindows側だと思われますが。

困った事に```ping```コマンドだと正しく名前解決してくれるんですよね。逆だと事例が溢れていますが、このケースは他に無さそうですな。困りました。

けど、ここに拘ってるといつまでも進まないので、放置する事にしました。

# 仕舞い

これで設定完了となります。やったね:thumbsup_tone2: