Azure の仮想ネットワークで複数の DNS Server を指定した際の動作

Azure の仮想ネットワークまたは NIC の設定 (VM/VMSS のみ) で DNS サーバーを指定できますが、可用性や負荷分散のために DNS サーバーを複数指定することができます。Azure の代表的なサービスにてどのような場合に複数の DNS サーバーが機能するのかを確認してみます。

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?tabs=redhat#specify-dns-servers

## 構成
以下のような構成にて DNS サーバーを 3 台構成し、DNS サーバー側でパケットキャプチャを確認して、いくつかの代表的なプロダクトの挙動を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/66a0ea7c-b2f5-7833-5f75-7b5863be2363.png)

## DNS フォワーダーの準備

Windows Server 2022 の仮想マシンを 3 台作成し、DNS サーバーの役割を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b7c6e0b8-ca1f-a055-bdc4-23c0c2e4cb09.png)

DNS サーバーのフォーワーダーの設定にて 168.63.129.16 を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/3486d407-bafa-bfe7-ea36-d9dd3bec53bc.png)

フォーワーダーのみ利用したいためルートヒントはすべて消しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d16c0582-4167-6527-77fe-ed7fa49b5401.png)

## 仮想ネットワークの DNS 設定
仮想ネットワークの DNS 設定にて DNS サーバーの IP アドレスを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/55bbba8a-785f-01ef-2ced-4aa9fba8c8b2.png)

## Windows VM の挙動
Windows Server 2022 の仮想マシンにて動作を確認します。

### フォワーダーが構成されている場合の挙動

#### nslookup での動作確認
nslookup で AzureDNS でホストしている FQDN の名前解決を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/fef1932b-87b7-cd96-29df-3c5343d69ddf.png)

パケットをみると DNS の設定で一番上に位置している DNS サーバーのみで名前解決要求が行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/bfec598b-c299-8a7c-7684-9aab04c77414.png)

#### ブラウザでの動作確認
ブラウザで FQDN で接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/8a00f549-aae4-4f11-def3-3c0e1af242af.png)

パケットをみると DNS の設定で一番上に位置している DNS サーバーのみで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/9d1ec6be-1d76-e4f6-9347-c32c2ec3308a.png)

### フォワーダーが構成されていない場合の挙動
3 台の DNS サーバーのフォワーダーを削除して、DNS サービスを再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/22aea9ae-939a-f64f-a77f-ef0b3d6c5de4.png)

#### nslookup での動作確認
名前解決は失敗するようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/860380d7-cc5c-d0db-2ed5-ade3cd124758.png)

パケットをみると DNS の設定で一番上に位置している DNS サーバーのみで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/1c1f9a6e-e982-062a-b7ba-1354a869d54b.png)

#### ブラウザでの動作確認
ブラウザで FQDN で接続し、名前解決が失敗することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/43ef5d64-a192-2120-bb47-bc030c3e8931.png)

パケットをみると名前解決要求が全台の DNS サーバーに送られていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/80eb7a32-de1b-b6ae-5a7b-2812f3fb6f57.png)

試しに上から 2 番目の 10.30.0.5 の DNS サーバーだけフォワーダーの設定を入れたところ、名前解決要求が成功しました。名前解決要求が失敗する場合はブラウザが各 DNS サーバーに名前解決要求を行い利用可能な DNS サーバーを利用する動作であるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/36e84636-41de-a177-05ab-db1510e1179f.png)

## Linux VM の挙動
Linux VM (Ubuntu 20.04 LTS) でも同様の確認をしてみます。

### フォワーダーが構成されている場合の挙動

#### nslookup での動作確認

nslookup を実行し、名前解決が成功することを確認します。Linux の場合、127.0.0.53 が DNS サーバーとして表示されていますが、これは "systemd-resolved" というサービスが DNS クエリを処理しているために、このような動作になるようです。

```
hiyama@vm-lin-cl01:~$ nslookup appgwv2.hiyamanet2.org
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   appgwv2.hiyamanet2.org
Address: 4.xx.xx.40

hiyama@vm-lin-cl01:~$ nslookup appgwv2.hiyamanet2.org
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   appgwv2.hiyamanet2.org
Address: 4.xx.xx.40

```

DNS サーバー側のパケットキャプチャをみると DNS の設定で 1 番上に位置している DNS サーバー (10.30.0.4) のみで名前解決要求が行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/431ec1de-770c-983a-413d-7cd8a47ccc06.png)

#### curl での動作確認

curl コマンドを実行し、名前解決が成功することを確認します。

```
hiyama@vm-lin-cl01:~$ curl -v http://appgwv2.hiyamanet2.org
*   Trying 4.xx.xx.40:80...
```

DNS サーバー側のパケットキャプチャをみると DNS の設定で 1 番上に位置している DNS サーバーのみで名前解決要求が行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b27a3670-0446-5b36-38e0-0d13c3527102.png)

### フォワーダーが構成されていない場合の挙動

#### nslookup での動作確認
名前解決が失敗することを確認します。

```
hiyama@vm-lin-cl01:~$ nslookup appgwv2.hiyamanet2.org
;; Got SERVFAIL reply from 127.0.0.53
Server:         127.0.0.53
Address:        127.0.0.53#53

** server can't find appgwv2.hiyamanet2.org: SERVFAIL

hiyama@vm-lin-cl01:~$ nslookup appgwv2.hiyamanet2.org
;; Got SERVFAIL reply from 127.0.0.53
Server:         127.0.0.53
Address:        127.0.0.53#53

** server can't find appgwv2.hiyamanet2.org: SERVFAIL
```

DNS サーバー側のパケットキャプチャをみると 3 台すべての DNS サーバーへで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/fc7064f5-183c-724c-1864-efbe2198c296.png)

3 台目のみフォワーダーを追加したところ、名前解決が成功しました。名前解決要求が失敗する場合は各 DNS サーバーに名前解決要求を行い利用可能な DNS サーバーを利用する動作であるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/432998e0-9958-188a-f38b-2a6d6cba845b.png)

#### curl での動作確認
名前解決が失敗することを確認します。

```
hiyama@vm-lin-cl01:~$ curl -v http://appgwv2.hiyamanet2.org
* Could not resolve host: appgwv2.hiyamanet2.org
* Closing connection 0
curl: (6) Could not resolve host: appgwv2.hiyamanet2.org
```

DNS サーバー側のパケットキャプチャをみると 3 台すべての DNS サーバーへで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/4d5b5845-0706-0c6a-d086-fd82d11f36f5.png)

3 台目のみフォワーダーを追加したところ、名前解決が成功しました。名前解決要求が失敗する場合は各 DNS サーバーに名前解決要求を行い利用可能な DNS サーバーを利用する動作であるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/432998e0-9958-188a-f38b-2a6d6cba845b.png)


## Application Gateway の挙動

DNS テスト用の WebApps を作成し、Application Gateway のバックエンドに登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/5346e47b-e5ea-5a95-774e-6587a3836d0e.png)

フォワーダーが構成されてる場合でも DNS サーバー側のパケットキャプチャをみると 3 台すべての DNS サーバーへで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/348efc53-7366-4f75-91b4-164f26bd4033.png)

意図的に全台の DNS サーバーから DNS フォーワーダーを削除し、Application Gateway で 502 Bad Gateway が表示される状態で 1 台だけ DNS フォーワーダーを追加したところ Application Gateway が正常に動作したため、各 DNS サーバーに名前解決要求を行い利用可能な DNS サーバーを利用する動作であるようです。

## Azure Firewall DNS Proxy の挙動
Azure Firewall を Standard SKU で構成し、DNS Servers と DNS Proxy の設定を行います。仮想ネットワークの DNS 設定と同様 3 台の DNS サーバーを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/53681227-6886-e393-6d8f-b9d77291e66a.png)

### フォワーダーが構成されていない場合の挙動

Windows VM から Azure Firewall のプライベート IP アドレスを指定して nslookup を行い、名前解決が失敗することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/c1094847-a097-c191-05cd-e0c5ac6dad6b.png)

パケットキャプチャをみると 3 台すべての DNS サーバーへで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/60c927d4-b778-22af-0547-651587eacabe.png)

### 2 台目の DNS サーバーにフォワーダーを追加

Azure Firewall のプライベート IP アドレスを指定して nslookup を行うと、うまく行ったり、いかなかったりしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/cf26e420-f8d7-c1e3-f5df-119e5ca04216.png)

パケットキャプチャをみると　3 台すべての DNS サーバーへランダムで名前解決要求が行われており、2 台目にリクエストが飛んだ時だけ成功しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/06f63172-9333-15e4-976f-2298fdb08827.png)

### 1,3 台目の DNS サーバーの DNS サービスを停止

nslookup が毎回成功するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/37f57350-3881-4b81-84df-6b61153bfa89.png)

パケットも 2 台目の DNS サーバーのみに転送されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/2211bda7-505d-41e9-ce86-5b49db6f9f8d.png)


## Private DNS Resolver 転送ルールの挙動
Private DNS Resolver 転送ルールセットの動作確認をします。フォーワーダーは 168.63.129.16 だとループしてしまうため、8.8.8.8 を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/9c0015dd-d4cb-18a5-014e-021d0cee8d3b.png)

Private DNS Resolver 転送ルールセットを作成し、仮想ネットワークの DNS 設定と同様 3 台の DNS サーバーを指定します。
転送条件はすべてのリクエストを転送する構成にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/be2be01a-d4bd-2909-0973-5a9c1bc54880.png)

クライアントの VM がある仮想ネットワークにリンクします。**ループを防ぐため DNS サーバー内のフォーワーダー設定は事前にすべて削除しておきます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/3b3d635f-7b69-8384-3056-a282abbfc47b.png)

Windows VM から 168.63.129.16 を指定して nslookup を実行し、名前解決が失敗することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/4a0d93de-53d9-ce1d-9ec2-f1a27631ae68.png)

パケットをみると DNS の設定で 1 番上に位置している DNS サーバーのみで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90109c6e-58c4-cad2-b932-a52531b3a010.png)

2 番目の DNS サーバーだけフォワーダーを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0a2fc96b-f49b-5cda-de46-77d2328e34e7.png)

Windows VM から複数回 168.63.129.16 を指定して nslookup を実行してみましたが、名前解決は失敗しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/3983019c-8f12-da3c-2489-0c050c476529.png)

パケットをみると DNS の設定で一番上に位置している DNS サーバーのみで名前解決要求が行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90109c6e-58c4-cad2-b932-a52531b3a010.png)

1 番目の DNS Server サービスを停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d4248bb2-68d5-764e-5eb9-663629306c8b.png)

nslookup が成功するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/601bf8d3-051b-0764-f873-e7da2d155430.png)

パケットからは DNS の設定で 1 番上に位置している DNS サーバーにリクエストが送られた後、2 番目の DNS サーバーで処理されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/1be739c7-aeba-fb09-ac60-596309853ac6.png)


## まとめ

仮想ネットワークの DNS 設定に複数の DNS サーバーがある状態で、シナリオ毎に動作するかを以下の表にまとめています。 x は切り替わらないまたは不安定な動作になる場合を示しています。〇 はシナリオに該当する状況でも問題なく利用できたという意味合いです。

| クライアント | 1 番上の DNS サーバーにフォーワーダーなし | 1 番上の DNS サーバーの DNS サービスダウン |
|-|-|-|
|Windows Server (nslookup)| x | × |
|Windows Server (Edge ブラウザ)| 〇 | 〇 |
|Linux (nslookup)| 〇 | 〇 |
|Linux (curl)| 〇 | 〇 |
|Application Gateway| 〇 | 〇 |
|Azure Firewall DNS Proxy| x | 〇 |
|Private DNS Resolver| x | 〇 |

クライアントの動作に依存するところがありますが、上記をふまえると DNS サーバーは全台でフォワーダーを正しく構成し、不具合を招くようなゾーンは作らずに稼働させるべきだと思います。