自宅環境のWindows Server 2022を使ったDNS構築と名前解決の技術検証

## はじめに
実務で社内/社外DNSのフォワード設定やゾーンファイルの削除・復元を検証した際、多くの技術的な課題に直面し、案件の進捗が悪く、上司に詰められる日々が続きました（笑）

納期までに間に合いそうになかったため、帰宅後も自宅のDNSサーバーで動作確認や知識整理を行いました。

QiitaにはBINDの情報が多く、Windows Serverの情報が少ないため、今回は自分の検証内容を記事にまとめます。

## 前提条件

今回の検証を進めるにあたり、以下の環境が必要です。

:::note info
**検証環境**
**サーバー環境:** 
VirtualBox上で稼働しているWindows Server 2022を使用

**クライアント環境:** 
VirtualBox上で稼働しているWindows 10端末（評価版）を使用

**DNSサーバーの役割:** 
AD統合DNSを使用し、内部ネットワークの名前解決を行う

**使用ミドルウェア:** 
Windows ServerのDNS機能を採用

**ネットワーク:** 
サーバーとクライアントが同一のローカルネットワーク内に接続されていること
:::


**自宅のVirtualBox環境**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6548c2dd-7761-be07-4780-ad64a6543e04.png)


※検証には実行中の「Windows Server 2022」「Windows 10端末」「AlmaLinux」を使用します。


## DNSと名前解決について
DNS（Domain Name System）と名前解決について、私なりに解説します。

### DNSとは？
DNS（Domain Name System）は、インターネットやネットワークで使用される 「ドメイン名」（例: www.example.com）と 「IPアドレス」（例: 192.0.2.1）を相互に変換するシステムです。

IPアドレスはコンピュータやサーバーが通信するための住所のようなもので、ドメイン名は人が覚えやすい名前です。

### 名前解決とは？
:::note info
名前解決は、**「ドメイン名」を「IPアドレス」に変換する**プロセスです。
:::

例えば、ブラウザに www.google.com と入力すると、まずそのドメイン名を対応するIPアドレスに変換し、そのIPアドレスに接続します。この変換を行うのがDNSサーバーです。

### DNSの仕組み
DNSシステムは階層構造を持っており、ドメイン名の末尾から順に名前解決を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/267ba9f1-2a2d-89cf-19e6-ae03f3630ac1.png)
引用画像：https://xtech.nikkei.com/it/article/COLUMN/20060927/249162/zu2_2.jpg

:::note warn
世界中には、様々な種類のDNSサーバーが存在しています。どれも興味深いですね。

**ルートDNSサーバー:** 
インターネットの最上位に位置し、ドメイン名の最初の部分（トップレベルドメイン: .com や .jp）を管理するサーバーへ接続します。

**TLD（トップレベルドメイン）DNSサーバー:**
.com や .jp などを管理し、その下位のドメイン（例: example.com）のDNSサーバーの情報を持っています。

**権威DNSサーバー:** 
各ドメイン（例: example.com）の最終的なIPアドレスを管理し、ドメイン名とIPアドレスを結びつける役割を果たします。
:::

## DNSと名前解決の流れ
①から⑥の順番で名前解決が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/997901d8-2c07-e821-0a21-0611e85acf75.png)

引用画像：https://www.no1web.jp/blog/15098/

ざっくりと簡潔にまとめると以下のようになります。

```
キャッシュの確認: ローカルPCやルーターが、以前に同じドメインにアクセスした場合、キャッシュに保存されているかを確認します。
↓
ローカルDNSサーバーへ問い合わせ: キャッシュがない場合、PCは設定されたDNSサーバー（通常、ISPや社内のDNSサーバー）に問い合わせます。
↓
名前解決のリクエスト: DNSサーバーは、ドメイン名のIPアドレスを調べるために、ルートDNSサーバーや他のDNSサーバーに問い合わせを行います。
↓
結果の返送: DNSサーバーが最終的なIPアドレスをPCに返し、その後接続が行われます。
```

## 構築/検証の流れ

DNSサーバーの構築、Windows 10端末でのセットアップ、および nslookup コマンドを使った検証の流れを2つのステップで説明します。

**ステップ1：DNSサーバーの構築**
**ステップ2：Windows 10端末でのセットアップと検証**

:::note warn
以下の記事でも紹介していますが、ADを構成する際にはDNSが動的にインストールされるため、過去の記事も合わせてご参照ください。

[Windows Server 2022で自宅ネットワークにADサーバーを構築し、Windows 10端末をドメインに参加させる方法](https://qiita.com/free-honda/items/2fcdc8343aa878c17d9e)
:::

## ステップ1：DNSサーバーの構築

まず、DNSサーバーを構築するためにWindows Serverを使用します。
**サーバーの準備**

```
・Windows Server 2019/2022（DNSロールをインストール）
・Static IPアドレス（サーバーに固定IPを設定）
```

**DNSロールのインストール**
```
・サーバーマネージャーを開く。
・[役割と機能の追加] をクリックし、DNSサーバーのロールを追加します。
・ウィザードに従い、DNSサーバーをインストールします。
・インストールが完了したら、サーバーを再起動します。
```

**前方参照ゾーンの設定**
```
・DNSマネージャーを開きます。
・前方参照ゾーンを右クリックし、新しいゾーンを選択。
・ウィザードに従い、次のように設定します:
　　ゾーンの種類: プライマリゾーン
　　DNS名: 例として honda.co.jp など自分の好きなゾーン名を設定します。
　　ゾーンファイル: 自動生成。
・設定が完了したら、ゾーン内に新しいホスト(A)レコードを作成します。
  たとえば、サーバーの名前を server1.example.local にし、そのIPアドレスを設定します。
```

私の環境では、「honda.co.jp」というゾーン内に「honda」というAレコードを「1.1.1.1」で登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/523c2208-337b-5a78-17d1-caed69503a34.png)


逆引き参照ゾーンの設定は任意なので、ここでは設定せずに次の検証に進みます。

## ステップ2：Windows 10端末でのセットアップと検証
**Windows 10端末でのDNS設定**

端末側にもDNSの設定を明示的に行います。
```
・Windows 10の設定を開きます。
・[ネットワークとインターネット] に移動し、現在使用しているネットワーク（Wi-Fiまたはイーサネット）を選択。
・[IP設定の編集] をクリックし、DNSサーバーのアドレスを手動で指定します。
　→ここでは、先ほど構築したDNSサーバーのIPアドレス（例: 192.168.1.7）を入力します。
```

私の環境では、優先DNSにDNSサーバーのIPアドレスである「192.168.1.7」を設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1de3772f-fd62-9213-6009-17b945cfb718.png)


### **nslookupコマンドによる検証①**
コマンドプロンプトを開き、以下のコマンドを実行してDNSサーバーが正しく動作しているか確認します。
```
nslookup honda.co.jp(ご自身のゾーン名に置き換えてください)
```

正常に設定されている場合、honda.co.jp のIPアドレス（例: 192.168.1.7）が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/829479ce-1b22-902b-ea47-291838820f97.png)

### **nslookupコマンドによる検証②**
同様に、コマンドプロンプトを開き、以下のコマンドを実行して登録したレコードを名前解決できるか確認します。
```
nslookup honda(追加したAレコードに置き換えてください)
```

正常に設定されている場合、honda のAレコード（例: 1.1.1.1）が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/02a54e2e-424f-826b-378d-2e01f8e6ea92.png)

:::note info
想定通り、構築したDNSサーバーから名前解決の応答があることを確認できました。
:::

実務だと、パケットキャプチャなどを取得してWiresharkで通信の流れを解析した苦い思い出があります（笑）

## まとめ
今回の検証では、DNSサーバーの構築とWindows 10端末でのDNS設定が成功し、nslookupコマンドによる名前解決が正しく動作することを確認しました。

honda.co.jp ゾーンとAレコード「honda」のIPアドレスが正確に返され、DNSサーバーの設定が正常であることが証明されましたので、今回の構築は成功と言えそうです。

DNS構築や名前解決の動作検証もばっちりですね！

## おまけ
自宅のプライベートPC(Windows/Mac)には、意図的にGoogleの「8.8.8.8(優先)」「8.8.4.4(代替)」パブリックDNSを設定しています。
心なしか、インターネットアクセスが少しだけ速くなった気がしますが、DNSの設定を無闇に変更するとインターネットに接続できなくなる場合があるので、気をつけてくださいね！

次回以降は、より詳細なAD統合DNSの設定や、さらに高度なフォワーダーの設定について触れていきたいと思います。

## 参考記事
https://qiita.com/Higemal/items/aae749ff4d3c375362bf

https://jp.fujitsu.com/platform/server/primergy/technical/construct/pdf/win2016-network-guide.pdf

https://qiita.com/dessin/items/ebfea655a82a809af866