【Azure】DNSフォワード用のサーバーを作る

# 概要
前回記事の続きみたいなもの。
プライベートエンドポイントの作成により、Azure OpenAIにプライベートIPアドレス持たせてリクエストを処理させることに成功したものの、名前解決の問題が残っていた。

AzureのDNSを使っているのであれば何も問題はないのですが、
オンプレミスのDNSを使っている場合、
単純にAzure OpenAIのホスト名（***.oepnai.azure.com）を名前解決しても、
プライベートエンドポイントのプライベートIPアドレスは帰ってこない。
加えて、azure.comドメインなので、こちらのDNSサーバーに名前解決を設定することもできないので。

ならばどうするかというと、以下の3点がポイントになる。
- AzureのプライベートDNSゾーンを使って、***.openai.azure.comのプライベートIPアドレスの名前解決を登録
- Azure上に、AzureのDNS（プライベートDNSゾーン）を参照するDNSサーバーを作成
- オンプレミスのDNSにDNSフォワーディングの設定を行い、Azure上に作成したDNSサーバーにフォワーディングをかける

# 全体構成図
いろいろやり方はあると思うが、ひとまず下記のような構成で検証する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420694/e36b4f1e-51d3-d846-f2f9-aaef04704215.png)


# 設定
## プライベート DNS ゾーンの設定
プライベートエンドポイントを作成するときに、**プライベートDNSゾーンと統合する**を設定しておくと、自動的に作成されているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420694/57d9f9b4-76fd-2687-7002-b561376f9fc3.png)

::: note
簡単に言えば、仮想ネットワーク内のみに適用されるDNSレコードの設定。
AzureのDNSを参照する場合、ここに登録したレコードを優先して名前解決が行われます。
:::

プライベートDNSゾーンに名前解決が必要なレコードを追加しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420694/0ca96b11-aa34-096c-db69-90d1894edd5e.png)
### 名前解決を試す
プライベートDNSゾーンが含まれる仮想ネットワークに存在する仮想マシンから、
nslookupコマンドを使ってDNSレコードの設定が反映されていることを確認する。
**AzureのDNS（168.63.129.16）を参照して名前解決を試す。**

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

https://learn.microsoft.com/ja-jp/azure/virtual-network/what-is-ip-address-168-63-129-16

```
# nslookup
> server  168.63.129.16
Default server: 168.63.129.16
Address: 168.63.129.16#53
> ***.openai.azure.com
Server:         168.63.129.16
Address:        168.63.129.16#53

### プライベートDNSゾーンに設定した結果が帰ってくることを確認
```

## DNSフォワード用サーバーの設定
今回はnamed-chrootでDNSサーバーを構築します。
インストールと簡単な初期設定を行う
```
# dnf install bind bind-chroot
# cp /etc/named.conf /var/named/chroot/etc/
# chown -R named:named /var/named/chroot/var/named/
# chown root:named /var/named/chroot/etc/named.conf
# vi /var/named/chroot/etc/named.conf
```
named.confを修正
```conf:named.conf
// コメントアウトして外部からのLISTENを受けるける
// listen-on port 53 { 127.0.0.1; };

// IPv6はとりあえず無効化
listen-on-v6 { none;};

// DNSフォワード用なので再帰問合せは無効
// recursion yes;

// DNSSEC関連は無効
//dnssec-validation yes;
dnssec-enable no;
dnssec-validation no;

// DNSフォワード設定を追加
zone "azure.com" {
        type forward;
        forward only;
        forwarders {
                168.63.129.16;
        };
};
```
named-chrootを起動
```
# systemctl start named-chroot
```
### 名前解決を試す
動作を検証する。
nslookupで自身を参照するようにして、プライベートDNSゾーンで設定したホストの名前解決がプライベートIPアドレスでできていればOK。

```
# nslookup
> server localhost
Default server: localhost
Address: 127.0.0.1#53
> ***.openai.azure.com
Server:         localhost
Address:        127.0.0.1#53

### プライベートDNSゾーンに設定した結果が帰ってくることを確認
```

## オンプレミスDNSの設定
オンプレミスDNSにも、DNSフォワーディングの設定を行う。
```
# vi /var/named/chroot/etc/named.conf
```
named.confを修正
```conf:named.conf
// DNSフォワード設定を追加
forwarders {
        [作成したフォワード用DNSののIPアドレス];
};
```
:::note warn
必要に応じて特定ゾーンに設定しても良い
:::

設定を反映
```
# systemctl restart named-chroot
```
### 名前解決を試す
オンプレミスDNSからプライベートDNSゾーンを参照した名前解決ができることを確認する。
```
# nslookup
> server localhost
Default server: localhost
Address: 127.0.0.1#53
> ***.openai.azure.com
Server:         localhost
Address:        127.0.0.1#53

### プライベートDNSゾーンに設定した結果が帰ってくることを確認
```