自宅にUnboundでDNSサーバを建ててみた

<!-- 自宅にUnboundでDNSサーバを建ててみた -->

## はじめに

この前自宅を大掃除し、使っているサーバ群を整理しました。このサーバもある程度数が殖えてきて、IPアドレスだけだとどれがどれだか分からなくなってきました。

そこで、自宅にDNSサーバを建ててみることにしました。こうすることで、IPアドレスではなく意味を持たせた文字列でサーバにアクセスできるようになり、区別や管理がしやすくなるはずです。

## やったこと

今回は、UnboundというDNSサーバを使ってDNSサーバを建ててみました。使用したOSはUbuntu 24.04 LTSです。

### Unboundのインストール

まずはUnboundをインストールします。

```bash
sudo apt update
sudo apt install unbound
```

### Unboundの設定

次にUnboundの設定を行います。

```bash
sudo nano /etc/unbound/unbound.conf
```

以下のように設定します。

```
server:
    # ログ出力ファイルの設定
    logfile: "/var/log/unbound.log"

    # ログ出力先にsyslogを使用しない
    use-syslog: no

    # エラーと操作情報を出力
    verbosity: 1

    # リクエストの受付
    interface: 0.0.0.0
    interface: ::0

    # アクセスを許可
    access-control: 0.0.0.0/0 refuse
    access-control: xxx.xxx.xxx.0/24 allow
    access-control: 127.0.0.1 allow

    # ローカルネットワークのリクエストを受け付ける
    domain-insecure: "home"

    # 対応を正引きと逆引きの両方記述する
    local-data: "hogefoo.home. IN A xxx.xxx.xxx.xxx"
    local-data-ptr: "xxx.xxx.xxx.xxx hogefoo.home"

# フォワーダーの設定
forward-zone:
    name: "."
    forward-addr: xxx.xxx.xxx.1
```

`xxx.xxx.xxx.0/24`は自宅のネットワークアドレスに置き換えてください。まず全てを拒否し、その後自宅のネットワーク内のみアクセスを受け付けるという流れです。

また、自分が自分を呼び出せるように、ローカルホストのアクセスも許可しておきます。

変換はサーバの数だけ書きます。ドメイン名→IPアドレスを書くときにはドメイン名の末尾に`.`をつけることに注意してください。

`.com`みたいなところは適当に決めることができますが、実在するドメイン名との競合を避けるため、自宅なら`home`、会社なら`company`などにしておくとよいでしょう。

自分は`[業務内容].[苗字].home`という形にしています。これでサーバの区別がつきやすくなりました。

### Unboundの起動

Unboundは他のDNSサーバと競合する可能性があります。そのため、他のDNSサーバを停止しておきます。

```bash
sudo nano /etc/systemd/resolved.conf
```

以下のように設定します。

```
DNSStubListener=no
```

設定を変更したら再起動します。

```bash
sudo systemctl restart systemd-resolved
```

また、Unboundはデフォルトで53番ポートを利用しているので、ファイアウォールを設定している場合は導通させておきます。

```bash
sudo ufw allow 53
sudo ufw enable
```

ここまでできたら、Unboundを再起動します。

```bash
sudo systemctl restart unbound
```

### Unboundの動作確認

Unboundが正しく動作しているか確認します。

```bash
nslookup hogefoo.home localhost
```

以下のような結果が返ってくれば成功です。

```
Server:         localhost
Address:        127.0.0.1#53

Name:   hogefoo.home
Address: xxx.xxx.xxx.1
```

### クライアント側での設定

DNSサーバを立てたはいいものの、これだけではクライアントが名前解決をしてもらうことができません。なので、クライアント側でDNSサーバを設定します。

今回はWindowsの場合について説明します。Mac等の場合も似たような手順で設定できるはずです。

まず、ネットワークとインターネットの設定を開きます。「ネットワークと共有センター」を開いて、接続しているネットワークをクリックします。「プロパティ」をクリックし、プロパティを開きます。

一覧から「インターネット プロトコル バージョン 4 (TCP/IPv4)」を選択し、「プロパティ」をクリックします。

「次の DNS サーバー アドレスを使用する」を選択し、プライマリDNSサーバにUnboundをインストールしたサーバののIPアドレスを入力します。

これでクライアント側での設定は完了です。

`ping`コマンドなどで名前解決ができるか確認してみてください。Webブラウザで`http`を使ってアクセスしてみてもいいでしょう。

## わからなかったこと

建てたDNSサーバをクライアント側でセカンダリDNSとして設定すると、名前解決ができなくなりました。

また、建てたものをプライマリ、元々のデフォルトゲートウェイのDNSをセカンダリに設定すると、名前解決ができたりできなかったりしました。

そのため、先述したように今回建てたDNSサーバをプライマリとし、セカンダリの設定はしませんでした。

なんでかわからなかったのですが、先述の通り建てたDNSサーバは名前解決ができなかったときに、デフォルトゲートウェイのDNSに問い合わせるようになっているので、この設定でも問題ないようです。

## おわりに

これで自宅にDNSサーバを建てることができました。利用のためにはクライアント側でDNSサーバを設定する必要がありますが、これで自宅のサーバを管理しやすくなりました。

できればデフォルトゲートウェイとなっているルータの設定を変更し、名前解決したいサーバのIPアドレスを登録する形にしてクライアント側での設定を不要にしたかったのですが、そういった設定ができないルータだったようで、仕方なく今回のような形としました。

サーバが増えてきたら、アクセスの利便性のためにもDNSサーバを建てることをおすすめします。

それではまた。

## 参考文献

[Unboundで自宅のLAN内の名前解決がしたい #Linux - Qiita](https://qiita.com/h_tyokinuhata/items/50ac73f3d5f0a88e147f)

[奥が深いDNSサーバーとdigコマンド #dns - Qiita](https://qiita.com/hypermkt/items/610b5042d290348a9dfa)

[第834回　Unboundでお手軽に家庭内DNSサーバーを作ろう［Ubuntu 24.04 LTS対応版］ | gihyo.jp](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0834)

[unbound | 基本設定 | メモ](https://al-batross.net/2020/08/29/unbound-basic-settings/)

[DNSキャッシュサーバ(unbound)が動作しない](https://teratail.com/questions/129307)

[unbound-control(8) | 日本Unboundユーザー会](https://unbound.jp/unbound/unbound-control/)

[Unbound on CentOS7でローカルDNSサーバを構築してみる - ニートのMEMO](https://katoko.hatenablog.com/entry/2018/05/12/121428)

[DNSキャッシュサーバーの構築 – nkmtの日記](https://nkmt.info/infra/dns-server#6)

[俺様サーバー構築記 - LAN内DNSサーバー Unbound @デスクトップパソコン(BIOS) #dns - Qiita](https://qiita.com/katz_engineer/items/b171b84504091c4d734d)

[Unboundで内向きDNSを建てる | なうびるどいんぐ](https://jyn.jp/unbound-internal-dns/#DNS-2)