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

:::note info
2024/11/15
記事を作成した当時からCloudShellとAWS Client VPNがバージョンアップしていますので、修正しました。
:::

# AWS Client VPNとAzure P2Sを比較してみた
AWS Client VPNでオンプレミスのPCをAWSのVPCに接続し、その際インターネットに出るIPアドレスをAWSの固定IPアドレスにする、という構成です。
ネットワークの用語でいうと**フルトンネル**(フルトンネリング)という構成です。
NAT GatewayにElastic IPアドレスを設定し、AWS Client VPNでインターネットに出る際、IPアドレスをElastic IPアドレスに固定する(固定IPアドレスにする)というシナリオです。
まずはAWS Client VPNの構築です。

## AWS Client VPNの構成図
普段AzureのP2Sを構築していて当然構成図も書いたことがあるのですが、AWSの構成図は初めて書きます。
お作法も分からないので間違っていればご指摘ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0e493807-629b-0c90-3c66-74ffeeb04ef7.png)
このような構成図になります。
AWS Client VPNそのものは簡単に構築可能ですが、ポイントが2つあり、
1. 証明書設定
1. ルートテーブル設定

です。
それぞれ作業の順序に沿い、手順を記載していきます。

## 1. AWS CloudShell、証明局構築、サーバ証明書作成、クライアント証明書作成、サーバ証明書登録

AWS Client VPNは証明書認証とAD認証の両方がありますが今回は簡単に証明書認証を使います。
当然証明書の作成、登録が必要なのですが、これもAWS CLIのWeb版であるAWS CloudShellで簡単に終わらせてしまいます。

### 1-1. AWS CLI CloudShell
AWSコンソールの右上にある赤枠の部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/a94a6a07-6c87-43b1-52fb-80f9bc0c6241.png)

始めて開始する場合は以下のように環境構築と出てきますが、しばらくすると起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/429c3fd0-1d3c-57dd-a4bc-5a1f9c274a9a.png)

正常に起動するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0b2975ac-5308-9aaa-539a-f5ffe18c7d32.png)

### 1-2. 認証局構築
~~以下のコマンドを丸々コピペでうまくいきます。~~
1行ずつコピーしてください。

```
git clone https://github.com/OpenVPN/easy-rsa.git
```

```
cd easy-rsa/easyrsa3
```

```
./easyrsa init-pki
```

念のため順に意味を説明すると

:::note info
1行目は不要だったので削除しました。
1行目はopensslのインストールだったのですがCloudShellがバージョンアップしたようで、opensslはインストール済みのようです。
:::

1行目削除

2行目
```
git clone https://github.com/OpenVPN/easy-rsa.git
```
GitからOpenVPNの環境を引っ張ってきます。
Gitのインストールしなくても動作することからAWS CloudShellにはGitは元々インストールされているんですね。
うまくいくと以下のようになります。
```
[cloudshell-user@ip-10-130-50-144 ~]$ git clone https://github.com/OpenVPN/easy-rsa.git
Cloning into 'easy-rsa'...
remote: Enumerating objects: 7746, done.
remote: Counting objects: 100% (2522/2522), done.
remote: Compressing objects: 100% (1152/1152), done.
remote: Total 7746 (delta 1402), reused 2075 (delta 1334), pack-reused 5224 (from 1)
Receiving objects: 100% (7746/7746), 52.71 MiB | 23.06 MiB/s, done.
Resolving deltas: 100% (3651/3651), done.
[cloudshell-user@ip-10-130-50-144 ~]$
```

3行目
```
cd easy-rsa/easyrsa3
```
2行目のコマンドでGitから引っ張ってきたディレクトリに移動し、4行目
```
./easyrsa init-pki
```
PKI(公開鍵基盤)を初期化します。
PKIとは
**<font color="Red">P</font>ublic** **<font color="Red">K</font>ey** **<font color="Red">I</font>nfrastructure**
の略です。
ここのコマンドまで一気にコピペで動作します。
うまくいくと以下のようになります。
```
[cloudshell-user@ip-10-0-17-146 easyrsa3]$ ./easyrsa init-pki

Notice
------
'init-pki' complete; you may now create a CA or requests.

Your newly created PKI dir is:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki

* IMPORTANT: Easy-RSA 'vars' file has now been moved to your PKI above.

[cloudshell-user@ip-10-0-17-146 easyrsa3]$ 
```

### 1-3. 認証局構築
次からは1行ずつ実行してください。
次は以下のコマンドを実行します。
```
./easyrsa build-ca nopass
```

このコマンドはパスワード無しで利用可能なCA(認証局)を構築します。
CAとは
**<font color="Red">C</font>ertificate** **<font color="Red">A</font>uthorities**
の略です。
このコマンドを実行した時点でこの環境が認証局となります。
このコマンドを実行すると以下のようになります。

```
[cloudshell-user@ip-10-130-50-144 easyrsa3]$ ./easyrsa build-ca nopass
........+.+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+...+...+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.....+.........+................+.....+...+.+.....+.+........+..........+..............+...+.........+......+............+..........+.....+.+.....+.+.....+....+..+....+........+...+.............+.....+.....................+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
......+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.......+..+....+..+............+...+.......+......+......+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+.............+..+.+..+...+.........+.+.....+.........+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:testCA

Notice
------
CA creation complete. Your new CA certificate is at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/ca.crt

Create an OpenVPN TLS-AUTH|TLS-CRYPT-V1 key now: See 'help gen-tls'

Build-ca completed successfully.

[cloudshell-user@ip-10-130-50-144 easyrsa3]$ 
```

途中で「CAの名前を付けて」と聞いてくるので、適当に付けてください。
この例ではtestCAにしています。
最後の行でCA証明書を作成していますね。

### 1-4. サーバ証明書作成
次に以下のコマンドを実行します。
```
./easyrsa build-server-full server.example.com nopass
```
このコマンドはパスワード無しでアクセスできるサーバ証明書を作成します。
このコマンドだとサーバ証明書の名前はaws_client_vpnという名前になりますので、お好きな名前にしてください。
このコマンドの実行結果は以下の通りになります。
```
[cloudshell-user@ip-10-130-50-144 easyrsa3]$ ./easyrsa build-server-full server.example.com nopass
...........+......+.....+..........+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+............+......+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+..+...+...+....+..+.+..+......+.+.........+.....+...............+....+..+.............+..+...............+..........+...+...+...+..+.........+...+.......+.....+....+..+.......+..+.+..+......+..........+..+...+.........+.......+...+............+........+..........+...........+............+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.....+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+..+....+......+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+.+...+......+......+..................+..........................+......+....+........+...+..................+............+....+......+..+......+....+..+.+...+............+..+...+............+......+.+...........+...+.+......+..+................+......+.....+...+...+...+....+........+...............+.......+.....+.+..+..................+.+...+..+.........+.+.....+......+.......+.................+......+............+............+...+...+...+....+.....+.......+......+..+.+......+......+..+..........+...+..+...+....+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----

Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/server.example.com.req
* key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/server.example.com.key

You are about to sign the following certificate:

  Requested CN:     'server.example.com'
  Requested type:   'server'
  Valid for:        '825' days


subject=
    commonName                = server.example.com

Type the word 'yes' to continue, or any other input to abort.
  Confirm requested details: yes

Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/cb772fa3/temp.6.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server.example.com'
Certificate is to be certified until Feb 18 01:53:48 2027 GMT (825 days)

Write out database with 1 new entries
Data Base Updated
/usr/bin/which: no bc in (/home/cloudshell-user/.local/bin:/home/cloudshell-user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/node_modules/aws-cdk/bin:/home/cloudshell-user/.local/bin)

Notice
------
Inline file created:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/inline/private/server.example.com.inline


Notice
------
Certificate created at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/server.example.com.crt
```

途中
```Type the word 'yes' to continue, or any other input to abort.```
```  Confirm requested details:```
と聞いてくるので
```
yes
```
と入力してください。
Yes以外だと強制終了されて証明書作成されません。

### 1-5. クライアント証明書作成
以下のコマンドを実行します。
```
./easyrsa build-client-full user01.example.tld nopass
```
このコマンドはパスワード無しでアクセスできるクライアント証明書を作成します。
このコマンドだとクライアント証明書の名前はuser01という名前になりますので、お好きな名前にしてください。
このコマンドの実行結果は以下の通りになります。
```
[cloudshell-user@ip-10-130-50-144 easyrsa3]$ ./easyrsa build-client-full user01.example.tld nopass
........+.+...+..+.......+...+.....+...+......+.+...+.....+....+......+......+...+..+...+...+...+.......+.........+......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.+..+.......+..+.+........+.......+..+..........+..+......+...+......+......+...+.......+............+..+...+.............+...+......+.....+.+...+......+......+............+..+...+...+...+.......+........+.........+.......+.........+......+...+...+.....+...+.+......+...+.....+..........+..............+......+......+.+.....+...+......+.+..+.+..+......................+......+......+.....+.........+......+.+.....+...+....+.....+.............+...+............+.....+.........+...+.+...............+......+...+...+..............+....+......+...+...............+..+.........+......+.+..+.+..+....+........+..........+.....+.............+...+......+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.+......+..+......+....+........+...+.......+...+.....+....+...+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+..+......+....+......+..+.........+.+..............+...+...............+.+..+....+........+............+...+.+.....+.+...+..+...+...+....+...........+............+...+....+...............+..............+....+......+.....+.+.....+.+..+.+..+.......+..+.+..+.......+.....+.+........+................+...+...........+....+......+.....+.........+......+.+..................+...+........+.+...+...+...+..+.........+......+.......+.....+..........+......+.....+.+.....+....+.....+......+.+...+..+.......+..+.+........+.+..............+.........+.+..+............+......+.......+..+.+...........+................+...+.....+.+...+...+.....+...+.......+............+..+...+.+......+...........+....+...+....................+......+.+.....+.+..+.+.....+....+.....+...+.......+........+.......+............+.........+..+....+...+........+.......+...+..............+......+...+......+..........+.....+.............+.....+............+....+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----

Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/user01.example.tld.req
* key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/user01.example.tld.key

You are about to sign the following certificate:

  Requested CN:     'user01.example.tld'
  Requested type:   'client'
  Valid for:        '825' days


subject=
    commonName                = user01.example.tld

Type the word 'yes' to continue, or any other input to abort.
  Confirm requested details: yes

Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/21efc0c7/temp.6.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'user01.example.tld'
Certificate is to be certified until Feb 18 02:00:17 2027 GMT (825 days)

Write out database with 1 new entries
Data Base Updated
/usr/bin/which: no bc in (/home/cloudshell-user/.local/bin:/home/cloudshell-user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/node_modules/aws-cdk/bin:/home/cloudshell-user/.local/bin)

Notice
------
Inline file created:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/inline/private/user01.example.tld.inline


Notice
------
Certificate created at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/user01.example.tld.crt
```

認証局の説明は改めて記事を書こうかなと思います。

このCAで作成されたサーバ証明書、クライアント証明書はセットになりますので今後この環境を移行する際はご注意ください。

### 1-6. サーバ証明書登録
ここまでで作成したCA証明書ファイル、サーバ証明書ファイルとサーバキーファイル、クライアント証明書とクライアントキーファイルを別のフォルダにコピーします。
移動するフォルダの名前は任意の名前で結構です。

```
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/*.crt ~/custom_folder/
cp pki/private/*.key ~/custom_folder/
cd ~/custom_folder/
```

ここまで一気にコピペして動作します。
エラー無く各ファイルがコピーできればここまでの作業はうまくいっています。
コピーするファイルが見つからなくてエラーになっている場合は該当箇所の作業を見直しましょう。

最後に以下のコマンドを実行します。
```
aws acm import-certificate --certificate fileb://server.example.com.crt --private-key fileb://server.example.com.key --certificate-chain fileb://ca.crt
```
このコマンドがうまくいくと以下のようなメッセージができます。
```
[cloudshell-user@ip-10-130-50-144 custom_folder]$ aws acm import-certificate --certificate fileb://server.example.com.crt --private-key fileb://server.example.com.key --certificate-chain fileb://ca.crt
{
    "CertificateArn": "arn:aws:acm:ap-northeast-1:666344745206:certificate/f49bf0d6-a95c-43e3-87fa-cfeb1c8fd2f0"
}
```

これでAWS Certificate Manager(**ACM**)に**f49bf0d6-a95c-43e3-87fa-cfeb1c8fd2f0**という名前でサーバ証明書が登録されます。

## 2. クライアント証明書のダウンロード
AWS CloudShellの右上のある**Action**をクリックして、FilesのDownloadをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/94f4d33f-49a7-92d1-1e26-d2d8cd59b180.png)
以下のような画面が出てくるのでクライアント証明書とクライアントキーのパスを入力してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0e349296-ad79-75ad-601c-f651ae43c6c0.png)

ここでダウンロードしたクライアント証明書とクライアントキーはAWS Client VPNを接続する際に必要になってきますので大事に保管しましょう。
またこれらのファイルが漏えいすると誰でもAWS Client VPNに接続できてしまうようになりますので、厳重に保管しましょう。

## 3. 各種リソース作成
最終構成が上述の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/219778d5-39d4-a6ce-4cdc-b3e4fbf867a5.png)
この構成であり、かつ既存VPCが以下のような簡単な構成で既に存在している、既存VPCのネットワークアドレスを使い切っている場合は既存VPCにネットワークアドレスを追加してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0348a640-2248-1491-8b09-8888e0fc756b.png)

### 3-1. VPCにネットワークアドレスを追加する
ここのサブネットは今回の構成ではInternet Gatewayを作成しないプライベートサブネットとなります。
次の構成図内の赤枠を部分を作成します。
このプライベートサブネットには赤枠内にあるAWS VPN Clientが接続しに来るため(AWS VPN Clientの接続の受け口である)のVPN Gatewayのリソースとルートテーブルが存在します。
詳細はそれぞれのリソースの作成項目で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4e1fdaef-40d5-23fe-c297-d773ae1259a1.png)
既存VPCの設定画面にアクセスし**アクション**の**CIDRの編集**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/f053e7f9-14b0-c239-a638-f8bed6d845d6.png)
**新しい IPv4 CIDR を追加**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/326065a1-fbff-732c-4dfc-a088b439698f.png)

### 3-2. サブネットを追加する
AWSコンソール内のVPCから、**サブネット**を選択し、**サブネットを作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e2ca79fb-6869-6360-a6f7-6b53653c4522.png)
VPC内にあるIPアドレス帯の中から余っているIPアドレス帯を選んでサブネットを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/ac20a388-cadf-5ff3-0ca0-009aab0db5f1.png)
これでプライベートサブネットの作成は完了です。

### 3-3. NAT Gatewayの作成
続いてNAT Gatewayの設定です。
AWS VPN Clientをフルルートで構成し、AWS VPN Client接続後にインターネット接続する際のグローバルIPアドレスを固定IPアドレスにする際の1つ目のポイントになる設定でもあります。
構成図内ですと以下の赤枠内のリソースです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/56fd53ae-be2d-1a87-b2d7-b528fed4ad5c.png)
VPCの設定画面内の左ペイン内にある**NAT Gateway**を選択し、画面右上にある**NAT Gatewayの作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9f61f06e-ea9e-5740-2e65-b37a2bd8b186.png)
NAT Gatewayの名前は適当で構いません。
上述の構成図の通りサブネットはDefault RouteがInternet Gatewayを向いている**Public Subnet**とします。
インターネットへ接続できるように、接続タイプは**パブリック**とし、グローバルIPアドレスを固定にするための**Elastic IPを割り当て**をクリックします。
<font color="Red">ここで**Elastic IPを割り当て**を選択しないと、フルルート設定のAWS VPN Clientに接続してインターネットに接続した場合、グローバルIPアドレスが固定IPアドレスになりません。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/b203c3af-95c3-f756-8a1f-f33eb6713d60.png)
ここまで入力し、最後に**NATゲートウェイを作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3c9df768-9e74-a152-02a6-f011d64b8b3e.png)

### 3-4. ルートテーブルの作成
続いてルートテーブルの作成です。
パブリックサブネットはDefault RouteがInternet Gateway、プライベートサブネットはDefault RouteがNAT Gatewayとなりこのルートテーブルの作成が2つ目のポイントになります。
構成図でいうと以下の赤枠内のリソースです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/f4fb9ea6-2017-6c93-9e33-43f8f77e1960.png)
既存VPCの設定画面内の**ルートテーブル**の項目をクリックし、画面右上の**ルートテーブルの作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/ff1f5fce-d024-6fa9-8e3b-d9109b60e7bb.png)
ルートテーブル名は適当で良いと思うのですが、今後管理がしやすいようにどのサブネットに関連付いているかがわかりやすいようにサブネット名をルートテーブル名に加えておくと良いかもしれません。
VPCは既存VPCを選択し、最後に**ルートテーブルの作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/18ed19c4-78dc-728b-d495-f70d50efa91c.png)

### 3-5. ルートテーブルの設定
作成されたルートテーブルを選択し、設定タブ内の**ルート**を選択しDefaultの設定を確認し、その右隣にある**ルートを編集**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1274bc95-7c98-32be-ef41-7541089718f9.png)
**ルートを編集**内の**ルートを追加**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7e77b41c-789f-3b04-1d74-b1a7652d28ac.png)
**送信先**に<font color="Red">**0.0.0.0/0**(Default Route)</font>と入力し、**ターゲット**に<font color="Red">**NATゲートウェイ**</font>を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7809baf7-1620-2e35-f939-c214ef29259d.png)
**ターゲット**に<font color="Red">**NATゲートウェイ**</font>を選択すると、前の手順[3-3. NAT Gatewayの作成](https://qiita.com/drafts/5dc7de8f3cde645959b2/edit#3-3-nat-gateway%E3%81%AE%E4%BD%9C%E6%88%90)で作成したNAT Gatewayを自動で選択してくれます。
NATゲートウェイを選択したら最後に**変更を保存**をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/ed14b1f9-2ded-ea72-f4f9-d7af7b91329b.png)
これでこのルートテーブルのDefault GatewayがNAT Gatewayに向きましたので、このルートテーブルをプライベートサブネットに関連付けます。
ルート追加が終わったルートテーブルを開き、**サブネットの関連付け**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e34e6a63-b0b6-4622-74f0-ed9e0494f340.png)
プライベートサブネットを選択し、**関連付けを保存**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/6cb431b0-6011-2fd7-7d76-6f0d8fb09c63.png)

### 3-6. VPN Gatewayの作成
最後のリソース作成手順です。
構成図でいうと以下の図の赤枠部分、プライベートサブネット内にあるそのものズバリ、**VPN Gateway**になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/aea17f48-b756-e2c2-370d-af8c70e0bb7f.png)
VPC設定画面を開き、左ペイン内の**クライアント VPN エンドポイント**をクリックします。
2022年7月3日時点ではまだ<font color="Red">New</font>の文字がありますね。
新しいサービスです。
画面が開いたら**クライアント VPN エンドポイントを作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/6dcb88ea-d5ff-1762-7958-c1047231e386.png)
まずは赤枠内の設定から行います。
名前は適当で良いです。
**クライアント IPv4 CIDR**ですが、<font color="Red">**オンプレミスで利用していないセグメント、かつVPCで利用していないセグメントを最大/16から最小/22の間で設定してください。**</font>
最小で/22というと1024個のIPアドレスが使えるので、かなり広いレンジです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/b66223e6-0b7b-5579-c590-691dc77901e9.png)
続いて後続の肝心の挙動に関する設定、特に認証情報部分ですが、ここのサーバ証明書とクライアント証明書で最初の手順、[1. AWS CloudShell、証明局構築、サーバ証明書作成、クライアント証明書作成、サーバ証明書登録](https://qiita.com/drafts/5dc7de8f3cde645959b2/edit#1-aws-cloudshell%E8%A8%BC%E6%98%8E%E5%B1%80%E6%A7%8B%E7%AF%89%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E4%BD%9C%E6%88%90%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%A8%BC%E6%98%8E%E6%9B%B8%E4%BD%9C%E6%88%90%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E7%99%BB%E9%8C%B2)で作成し、<font color="Red">**ACMに登録した証明書**</font>を指定します。
また認証オプションは**相互認証を使用**にチェックを入れます。
この設定でVPN GatewayとACMに登録したサーバ証明書、クライアント証明書が関連付き、認証ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/8a5ce6a1-ec5b-3d3a-461c-f46c610f9e30.png)

これ以降の設定はオプション設定となりますが、設定しておいた方が接続時や接続不良時のトラブルシュートがしやすくなります。
環境によって設定値が変わってきますので、DNSサーバやトランスポートプロトコルは適宜環境に合わせて変更してください。
**DNSサーバ**はAWS VPN Client接続時にクライアントPCに割り振られるDNSサーバのIPアドレスになります。
私はAWSのVPC内で名前解決を行う必要もないのでGoogleのパブリックDNSを入れていますが、接続先のVPC内で独自の名前解決を行う際は必要なDNSサーバのIPアドレスを入力してください。
**トランスポート プロトコル**はデフォルト設定だとUDPとなっておりますが、これを私はTCPに変更しています。
**スプリットトンネル**ですが、これが[冒頭](https://qiita.com/drafts/5dc7de8f3cde645959b2/edit#aws-client-vpn%E3%81%A8azure-p2s%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)の説明フルルートかそうでない(スプリットトンネル)かを変更するパラメータになります。
今回はAWS Clinet VPN接続時にクライアントPCのデフォルトゲートウェイをAWSに向ける、つまりフルルートなのでこの**スプリットトンネルの設定値はOff**になります。
**VPC ID**はVPN GatewayのあるVPC、**セキュリティグループ**に関しては何も設定していないDefaultのセキュリティグループを選択しました。
接続元IPアドレスを絞りたい場合は別でセキュリティグループを作成して適宜設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/372247f8-d27e-f063-7b2b-504c37eab7fa.png)
**VPN ポート**はトランスポートプロトコルをTCPにしてあるので443にしました。
TCPでも1194で接続できるんですかね？
不勉強でわかりませんが、一般的な企業ネットワーク内からの接続を考えた場合は443の方が無難なので443にしました。
逆に443だと誰でも企業内から接続できてしまうのでそうなると都合が悪い場合は1194にした方が良いかもしれません。
そしてクライアントPCからAWS Client VPNの接続に成功したかしていないかを判断しやすくするために、私は**クライアントログインバナーを有効化**の設定を有効にし、ログインバナーに**Welcome AWS Client VPN !**と入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/8a69d2b9-0bb1-b4e4-8697-4052242616e5.png)
そして最後に**クライアントVPNエンドポイントを作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/c5c37fd2-4278-bee9-2958-cc56abd3e7b0.png)
長かったですね。
しかしまだ完了じゃないです。
作成ボタンをクリックするとクライアント VPN エンドポイントの最初の画面に戻りますが、ここから更に設定を行います。
状態がしばらく赤枠のように**Pending**になっていますが気にせず進めます。
一部ここからの追加設定が終わらないと状態がPendingから進みません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/89b57188-4190-a6c4-3c1d-9a8b0a814e0d.png)

### 3-7. クライアント VPN エンドポイントのターゲットネットワーク関連付け設定
**ターゲットネットワークの関連付け**のタブを選択し、**ターゲットネットワークを関連付ける**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/59e10976-6fdd-faa9-7085-58c6bcfa44ed.png)
**VPC**と**関連付けるサブネットを選択**を設定します。
でもこの設定ってVPC IDとかをクライアント VPN エンドポイントの作成時に設定しているので、そこで一括でできないんですかね？
VPCの選択はVPC IDでやってるはずなんですけど、なんでなんでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/28f17ee4-3a16-6594-5da8-46ceea0e92ab.png)
まぁ重複する設定を何度も入力するのは面倒ですが、まぁ良いでしょう。
必須パラメータなので仕方ないです。
構成図と見比べて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7a5c63e7-d00d-16e9-90c0-a024cafdcb0a.png)
このクライアント VPN エンドポイントは構成図でいうとVPN Gatewayなのでプライベートサブネットですね。
この構成図に合わせて設定を行うと以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7684acb3-837d-fdca-d140-a93d9f882076.png)
**ターゲットネットワークを関連付ける**をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4e930766-a6ae-e413-9bdf-fe4bb37dea96.png)
設定後に念のため確認しておきましょう。

### 3-8. クライアント VPN エンドポイントの承認ルール設定
はい、まだ設定は続きます。
承認ルール設定です。
これはこの<font color="Red">**AWS Clinet VPN接続後、VPC内のどのネットワークに接続して良いかを制御する設定です。**</font>
**承認ルール**のタブをクリックし、**認証ルールを追加**をクリックします。(表現は統一してほしいですね。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/c24747b6-2503-ec75-75bd-4a87efbf9b85.png)
<font color="Red">**AWS Clinet VPN接続後、VPC内のどのネットワークに接続して良いかを制御する設定**</font>なので、VPC内のIPアドレス帯はもちろん、今回はフルルートでこのAWS Clinet VPN経由でインターネットに接続するので、**0.0.0.0/0**も対象になります。
まずはインターネットから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e00239ce-b2b8-c10c-5ece-0328f7191a32.png)
続いてVPC内のネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/6e91ebe8-ea47-1c20-c92a-84f81d845e48.png)
こうしてAWS Clinet VPN経由で接続させたいネットワークへの許可を行います。
**アクセス権をすべてのユーザーに許可する**は今回はどのネットワーク宛も許可します。
これはADで認証を行っている場合はかなり強力な設定で、ユーザごとにアクセス先を制御できます。
今回は証明書認証なのですべてのユーザに許可、で良いかと思います。

### 3-9. クライアント VPN エンドポイントのルートテーブル設定
はい。
まだまだ設定は続きます。
項目多いな。
**ルートテーブル**タグを選択し、**ルートを作成**をクリックします。
ご覧の通りVPC内のネットワークは何も設定しなくてもルートは切られています。
つまり[前項](https://qiita.com/drafts/5dc7de8f3cde645959b2/edit#3-8-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88-vpn-%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E6%89%BF%E8%AA%8D%E3%83%AB%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A)の設定と併せて考えると、<font color="Red">**AWS Clinet VPNからVPCへはルートはデフォルトで暗黙的に切られている(経路は設定されている)が、接続を許可するか否かは承認タブの設定次第**</font>ということが言えると思います。
細かな制御ができるということで小回りの利く設定ができるということですが、どうしても設定項目が多くなる、ということで表裏一体なのかもしれません。
それにしても設定項目が多くて面倒だ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7db7fbf8-d727-8113-8719-2cc5b5848a7a.png)
VPC内のルートは既に切られているので、インターネット向けの**0.0.0.0/0を設定追加**し、**ターゲットネットワークの関連付けのサブネットID**は**このクライアント VPN エンドポイントの存在するプライベートサブネットのID**を選択します。
最後に**ルートを作成**をクリックします。

### 3-10. AWS Clinet VPN接続後のグローバルIPアドレス確認
最後の手順として、AWS Clinet VPN接続後、クライアントPCはAWSのNAT GatewayでNATされてインターネットに接続されるので、このNAT後のグローバルIPアドレスがどうなるのか調べましょう。
VPC設定項目内の左ペイン内**Elastic IP**をクリックし、NAT Gatewayに割り当てたElastic IPを表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/2df3be15-9b2f-8ed0-8514-e48fc04de09e.png)
赤枠内のこれですね。

これでAWS Clinet VPNのAWS側の設定は完了です。
改めて記事書いてみて思いましたが、AWSは設定項目が多いですね。
めちゃくちゃ面倒です。
この構築の手間も含めてAzureとAWSを比較します。

次の記事ではAWS Clinet VPNのクライアントPC側の設定をご紹介します。
Azure P2Sとの比較まで書ききるまで何日かかるかな・・・

本日はここまで。