AWS Client VPNとAzure P2S 機能比較 03~Azure P2S構築編~

# AWS Client VPNとAzure P2Sを比較してみた
アドベントカレンダー1日目です。
このシリーズ3番目の記事が本記事です。
[このシリーズの最初の記事](https://qiita.com/hidekko/items/5dc7de8f3cde645959b2)
[このシリーズの2番目の記事](https://qiita.com/hidekko/items/c7e65dbd5985ec260c9f)
[以前の記事](https://qiita.com/hidekko/items/c7e65dbd5985ec260c9f)を書いてからかなり日が空いてしまいました。
入院してました。
まだ体調は万全ではないですが、この季節が来たのでリハビリがてら記事を書いてみようと思います。

AWS Client VPNは**フルトンネル**(フルトンネリング)という構成でしたが、Azureは**スプリットトンネル**という形式です。
このフルトンネルとスプリットトンネルの違いはいつか記事にしようと思います。
まずは仮想ネットワークゲートウェイ(Virtual Network Gateway)の構築です。
前提条件として
1. リソースグループは作成済み
2. 仮想ネットワークは作成済み
3. 仮想ゲートウェイ用のサブネット、「GatewaySubnet」は作成済み
4. 通信確認用のVMは作成済み

とします。

## Azure P2S VPNの構成図
簡単ですがこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3aa23835-d3fe-e818-3d50-48bf1e9754f0.png)
まぁAzureもAWSもインターネット上にあるんですが、ちょっと概念的にわかりにくいですかね・・・

こちらはスプリットトンネルなのでP2S経由でアクセスできるのはAzureの仮想ネットワークのみとなり、インターネットは普通にクライアントから直接出ていきます。
こっちの方がわかりやすいですかね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/161abe86-c306-9c80-84aa-ffeb24f4c280.png)

もうちょっと具体的に言うと、AzureのVirtual Networkのサブネット宛の通信のみがVirtual Network Gatewayにルーティングされます。

ポイントは1つ、
1. 証明書設定

これだけです。
エンタープライズ証明書と自己署名証明書と2種類ありますが、今回は検証なので自己署名証明書(いわゆるオレオレ証明書)で設定を行います。

では早速構築していきましょう。

## 1. Virtual Network Gatewayの構築

Virtual Network Gatewayの構築はPowerShellでも可能ですが、今回はAzure Portal上からGUIで行います。

### 1-1. Azure Portalから仮想ネットワークゲートウェイを作成
Azure Portalのホームから[リソースの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1190608e-98e4-932a-a45f-a1216fa323ed.png)

[＋作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/20f17c65-c44f-ce89-9200-0df441711995.png)

各種パラメーターを入力します。
[サブスクリプション]、[リソースグループ]は既に構築済みのものを選択します。
[名前]は適当に入力しましょう。
[地域]がはリージョンですね。なので5つ下の項目にある[仮想ネットワーク]と同じリージョンにしましょう。
仮想ネットワークと仮想ネットワークゲートウェイとは同じリージョンに作成しなければならないAzureの仕様です。
これはAWSも同じですね。
[**ゲートウェイの種類**]は[**VPN**]を選択します。
[**VPNの種類**]は[**ルートベース**]を選択します。
[**SKU**]は何でもいいのですが、今回は一番安価な[**Basic**]を選択します。
[**SKU**]を選択すると[**世代**]も[**Generation1**]か[**Generation2**]かが自動で選択されます。
[**パブリックIPアドレスの種類**]は**Basic**と**Standard**がありますが、2025年にBasicが無くなるそうなので**Standard**にしておきましょう。
Standardの方が330円くらい、Basicは300円くらいなので1割ほど高いのですが、パブリックIPアドレスをBasicからStandardにするのに仮想ネットワークゲートウェイの再作成が必要なので、無用な停止を避けたいのが人情だと思うので、**Standard**にしておきましょう。
[**パブリックIPアドレス**]を[**新規作成**]にしましょう。
もし既にあれば[既存のものを仕様]を選択します。
[**パブリックIPアドレス名**]も分かりやすい命名にしましょう。
[**アクティブ/アクティブ モードの有効化**]は[**無効**]にします。
[**BGPの構成**]も今回は[**無効**]にしましょう。
この最後の2項目、[**アクティブ/アクティブ モードの有効化**]と[**BGPの構成**]はとても面白いので別で記事を書こうかと思います。
最後にパラメーターを確認し、[**確認及び作成**]をクリックします。
[次:タグ>]は必要があれば設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/579c1430-48e4-85b7-ec30-341dbe0264d2.png)

ここからAWSとAzureの違いですが、AWSは1～2分程度でこのゲートウェイの構築が完了するのですが、Azureは35分から45分程度かかります・・・
<font color="Red">**この構築時間はAWSに軍配が上がります。**</font>
<font color="Red">**しかし必要なリソース構築は全てこの1つで完了しますので、全体的な構築の難易度が低い=簡単である、という観点からはAzureに軍配が上がります。**</font>

### 1-2. ルート証明書とクライアント証明書を作成する
仮想ネットワークゲートウェイ作成待ちの間にサーバ証明書とクライアント証明書を作成しましょう。
これはポイントの作業の1つですが、PowerShellを2つ、管理者権限で実行するだけでOKです。

```
#RootCert20221127
$RootCommonName01="RootCert20221127"
$cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature -Subject "CN=$RootCommonName01" -KeyExportPolicy Exportable -HashAlgorithm sha256 -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign -NotAfter (Get-Date).AddYears(100)

#ChildCert20221127
$ChildCommonName01="ChildCert20221127"
New-SelfSignedCertificate -Type Custom -DnsName "$ChildCommonName01" -KeySpec Signature -Subject "CN=$ChildCommonName01" -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") -NotAfter (Get-Date).AddYears(100)
```

ルート証明書からクライアント証明書を作成しているので、以下のように同じPowerShellの画面で実行しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/6bd9b240-ad5a-9b5e-a399-4771b5b830f4.png)

### 1-3. クライアント証明書をエクスポートする
ここで作成した証明書はルート証明書もクライアント証明書も以下のように<font color="Red">**certmgr.msc**</font>で呼び出せる[**証明書 - 現在のユーザー**]内にある[**個人**]の中の[**証明書**]にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/fb832c8a-a40a-bc1d-849f-31c890e6e715.png)

証明書を作成したPC以外で利用することも想定し、クライアント証明書はcertmgr.mscから右クリックで秘密鍵を内包する形式、pfx形式でエクスポートしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/20039464-5254-585b-d909-c94595ac67fc.png)
以下の画面で[次へ]をクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0dce047e-a756-eec7-29b2-d2f5fde605d5.png)
以下の画面で[はい、秘密キーをエクスポートします]を選択して[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/2e371f5a-99dd-560b-3c0a-32483b9a2edc.png)
<font color="Red">赤枠</font>部分はデフォルトで選択されていますが、<font color="Blue">青枠</font>部分は選択されていないので、追加で選択してください。
そして[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/a8dc6340-877e-5920-b8f3-c3b52f7164de.png)
[**パスワード**]にチェック入れ、パスワードを2回入力します。
[**暗号化**]は**TripleDES-SHA1**を選択します。
TripleDES-SHA1、つまり3DES-SHA1という事なので、ハッシュ衝突を回避するためにAES256-SHA256を選択したいところなのですが、AES256-SHA256を選択すると他のWindows PCでエクスポートした証明書をインポートできなくなります。

出力先を選択しファイル名を入力し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/8ce8bfe6-74cf-a95a-742c-e52f3da7eb61.png)

[完了]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/a031458d-8bee-ed16-39a8-a6b3d4d2f9d4.png)

[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4d7bd0a3-02c3-f6e9-8a3c-68180aa74be4.png)
これでクライアント証明書のエクスポート作業はおしまいです。
このクライアント証明書をP2Sで接続するWindows PCに移動させインポートします。

### 1-4. ルート証明書をエクスポートする
ルート証明書は秘密鍵を内包しない形式、cer形式で、かつBase 64形式でエクスポートしましょう。
クライアント証明書と同じくcertmgr.mscから対象のルート証明書を右クリックし、[すべてのタスク]から[エクスポート]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1a59f3b8-0fa3-9843-7817-5fe853d31216.png)
[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/19cfbb94-5490-d67d-bc13-03654b7dd8d1.png)
[いいえ、秘密鍵をエクスポートしません]を」選択し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/ba3e4e74-7270-f6c8-4dc9-0d04de3b0306.png)
[Base 64 encoded X.509(.CER)]を選択し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9bdfd585-399e-83cb-c5f1-24a055e5e656.png)
ルート証明書の出力先ディレクトリとファイル名を入力し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/c87b2dfc-51ae-e0cb-428d-fc1901ac44e2.png)
ルート証明書のエクスポート内容を確認し[完了]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/58d5e0e6-d22a-546e-6e11-6878ee76e497.png)
[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/2e940fe2-c34a-0dcb-83f2-5245b337476d.png)

このエクスポートしたルート証明書は次項の設定で利用しますので、大切に保管します。

### 1-3. 仮想ネットワークゲートウェイでP2S設定を行う
**1-1. Azure Portalから仮想ネットワークゲートウェイを作成**で作成した仮想ゲートウェイで[ポイント対サイトの構成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/dab52b1d-b0b2-74a0-fe0e-4f91dfa94566.png)
[今すぐ構成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/8c271696-d2f8-3fcd-51d9-20d5f9d6e055.png)
画面が切り替わるので[アドレス プール]にこの仮想ネットワークゲートウェイの存在する仮想ネットワークのサブネットや、オンプレミスのサブネットと重複しないアドレスプールを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/aad245d8-35d0-17b9-e33e-c5021fa2e90b.png)

ルート証明書の[名前]ですが分かりやすく証明書の名前にしておきましょう。
**公開証明書データ**ですが、**1-4. ルート証明書をエクスポートする**でエクスポートしたファイルをメモ帳で開いて加工する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/423a037a-a11c-c155-d6f5-0b22d15f2b86.png)
各行の最後の<font color="Red">赤枠</font>部分に改行コードがあるので、これをすべて削除してこのファイルを1行にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/c817c139-e731-b94f-b027-3bcc39ce38aa.png)
改行を全て削除すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/b322b3e1-1244-bdd1-b1f9-7ee9278e8de6.png)

この1行にした乱数を先ほどの**公開証明書データ**にコピーします。
これで[保存]がクリックできるようになるので、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/5aad203d-db6b-1dd3-ca99-aae9fe6b2bc1.png)

これで仮想ネットワークゲートウェイ側の作業は完了です。

<font color="Red">**AWSに比べて簡単！
Azure、はじまってますね！**</font>

本日はここまで。