AVD を プライベートエンドポイント経由で 閉域接続する

# はじめに
現在は、Azure Virtual Desktop (AVD) で、ホストプールと仮想マシンを作成する際に、どれだけシンプルな画面からデプロイさせられるか？ を研究しています。
その際には、いくつかのハードルがあったのですが、そこで得られたノウハウを記事にしていこうと思っています。以下のリンク先で シリーズ化 していますので併せて参照ください。

https://qiita.com/carol0226/items/7318fdd7aff780f5177c

今回は、クライアント から AVD への接続を閉域化する方法を検証してみました。

この記事で紹介している手順は、以下の公開情報の内容をもとに作成および検証しています。

**公開情報**

https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup

プライベートエンドポイント自体がどういうものなのかは、以下の記事で 詳細に解説していますので、合わせて参照ください。

https://qiita.com/carol0226/items/ecf769b91a4a7e03dd03

---

# 1. 前提条件
## 1-1. AVD 環境
検証で使用する AVD 環境は、以下を使います。
オンプレミスドメインに参加する方式を採用しています。

全項目を終える必要はありません。No.6（簡単デプロイ）まで完了していれば、閉域化 の検証は行えます。

https://qiita.com/carol0226/items/7318fdd7aff780f5177c

---

## 1-2. 閉域網
今回の検証では、簡易的に OpenVPN で 閉域接続 を実現できる 以下の構成を使いました。

https://qiita.com/carol0226/items/7a9160b298b736aa187e

もちろん、本物の S2S を構成してもらって構いません。

:::note warn
**注意**
クライアントが、VPN 接続を行った際の名前解決は、仮想ネットワーク上に配置された DNS サーバー を参照するように構成してください。

仮想ネットワーク上の ドメインコントローラー を参照するようにしておくのがおススメです。

Private DNS ゾーンは、本資料の手順で構成しますが、VPN クライアントが 直接 Private DNS ゾーンを参照できません。
:::

---

## 1-3. 検証用クライアント

閉域網に接続できる クライアントマシン へ アプリ版の リモートデスクトップクライアント をインストールしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/91dbb35d-0188-bc4c-1e76-5cc9367c1d71.png)

**アプリの入手先**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/users/connect-windows

上記のサイトから、**前提事項** の章に 以下の赤枠のリンク先があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dd924b30-224d-b978-847c-54a231ce899e.png)

---

# 2. 構築手順
## 2-1. Azure Virtual Desktop リソース プロバイダーを再登録する
Azure Virtual Desktop で Private Link を使うには、**Microsoft.DesktopVirtualization** リソース プロバイダーを **再登録** する必要があります。 

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#re-register-the-azure-virtual-desktop-resource-provider

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/07d115d1-5f66-9495-4f10-a7699792f0b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f0cb09ac-138b-dddb-0eae-504520e87ede.png)

---

## 2-2.  プライベート エンドポイントを作成する
この章の手順を行い、**ホストプールへの接続** , **フィードのダウンロード** , **初期フィード検出** という３種類の AVD で利用される通信を プライベートエンドポイント（以後 PE と記載）で構成します。

**2-2-1. ホストプールへの接続** 
**2-2-2. フィードのダウンロード**
**2-2-3. 初期フィード検出**

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#create-private-endpoints

**上記の公開情報の補足**
No.1～4 までの記載がありますが、これは手順ではありません。
4 パターンから選択せよ・・・という意味です。

**ホストプールへの接続** , **フィードのダウンロード** , **初期フィード検出** の３種類の通信の組み合わせごとに説明されていますが、今回は 全種類の通信を閉域化したいので、以下の **シナリオ 1** を見れば良いことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e07e097d-44d8-343a-74d7-b368d736f959.png)

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#connections-to-host-pools

---

### 2-2-1. ホストプール (AVD の VM) への接続を PE 経由にする
0. **Azure Virtual Desktop** の画面を開いて、閉域化したい **ホストプール** 名を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6889f2d9-3000-e558-7106-1d9e0c15708f.png)
　<br>
0. 選択したホストプールを開いたら、左ペインの **ネットワーク** を選択して **プライベートエンドポイント接続** のタブを選択します。その後 **＋新しいプライベートエンドポイント** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/24435950-407f-9d70-59a6-238c787a0059.png)
　<br>
0. **基本** タブでは、インスタンスの **名前** を任意で指定するだけで、あとの項目は 自動的に入力されます。下図では リソースグループ名に **"PE"** を追記してみました。
　
入力したら **次：リソース** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9720a36a-4f2e-4a76-cd95-bfc01364673d.png)
　<br>
0. **リソース** タブでは、**対象サブリソース** として **connection** を選択して **次：仮想ネットワーク** へ進みます。
※公開情報で説明されている値を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/643cd809-fe87-2c62-d894-579d95a5796b.png)
　<br>
0. **仮想ネットワーク** タブでは、ホストプール に割り当てられている 仮想ネットワーク と サブネット を選択して **次：DNS** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/18f20714-035e-ff55-8a37-c17cf54752d7.png)
　<br>
0. **DNS** タブは、**プライベート DNS ゾーンと統合する** が **はい** になっていることを確認して **次：タグ** へ進み、さらに **確認および作成** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/84744b53-3fc9-c49f-9927-7a1ce1aef787.png)
　<br>
0. **確認および作成** タブでは、最終的な値を確認して **作成** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a9fac3c5-56b5-a92b-fa50-c7f8dd73e261.png)
　<br>
0. 作成が完了すると、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7e73d9da-c801-750b-dd1c-89ad496cca8b.png)

---

### 2-2-2. フィードのダウンロード を PE 経由にする

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#feed-download

0. **Azure Virtual Desktop** 画面の 左ペイン で **ワークスペース** を選択してから、閉域化させたい **ワークスペース名** を選択します。
ワークスペースの画面が開いたら、左ペインから **ネットワーク** を選び、**プライベートエンドポイント接続** のタブから **＋新しいプライベートエンドポイント** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8a85dc7b-89b9-b9fa-bca0-c3508507a90a.png)
　<br>
0. **基本** タブでは、インスタンスの **名前** を任意で指定するだけで、あとの項目は 自動的に入力されます。下図では リソースグループ名に **"-WS-PE"** を追記してみました。
　
入力したら **次：リソース** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fafa7bec-d269-8c25-54a6-43ce2cb7c534.png)
　<br>
0. **リソース** タブでは、**対象サブリソース** として **feed** を選択して **次：仮想ネットワーク** へ進みます。
※公開情報で説明されている値を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cdfcdb98-572c-8c4c-b3d2-43a60bf20dee.png)
　<br>
0. **仮想ネットワーク** タブでは、ワークスペース に割り当てられている 仮想ネットワーク と サブネット を選択して **次：DNS** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/63914219-8436-41d0-05ee-031bf3dfe89f.png)
　<br>
0. **DNS** タブは、**プライベート DNS ゾーンと統合する** が **はい** になっていることを確認して **次：タグ** へ進み、さらに **確認および作成** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2a647498-b271-818c-e99e-4fee6d44ee83.png)
　<br>
0. **確認および作成** タブでは、最終的な値を確認して **作成** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cd7b71af-0406-6e05-af6a-8d9a2cee14c3.png)
　<br>
0. 作成が完了すると、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a85fbe13-1dab-02a5-dd9f-beae2a9e0d9d.png)

---

### 2-2-3. フィードの初期検出 を PE 経由にする

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#initial-feed-discovery

0. 一覧には、前章で作成した プライベートエンドポイント が１行追加されています。
もう１つ作成するので、再度 **＋新しいプライベートエンドポイント** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d3f618e8-6e7a-8b24-ea67-301886a99723.png)
　<br>
0. **基本** タブでは、インスタンスの **名前** を任意で指定するだけで、あとの項目は 自動的に入力されます。下図では リソースグループ名に **"-WS2-PE"** を追記してみました。
　
入力したら **次：リソース** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d311c6d6-ce6b-5fd5-35e9-392431ebd1b6.png)
　<br>
0. **リソース** タブでは、**対象サブリソース** として **global** を選択して **次：仮想ネットワーク** へ進みます。
※公開情報で説明されている値を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c95ae260-3e90-478b-641c-a648dfd30a61.png)
　<br>
0. **仮想ネットワーク** タブでは、ワークスペース に割り当てられている 仮想ネットワーク と サブネット を選択して **次：DNS** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c2c2899f-2c10-2c46-f577-7c37ec1a29ae.png)
　<br>
0. **DNS** タブは、**プライベート DNS ゾーンと統合する** が **はい** になっていることを確認して **次：タグ** へ進み、さらに **確認および作成** へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/95b9e824-810a-52be-5ce9-dba3e7cb1e51.png)
　<br>
0. **確認および作成** タブでは、最終的な値を確認して **作成** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0c8292c8-29b6-338d-070f-428e1beec25c.png)
　<br>
0. 作成が完了すると、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d26eb977-94f8-6ac4-86fd-cc50f1c1bdfa.png)

:::note info
以上で、**PE** の作成は完了です。
**プライベート DNS ゾーン と統合する** が **はい** となっているため、合わせて 内部的な DNS を提供するサービスもデプロイされています。
:::

---

## 2-3. 名前解決の確認
ここまで構成がおわると、以下のように Private DNS ゾーンが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/114795b7-4965-c22f-ab8a-7edc8b1eb4e7.png)

クライアントから、VPN を使って Azure 仮想ネットワークへ接続してください。
→　前提で説明した OpenVPN や その他の VPN (S2S など）を使います。

DNS の参照先が 仮想ネットワーク上の DNS サーバー になっているか確認します。

---

### 2-3-1. コントロールプレーンへの名前解決
**Privatelink-global.wvd.microsoft.com** という DNS ゾーン 上に、以下の３つのレコードが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7eee97b5-d274-dbb7-1d83-797246107244.png)

その３つのレコードは、以下のように 名前解決が行われて、プライベートアドレスが返されている事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b60d6c96-d132-b0a8-e574-6f610840a5b7.png)

プライベートエンドポイントは、以下のように構成されており、上記で名前解決されたアドレスと一致していることが判ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8407024d-0b93-b8d5-c416-e8de19ff694f.png)

---

### 2-3-2. セッションホストへの名前解決
**Privatelink.wvd.microsoft.com** という DNS ゾーン 上に、以下の通り 複数のレコードが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6cdefa99-5482-c80c-1db4-efd70a9b4302.png)

以下のように 名前解決が行われて、プライベートアドレスが返されている事を確認します。（数が多い為、１件のみキャプチャしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6f7d084e-652e-fd55-3ac7-0c21942425f3.png)

プライベートエンドポイントは、以下のように構成されており、上記で名前解決されたアドレスと一致していることが判ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3853f884-7f5b-1623-2b8c-c5fc367914bc.png)

:::note info
**ポイント**
この状態で クライアント から AVD への接続を行うと、閉域でも接続が可能になっています。
なお、この時点では 以下の両方のルートが有効です。
・VPN が **接続** されていると **閉域経由**
・VPN が **切断** されていると **インターネット経由**
:::

---

# 3. パブリックルートを閉じる
本章の設定を行う事で、インターネットからのアクセスをブロックし、完全に閉域化する事ができます。

**公開情報**
https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2#closing-public-routes

## セッションホスト へのパブリックルートを閉じる
セッションホストへの閉域接続がうまく構成できていれば、以下のように アクセスを プライベートのみ に制限しても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7808ba1f-3a02-73f2-0c62-ab865ee177f9.png)

上記の制限を行った状態では、セッションホスト への RDP 接続の結果に変化があります。
**（VPN 切断時）**
以下のようなエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3be7674d-0b59-72fe-af43-fb1b26d2b6d3.png)

**（VPN 接続時）**
閉域経由で、RDP 接続が成功します。

---

## コントロールプレーン へのパブリックルートを閉じる
コントロールプレーンへの閉域接続がうまく構成できていれば、以下のように アクセスを プライベートのみ に制限しても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dc52f766-9c83-f2de-c7df-6cfdaff514e3.png)

上記の制限を行った状態では、リモートデスクトップクライアントの表示に変化があります。
**（VPN 切断時）** 接続可能なセッションホストが無くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2fcb6bb7-c0df-43bc-5382-a834e1f40af0.png)

**（VPN 接続時）** 接続可能なセッションホストが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d9204e45-0601-6a56-0020-a35a82ec1b70.png)


以上で、AVD の 閉域化は完了です。おつかれさまでした。