技術検証：MacBook上でBINDを用いたDNSサーバーの構築と名前解決の検証

## はじめに
MacBook上でBINDを利用してDNSサーバーを構築する方法について説明します。

:::note info
**BINDは多くのOSで使用可能なDNSサーバーソフトウェアであり、macOSでもHomebrewを用いることで簡単にインストールおよび設定が可能です。**
:::

過去の記事では、Windows ServerでDNSサーバーを構築し、名前解決の検証を行っていますので、興味のある方は参考にしてみてください。

https://qiita.com/free-honda/items/807b36c839f49d7bdb47

### 注意点
この記事執筆当初、自分のMacBookをDNSサーバーとして構築し、名前解決を試した際には特にエラーは発生しませんでした。

:::note alert
**しかし、最近になってこちらの記事を確認したところ、MacBookが落ちる事象が発生しています。**
***そのため、以下の内容を実施する場合は、自己責任でお願いいたします。***
:::

## 知識整理
### DNSとは
DNS（Domain Name System）は、ドメイン名とIPアドレスを相互に変換するシステムです。

:::note warn
**インターネット上のホストやサービスに人間がわかりやすい名前（例：example.com）を与え、それをIPアドレスに変換することでアクセスを容易にしています。**
:::

### BINDとは
BIND（Berkeley Internet Name Domain）は、UNIX系OS向けに開発されたDNSサーバーソフトウェアで、DNSサーバーとして最も広く利用されています。

:::note
**BINDを使用することで、独自のDNSサーバーを立てることができ、ローカル環境や内部ネットワークなどでの名前解決にも役立ちます。**
:::

## 構築手順
### HomebrewでBINDをインストール 

MacでBINDをインストールするには、Homebrewを使うと簡単です。以下のコマンドでインストールを行います。

```bash
brew install bind
```

実際のインストール中の画面は以下の通りです。

![スクリーンショット 2024-10-30 21.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/665ceb2c-8535-0269-3e86-0d6f79cc9c8b.png)

:::note warn
インストール自体は、2〜3分程度で完了しました。
:::

### BINDの設定ファイルを編集 
インストールが完了したら、``/usr/local/etc/bind/named.conf``ファイルを編集します。

以下の設定を追加し、``honda.com`` のドメイン名を「1.1.1.1」に名前解決できるように設定します。

```/usr/local/etc/bind/named.conf
options {
    directory "/usr/local/var/named";
    allow-query { any; };
    listen-on { any; };
};

zone "honda.com" {
    type master;
    file "honda.com.zone";
};
```

:::note warn
ここでの設定ファイルは、必要に応じて修正してください。私の環境では、この設定ファイルをそのまま使用します。
:::

``directory``に指定したディレクトリには、各ドメインのゾーンファイルを配置します。

### ゾーンファイルの作成 
``/usr/local/var/named/honda.com.zone``というファイルを作成し、以下のように設定します。

```/usr/local/var/named/honda.com.zone
$TTL 86400
@   IN  SOA ns1.honda.com. admin.honda.com. (
        2023101801 ; Serial
        3600       ; Refresh
        1800       ; Retry
        604800     ; Expire
        86400 )    ; Minimum TTL

    IN  NS  ns1.honda.com.
ns1 IN  A   1.1.1.1
@   IN  A   1.1.1.1
```

:::note warn
**これにより、「honda.com」を「1.1.1.1」に名前解決できます。**
:::

### BINDの起動と停止 

設定が完了したら、以下のコマンドでBINDを起動します。``named.conf``ファイルのパスを指定して実行する必要があります。

```bash
sudo named -c /usr/local/etc/bind/named.conf
```

:::note alert
以下のようなエラーが発生した場合は、namedコマンドが見つからない可能性があります。PATHに追加するか、正しいフルパスを確認して実行してください。
```
sudo: named: command not found
```
:::

まず、``/usr/local/opt/bind/sbin``をPATHに追加します。お使いのシェルに応じて、以下のコマンドで設定ファイルを編集してください。

**Bash の場合:**
```bash
echo 'export PATH="/usr/local/opt/bind/sbin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
```

**Zsh の場合（macOSのデフォルト）:**

```bash
echo 'export PATH="/usr/local/opt/bind/sbin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```

その後、設定が反映されているか確認するために、以下のコマンドで``named``が呼び出せることを確認します。

```bash
which named
```

これで、``/usr/local/opt/bind/sbin`` がパスに追加され、``named``コマンドが直接実行できるようになります。

![スクリーンショット 2024-10-30 21.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/98d3ee52-cdf6-540d-0e5d-987d35f635cc.png)

停止する際は、以下のコマンドでプロセスを終了します。

```bash
pkill named
```

## 名前解決の検証　〜digコマンドで確認〜

BINDの設定が完了したら、``dig``コマンドを使って名前解決が正しく行われているか確認します。

```bash
dig @localhost honda.com
```

上記コマンドを実行し、正しいIPアドレス「1.1.1.1」が返されることを確認します。

```bash
➜  named dig @localhost honda.com

; <<>> DiG 9.20.3 <<>> @localhost honda.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 996
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: efe60facbdbacf7901000000672229ae92e83397a2376cb4 (good)
;; QUESTION SECTION:
;honda.com.			IN	A

;; ANSWER SECTION:
honda.com.		86400	IN	A	1.1.1.1

;; Query time: 1 msec
;; SERVER: ::1#53(localhost) (UDP)
;; WHEN: Wed Oct 30 21:42:22 JST 2024
;; MSG SIZE  rcvd: 82
```

:::note warn
この結果から、``honda.com``の名前解決がBINDサーバーによって正しく行われており、IPアドレス``1.1.1.1``に解決されていることが確認できます。
:::

## 名前解決の検証　〜nslookupコマンドで確認〜
さらに、``nslookup`` コマンドを使用して、名前解決の確認を行います。

```bash
nslookup
> server localhost
Default server: localhost
Address: ::1#53
> honda.com
```

応答が次のようになれば成功です。

```bash
Name:	honda.com
Address: 1.1.1.1
```

実際の検証中のターミナルの画面は以下になります。

![スクリーンショット 2024-10-30 22.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7cf4e079-0a70-3915-8996-4bcd6aa73c76.png)

## まとめ
この手順で、MacBook上でBINDを使用し「honda.com」を「1.1.1.1」に名前解決するDNSサーバーを構築できました。

:::note
**これにより、ローカル環境や小規模ネットワークで独自のDNSサーバーを運用することが可能になります。**
:::

さらに、設定ファイルを調整することで、外部DNSサーバーへのフォワード設定なども行えるので、興味があればぜひ挑戦してみてください！

## 関連記事

https://qiita.com/free-honda/items/807b36c839f49d7bdb47

https://qiita.com/free-honda/items/c806d24f127128db760b

https://qiita.com/free-honda/items/c19de4dd7930dd258c96