DNSなしの閉域環境でApp Serviceに接続する（P2S接続）

Azure Advent Calendar 2021　12/12(日)の記事として投稿します。

# 0.構成図
今回の構成図。自宅の端末からPoint to Site（P2S）でAzure仮想ネットワークに閉域で接続し、App Serviceに安全に接続する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/17f10145-2197-ef94-520e-e8fe8a624004.png)

# 1.準備
以下リソースを作成しておく。

- リソースグループ
- 仮想ネットワーク（Vnet。今回は192.168.0.0/20）
  - GatewaySubnet（今回は192.168.5.0/24）
  - アプリケーションゲートウェイ用サブネット（今回は192.168.10.0/24）
- 仮想ネットワークゲートウェイ（VPNGW） 
- App Service（BasicプランでOK。ランタイム等も適当で）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b35f7e60-f641-7726-e1f2-afa9dfa4cd8a.png)

インターネットに接続している自宅の端末から、作成したApp Serviceにアクセスできることを確認しておく。今回ブラウザはGoogle Chromeを使用している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8a4cb389-47f9-e561-7a14-c3346409d6b8.png)

# 2.アプリケーションゲートウェイの作成
1.で作成したリソースグループに、アプリケーションゲートウェイを作成する。

## ◆基本◆

- **インスタンスの詳細**
  - ゲートウェイ名：任意
  - 地域：東日本
  - レベル：Standard v2
  - 自動スケール：いいえ
  - インスタンス数：2
  - 可用性ゾーン：なし
  - HTTP2：無効

- **仮想ネットワークの構成**
  - 仮想ネットワーク：（1.で作成した仮想ネットワークを指定）
  - サブネット：（1.で作成したアプリケーションゲートウェイ用のサブネットを指定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7741946f-6873-d20b-479e-8e9c55c01a1e.png)

## ◆フロントエンドの数◆

- フロントエンドの種類：両方（今回プライベートIPが必要だが、プライベートIPのみは選択できないため）
- パブリックIPアドレス：新規
- プライベートIPアドレスの指定：はい
  - プライベートIPアドレス：1.で作成したアプリケーションゲートウェイ用のサブネット範囲から任意（今回は192.168.10.10）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/bcee896a-a667-0ccc-e790-50f4d9a41de8.png)

## ◆バックエンド◆
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/1f8bf033-519f-bb61-e973-eb63ef1b7715.png)

- バックエンドプールの追加
  - 名前：任意（今回はAGWBackendPool）
  - ターゲットを持たないバックエンドプールを追加します：はい（後で設定する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/60dbe7a1-e3d1-d105-e2e6-ba7474a3ad98.png)

## ◆構成◆

### ルーティング規則の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6615e57a-885e-a751-81fb-81de6680e110.png)
####ルール名：任意（今回はAGWRoutingRole）
##### リスナー
- リスナー名：AGWListener
- フロントエンドIP：プライベート
- プロトコル：HTTP
- ポート：80
- **追加設定**
  - リスナーの種類：Basic
  - エラーページのURL：いいえ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ba5c8891-19c7-7b3d-18b6-f73b046661c5.png)

##### バックエンドターゲット
- ターゲットの種類：バックエンドプール
- バックエンドターゲット：作成済みのバックエンドプール（今回はAGWBackendPool）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5bf34d25-e9e0-73a8-ac07-bfc2aa48df87.png)
###### HTTP設定（新規作成）
- HTTP設定名：任意（今回はHTTPSettings）
- バックエンドプロトコル：HTTP
- バックエンドポート：80
- **追加設定**
  - Cookieベースのアフィニティ：無効化
  - 接続のドレイン：無効化
  - 要求のタイムアウト：20（デフォルト）
  - バックエンドパスのオーバーライド：-（空欄）
- **ホスト名**
  - 新しいホスト名でオーバーライドする：はい
  - ホスト名をオーバーライドする：バックエンドターゲットからホスト名を選択する
  - カスタムプローブを作成する：はい（事前に作成してもよい。ここで「はい」にすると任意の文字列を含むカスタムプローブが自動作成される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/34d65d4e-9718-fc13-8602-005fd43a0f2a.png)

HTTP設定が終わったらルーティング規則の追加に戻る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fec92c83-e0c7-3ece-407f-08d2c5c70fa9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a3ed91a4-d7a6-ff01-a8be-7c50dfc6b01a.png)
タグの作成は任意。確認と作成からアプリケーションゲートウェイを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fb7481b9-7065-4331-ad80-1d309f1089c3.png)

# 3.アプリケーションゲートウェイの設定変更
2.で作成したアプリケーションゲートウェイの設定を変更する。
リソースをクリックし画面左側メニューから「バックエンドプール」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/56146c1b-70f6-4321-29e0-dca29db67085.png)
「バックエンドプールの編集」画面が開く。

- ターゲットを持たないバックエンドプールを追加します：いいえ
- バックエンドのターゲット
  - ターゲットの種類：App Service
  - ターゲット：1.で作成したApp serviceを選択（今回はAppService-emiki）

保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/85726098-4931-e4fe-f3d9-b3acc4230abe.png)

「バックエンド正常性」より、アプリケーションゲートウェイのバックエンドに設定したApp Serviceが正常か確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a1490c7a-0719-db5b-c41d-7de0084756b4.png)

ここまで設定すると、アプリケーションゲートウェイのフロントエンドプライベートIPにアクセスした際、バックエンドに設定したApp Serviceにルーティングされるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a676a1d2-fa81-6ec7-dc37-cf80843fa179.png)

# 4.サービスエンドポイントの設定（App Service）
1.で作成したApp Serviceを選択し、画面左側メニューから「ネットワーク」を選択し、「アクセス制限」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/801c32e4-1957-2d40-4aaf-90a15c5d577f.png)

##規則の追加
- **全般設定**
  - 名前：任意（今回は「From-AGWSnet-Only」）
  - アクション：許可
  - 優先度：任意（今回は300）
  - 説明：任意（今回は「AGWSnet-emikiからの通信のみ許可」）
- **ソースの設定**
  - 種類：仮想ネットワーク
  - サブスクリプション：任意（自身がリソースの作成で使用しているもの）
  - 仮想ネットワーク：1.で作成したものを選択
  - サブネット：1.で作成したアプリケーションゲートウェイ用のサブネットを選択

その他はデフォルト設定のままでよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/625a4e32-eb54-31fb-e367-7255673593b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/40e413ac-e814-0ce5-e98e-2a36329f0f69.png)
アクセス制限がオンになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3f1b6b5e-8970-f1e9-4f99-29e8294268eb.png)

この設定をするとサービスエンドポイントが有効になり、指定したアプリケーションゲートウェイ用のサブネット空の通信からしかApp Serviceに接続できなくなる。インターネット経由でApp Serviceに接続できないことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/813c7db0-5c0c-adf4-c64d-2023769b036e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9969dea6-077d-7197-bd25-d81a5499a314.png)

# 5.端末からAzure仮想ネットワークにP2S接続する
手元の端末からAzure仮想ネットワークにP2S接続する。以下手順はWindows10を想定している。

## 5-1.P2S接続の流れ
- P2S接続するWindows10端末で実施する
  - ルート証明書作成（PowerShell）
  - クライアント証明書作成（PowerShell）
  - ルート証明書のエクスポート

- Azure Portalで実施する
  - エクスポートしたルート証明書を仮想ネットワークゲートウェイにアップロード

- P2S接続するWindows10端末で実施する	
  - VPNクライアントダウンロード
  - VPNクライアントインストール

##5-2.証明書作成

- 管理者権限でPowerShellを開く
  - P2S接続したい手元のWindows10端末にて、管理者権限でPowerShellを開く

- ルート証明書作成（PowerShell）
  - ```P2SRootCert_emiki```部分は任意の文字列にする

```
$cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=P2SRootCert_emiki" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/be0de884-29fe-076d-7e5e-3d88ebb26369.png)

PowerShell コンソールを開いたままにして、次の手順に進む。

- クライアント証明書を生成
  - ```P2SChildCert_emiki```部分は任意の文字列にする

```
New-SelfSignedCertificate -Type Custom -DnsName P2SChildCert_emiki -KeySpec Signature `
-Subject "CN= P2SChildCert_emiki" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fa7ee8f2-a325-fb74-f225-ba49c520934e.png)

- ルート証明書とクライアント証明書が作成されていることの確認
- Windows+Rで「ファイル名を指定して実行」を開き、「certmgr.msc」を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/362f0c48-788d-01e6-3166-0937ddea5f55.png)
[証明書-現在のユーザー]-[個人]-[証明書]に、作成した証明書が表示されていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c3e108fd-31ad-eae2-51d9-134efe06fc05.png)

ルート証明書をエクスポートする。（**クライアント証明書ではなくルート証明書をエクスポートする。仮想ネットワークゲートウェイにルート証明書をアップロードする必要があるため**）
ルート証明書を右クリックし、[すべてのタスク]-[エクスポート]からエクスポートウィザードを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8b4c0e6e-c53a-a64d-e84d-92568fb541fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7587596d-3270-7346-1847-3a647da63a94.png)
秘密鍵はエクスポートしない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b487ce31-f774-94ec-8338-678c81889732.png)
Base64でエンコードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/02909b9f-ffc0-93fd-5237-7969640abc73.png)
エクスポートする場所を指定する。わかりやすい場所と名前を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/1ea59deb-f39a-0546-54b6-52d053e770c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e30f72c6-bf17-fc51-0aea-02fa8f30fe99.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/be208fe4-28d1-45cf-45c0-a9b9033437d0.png)
指定した場所にエクスポートされているのを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c363aaf1-fddd-d880-c3ec-49e709b7fc66.png)
メモ帳などで開くと、秘密鍵が表示される。（「-----BEGIN CERTIFICATE-----」のあとから「-----END CERTIFICATE-----」の前までの文字列の部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8936c5d8-bda5-500e-74c6-6d06fc43916d.png)
別のメモ帳などを開いてコピーし、改行なしの1行の文字列にしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/df2dba1f-78d4-22cb-1ac2-4a5ae513825a.png)

## 5-3.証明書をAzure 仮想ネットワークゲートウェイにアップロードする
Azureポータルから1.で作成した仮想ネットワークゲートウェイを選択し、画面左側メニューから「ポイント対サイトの構成」をクリックし「今すぐ構成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c90fbccc-b094-25b8-9c61-c4e7974ee4e0.png)

- アドレスプール
   - アドレスプールに任意のプライベートアドレス範囲を記載する。P2S接続する際、手元の端末はここに設定したIP範囲から払い出される。
- ルート証明書
  - 名前：任意（5-2.でエクスポートしたルート証明書であることが分かる名前。今回は「P2SRootCert_emiki」）
  - 公開証明書データ：5-2.でエクスポートしたルート証明書の改行なしの文字列をここに入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2b0315a1-f548-e71d-da6b-ed46fdaaceb9.png)

## 5-4.VPNクライアントを仮想ネットワークゲートウェイのポータルからダウンロードし、P2S接続する
そのままAzureポータルからVPNクライアントをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3d08f8b0-87ff-dbd4-feeb-76bc69264e8e.png)
ダウンロードされたファイルを展開し、「WindowsAmd64」フォルダ内の「VpnClientSetupAmd64.exe」を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fae8ce00-b306-35f1-f806-6516418c7279.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4461cbfd-2412-335e-b731-6cfa601a8ef2.png)
「WindowsによってPCが保護されました」という青い画面が出たら、「詳細情報」をクリックして展開し、「実行」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/94650faf-9828-1ee8-246a-ffc740304206.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/efd3fe5e-84ab-7a1b-68f0-1887481828ac.png)
「Do you wish to install a Vpn Client for (作成した仮想ネットワークの名前)?」と表示されたら「はい」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/589a70cb-f59d-4f34-c967-0e5f0c10b5ce.png)
Windowsの[設定]-[ネットワークとインターネット]-[VPN]をクリックすると、作成したP2S接続（VPN）が表示されている。「接続」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/af045b4f-a998-8f29-74b2-d5e971bf1a1c.png)
「接続」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/84e19585-1c13-bb0d-dd4c-01b79369abcd.png)
「接続済み」と表示され、仮想ネットワークゲートウェイと端末でP2S接続された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2f93cffb-6cc9-40c1-a416-2c12fc6fbf7f.png)

P2S接続された状態の端末から、アプリケーションゲートウェイのフロントエンドIPアドレスにアクセスすると、ルーティングされてApp Serviceにアクセスできるようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b6442904-5053-6683-d560-be91e4291b8e.png)

以下図のように接続ができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0381ebc7-e2a7-8bb5-de1c-8d2f913f1132.png)

# 6.参考
https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#add-the-vpn-client-address-pool

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#vpn-client-configuration-package

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-vpn-client-configuration-azure-cert

https://docs.microsoft.com/ja-jp/azure/application-gateway/configure-web-app-portal