NSX ALB 21.1 で DNS Provider (DNS サーバー) を構成してみる

# はじめに

VMware NSX Advanced Load Balancer (NSX ALB) は、クラウドネイティブ時代にピッタリなソフトウェアベースのロードバランサーです。旧 Avi Networks の技術を活用しており、マルチクラウド環境においても、柔軟にスケールし、かつ WAF (Web Application Firewall) や GSLB (Global Server Load Balancing) など、豊富な機能を備えていることが特徴です。
また、トラヒックの可視化や分析の機能が非常に優れており、個人的に、とても好きなソリューションです。

もし、ご興味を持っていただけたら、VMware Japan Blog に、面白い記事が沢山ありますので、ぜひ、参考にしていただければと思います。

https://blogs.vmware.com/vmware-japan/solution/network/nsx-advanced-load-balancer

今回は、この NSX ALB を使って、DNS サーバー (実体としては DNS 用の Virtual Service) を構成する方法をご紹介します。

ただ、「なぜ、わざわざ LB を使って DNS サーバーなんて建てるの？」と思われるかも知れません。
これは、GSLB を構成する際に必須となることに加えて、Kubernetes と NSX ALB を組合せて、Ingress を構成する際に、NSX ALB が Ingress リソースに対する名前解決を自動で構成してくれるので、非常に便利だからです。
NSX ALB を使った Ingress の構成は、別の機会に記事にできればと思います。


# 前提

NSX ALB の公式ドキュメントに従って、NSX ALB Controller が構成され、クラウド環境として vCenter との連携が構成されていることを想定しています。

https://docs.vmware.com/jp/VMware-NSX-Advanced-Load-Balancer/index.html

また、利用している製品のバージョンは下記の通りです。

* NSX Advanced Load Balancer 21.1.4-2p3 (Build 9210)
* vCenter 7.0 Update 3h (Build 20395099)
* ESXi 7.0 Update 3g (Build 20328353)


# 手順

## DNS Profile の設定

まず、NSX ALB がホストすべきドメインを Profile として構成します。

[Templates] -> [Profiles] -> [IPAM/DNS Profiles] のページまで進み、右上の [CREATE] のボタンを押して、[DNS Profile] を選択します。

[Name] に、この Profile の名前を設定し、[Domain Name] の部分に、NSX ALB がホストすべきドメイン (の候補) を設定します。
ここでは TTL をデフォルト値のまま、[Save] しています。
![Screen Shot 2022-11-18 at 23.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/67f5631b-71b2-b595-fbc9-d183a823ff0e.png)


## DNS Virtual Service の作成

実際に、DNS 用の Virtual Service (VS) を作成していきます。

[Applications] -> [Dashboard] のページまで進み、[CREATE VIRTUAL SERVICE] から [Advanced Setup] で、VS 作成ウィザードを開始します。

[Name] に、この VS の名前を設定し、[Profiles] -> [Application Profile] において [System-DNS] を選択します。
そして、[Service Port] -> [Services] の部分のポート番号が、自動で 53 になっていることを確認します。
![Screen Shot 2022-11-19 at 0.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/a728806c-01d4-6de5-7037-9bfa5247d2a7.png)

[VIP Address] -> [VS VIP] の部分では、[Create VS VIP] から、VS VIP の作成ウィザードを開始します。

[Name] の部分は自動生成されたもので、特に問題無ければ、そのままで構いません。
![Screen Shot 2022-11-19 at 0.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/0f83e2ef-ecac-5131-b0ce-6f41c15f1fd4.png)

まずは、[VIPs] の [ADD] ボタンから、VIP を指定していきます。

[IPv4 Address] として、DNS 用の VS が持つべき IP を指定します。
![Screen Shot 2022-11-19 at 0.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/581e7c69-ab40-5d58-7ed7-9a4b6f742bf1.png)


[Placement Network] の部分は、VS が配置されるべきネットワークを指定します。
![Screen Shot 2022-11-19 at 0.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/db119b4a-c642-e351-5bdd-ee4b30c3134f.png)

そして、それぞれ [SAVE] を実行し、下記の画面まで戻って来たら、DNS の部分を指定していきます。
![Screen Shot 2022-11-19 at 0.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/7b78badd-4fd8-8732-95fe-eff21eef6d04.png)

ここでは、VS 名を DNS 用の VS のホスト名として指定しています。
![Screen Shot 2022-11-19 at 0.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/8cac6934-9c46-c9c5-1a4c-b5ea6a05778b.png)

ここまでの内容が [SAVE] できたら、下記の画面まで戻って来ます。
![Screen Shot 2022-11-19 at 0.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/a728806c-01d4-6de5-7037-9bfa5247d2a7.png)

[Pool] の部分はオプションですが、設定することで、NSX ALB でホストしないレコードに関しては、Pool のメンバーに登録された DNS サーバーに名前解決を転送することができます。

ここでは、Health Monitor として [System-DNS] を指定しつつ、
![Screen Shot 2022-11-19 at 0.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/987e5840-eca8-8d2a-2040-13cc5ca67e7a.png)

`172.19.31.254` という DNS サーバー (実体は DNS Forwarder) を Pool メンバーとして設定しています。
![Screen Shot 2022-11-19 at 0.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/21ef87aa-58f2-1c36-0b48-c8419ef8e505.png)

[Advanced] 設定の画面では、利用する Service Engine Group を忘れず、指定してください。
![Screenshot 2023-01-13 at 18.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/c5e024f7-6d79-05c6-cfae-dbcb7500eaac.png)


その他は、DNS 用 VS 特有の設定としては、[Static DNS Records] の画面で、静的な DNS レコードを設定することも可能です。
![Screen Shot 2022-11-19 at 0.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/a4e270d6-cd1f-3bc4-6b72-107e106340ab.png)


## DNS Service の有効化

作成した VS 上での DNS Service を有効化します。

[Administration] -> [Settings] -> [DNS Service] と進み、作成した DNS 用の VS を設定します。
![Screen Shot 2022-11-19 at 0.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/1108a093-b95a-49cb-c9ba-1e36ddd2b410.png)

ここまでで、基本的な設定は完了しており、VS の VIP 上で、DNS サーバーが動作しています。


# 動作確認

構成した VS を DNS サーバーとして指定し、名前解決ができることを確認します。

まずは、VS 自身に対する名前解決を確認します。

```sh
$ nslookup dns01.ako.test 172.19.31.230
Server:		172.19.31.230
Address:	172.19.31.230#53

Name:	dns01.ako.test
Address: 172.19.31.230
```

もし、静的な DNS レコードを登録していれば、それに対する名前解決を確認しても良いと思います。

また、オプションとして紹介した機能として、Pool メンバーに上位 DNS サーバーを登録していれば、NSX ALB がホストしてないドメインについては、その DNS にリクエストを転送することができるはずです。
その場合、コマンド応答の `Non-authoritative answer` という部分で、リクエストが転送されたことが確認できます。

```sh
$ nslookup google.com 172.19.31.230
Server:		172.19.31.230
Address:	172.19.31.230#53

Non-authoritative answer:
Name:	google.com
Address: 142.250.189.238
Name:	google.com
Address: 2607:f8b0:4005:80e::200e
```


# 参考ドキュメント

今回の内容は、公式ドキュメントとしては、下記で解説されています。

https://avinetworks.com/docs/21.1/dns-provider-avi-vantage/