AWS の VPN サービス(AWS Client VPN)を試してみる

# AWS が提供する VPN サービス

https://aws.amazon.com/jp/vpn/
にあるように 2 種類あります。
上記ページには

- AWS Client VPN
- AWS サイト間 VPN

と書かれてあり、VPC 内のメニューと照らし合わせると

|サービス日本語名称|VPC メニュー内の名称|
|--|--|
|AWS Client VPN|クライアント VPN エンドポイント|
|AWS サイト間 VPN|Site-to-Site VPN 接続|

という関係性になります。

以降は VPC メニュー内の名称で表現します。

## Site-to-Site VPN 接続 について

> AWS サイト間 VPN は、データセンターまたは支社と AWS クラウドリソース間の安全な接続を作成します。グローバルに分散されたアプリケーションの場合、AWS Global Accelerator と連携することにより、サイト間 VPN の高速化オプションはさらに優れたパフォーマンスを提供します。

と説明されており、オフィスなど特定の IP からの接続を許可する場合に利用します。。
**個人で自宅で利用する場合にも一応使えるはずなので、実際に試してみようと思ったのですが最後にルータに色々設定する際に自身の知識不足のため断念しました。**

## クライアント VPN エンドポイント について

**※今回の検証で使用するものは一律 `vpn-test-xxxx` の命名ルールにしています。**
**※作成手順などは2023年07月時点での管理画面の内容を基準としています。**

### 検証用の VPC, EC2 を作成して、http でアクセスできるところまで

- VPCの作成
    - VPC のみ
    - 名前は `vpn-test-vpc`
    - IPv4 CIDRは `172.16.0.0/16`
    - ほかはデフォルトのまま
- サブネットの作成
    - VPC  `vpn-test-vpc` を指定
    - 名前は `vpn-test-subnet`
    - IPv4 CIDRは `172.16.0.0/24`
    - ほかはデフォルトのまま
- インターネットゲートウェイの作成
    - 名前は `vpn-test-internet-gateway`
- インターネットゲートウェイの編集
    - VPC にアタッチで `vpn-test-vpc` を選択
- EC2 インスタンス作成
    - 名前は `vpn-test-ec2`
    - AMIは `Amazon Linux 2023 AMI`
    - インスタンスタイプには `t2.micro` (動作検証するだけなので無料枠を利用)
    - キーペアは新たに作成
    - ネットワーク設定
        - VPC、サブネットは順に `vpn-test-vpc`  `vpn-test-subnet` を指定
    - セキュリティグループ
        - 新規作成
        - 名前は `vpn-test-security-group`
        - ルールは、あらゆる場所からアクセスできるようにしておく
            - ssh, 任意の場所
            - http, 任意の場所
    - ほかはデフォルトのまま
- Elastic IP の作成
    - すべてデフォルトのまま
    - 先ほど作成した EC2 に割り当て
- ルートテーブルの編集
  - EC2 と割り当てたことで自動で新規作成されているはずなので、 `vpn-test-vpc` と関連づいているものを見つける
  - ルートを編集
      - 0.0.0.0/0, インターネットゲートウェイ `vpn-test-internet-gateway` を指定
  - サブネットの関連付け
      - 利用可能なサブネットに、サブネット `vpn-test-subnet` があるので選択
- EC2 に ssh 接続できることを確認
    - nginx インストール
        以下は Amazon Linux 2023 における手順
        ```
        sudo dnf -y install nginx
        sudo service nginx start
        sudo netstat -nltp
        curl localhost
        ```
        ブラウザ http://{Elastic IP で割り当てた IP} にアクセス

### クライアント VPN エンドポイント の設定

個人の PC に VPN ソフトをインストールするやり方です。
OpenVPN というクライアントソフトを利用しますが、おそらく皆さんおなじみのソフトかと思います。

- サーバ証明書・クライアント証明書の作成
  クライアントがクライアント VPN エンドポイントへの接続を認められているか？をどう検証するかは 3 通りのやり方があります。
  https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html
    - Active Directory 認証 (ユーザーベース)
    - 相互認証 (証明書ベース)
    - シングルサインオン (SAML ベースのフェデレーション認証) (ユーザーベース)

    ユーザーベースの場合はユーザー登録が必要となるので、今回は気軽にテストできるサーバ証明書・クライアント証明書を利用した相互認証にします。
    手順はドキュメントに記載されているのでその通りに実施します。
    https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/mutual.html
    ※ドメインを取得していない環境であれば CN は空欄(自動で `server` となるようです)でも作業できます。

    出来上がった証明書は aws コマンドではなく AWS Certificate Manager (ACM) の GUI からアップするので、ローカルにダウンロードしておきます。
    ```
    **サーバ証明書**
    証明書本文: easy-rsa/easyrsa3/pki/issued/server.crt
    証明書のプライベートキー: easy-rsa/easyrsa3/pki/private/server.key
    証明書チェーン: easy-rsa/easyrsa3/pki/ca.crt
    **クライアント証明書**
    証明書本文: easy-rsa/easyrsa3/pki/issued/client1.domain.tld.crt
    証明書のプライベートキー: easy-rsa/easyrsa3/pki/private/client1.domain.tld.key
    証明書チェーン: easy-rsa/easyrsa3/pki/ca.crt
    ```
- AWS Certificate Manager (ACM) にアップ
    - 証明書のインポート
        - サーバ証明書、クライアント証明書両方をインポート。本文、プライベートキー、チェーンの内容を順に貼り付ける。
- クライアント VPN エンドポイントの作成
    - 名前は `vpn-test-client-vpn-endpoint`
    - クライアント IPv4 CIDR情報は `10.0.0.0/16`
    - サーバ証明書
        - 先ほど作成したもので `server` となっているものを指定
        - 相互認証を使用にチェック
    - クライアント証明書
        - 先ほど作成したもので `client1.domain.tld` となっているものを指定
    - スプリットトンネルを有効化にチェック
    - VPC IDに `vpn-test-vpc` を指定
    - セキュリティグループに `vpn-test-security-group` を指定
    - ほかはデフォルトのまま
    - 有効化されるまでしばらく時間がかかるので後続作業を進めておく
- クライアント VPN エンドポイントの編集
    - ターゲットネットワークの関連付け
        - VPC に `vpn-test-vpc` を指定
        - サブネット `vpn-test-subnet` を指定
    - 認証ルールを追加
        - アクセスを有効にする送信先ネットワークに `172.16.0.0/16` を指定(VPC の CIDR と同じ値)
        - アクセスを付与する対象に `すべてのユーザーにアクセスを許可する` を指定
    - クライアント設定をダウンロード
- OpenVPN クライアントのインストール
    https://www.openvpn.jp/download/
    以下 Windows 向け手順です。
    `C:\Users\（ユーザ名）\OpenVPN\config` を作成して、
    `client1.domain.tld.crt`, `client1.domain.tld.key` を設置します。
    ダウンロードしたクライアント設定ファイルも設置して、
    ```
    <ca>
        ...
    </ca>

    cert C:\\Users\\（ユーザ名）\\OpenVPN\\config\\client1.domain.tld.crt
    key C:\\Users\\（ユーザ名）\\OpenVPN\\config\\client1.domain.tld.key

    reneg-sec 0

    verify-x509-name server name
    ```
    ※バックスラッシュは2つ続けてエスケープさせること。
    もしくは
    ```
    <ca>
        ...
    </ca>

    <cert>
    {client1.domain.tld.crt の内容を貼り付け}
    </cert>

    <key>
    {client1.domain.tld.key の内容を貼り付け}
    </key>

    reneg-sec 0

    verify-x509-name server name
    ```
    と編集します。
    後者の鍵ファイルそのまま記載しているやり方だと、メンバー間での設定ファイルの共有がラクです。その場合は `client1.domain.tld.crt`, `client1.domain.tld.key` も不要となります。
- VPN 接続してみる
    - クライアント VPN エンドポイント が Avaiable(利用可能) になっていることを確認する
    - OpenVPN がタスクメニューに常駐しているので、右クリックして `接続` をクリックする。
- VPN 接続の有無でアクセスできる、できないの動作確認をする
    - Elastic IP の割り当てを解除
        - プライベート IP 指定でブラウザ、ssh ともにアクセスできることを確認
        - VPN 接続を切断する
        - プライベート IP 指定でブラウザ、ssh ともにアクセスできないことを確認

# ほかの VPN サービスとの料金比較

現在インターリンクを使用しているのでそちらと比較してみます。
結論としては、AWS Client VPN は結構お高いです。特別な理由がない限りはほかの VPN サービスを利用するほうが安く済みます。

## インターリンク

https://www.interlink.or.jp/service/groupvpn/price.html

基本料金が月額 ¥5,500 円固定です。
10 アカウントまでは基本料金内で使用可能となっており、さらに 10 アカウント追加する場合は ¥5,500 円が追加で発生します。上限はありますが、以降も 10 アカウントごとに同額が発生します。

## AWS Client VPN

以下の 2 項目で計算されます。

- AWS Client VPN エンドポイントアソシエーション
VPN を サブネットに関連付けていることへの料金です。基本料金みたいなイメージです。
- AWS Client VPN 接続
実際に VPN 接続している時間への料金です。接続クライアント数分発生します

課金単位はどちらも 1 時間ごとでリージョン毎に微妙に料金が異なります。

- 1日あたりの接続時間数
- クライアント数(利用人数)

を色々なパターンを用意して、1ヶ月あたりいくらになるのかシミュレーションしてみます。
https://calculator.aws/#/addService/VPC?nc2=h_ql_pr_calc

1ヶ月あたりの稼働日数は最低でも 22 日にしないといけないようなので、22 日で計算しているのと、
**AWS Client VPN エンドポイントアソシエーション** について、利用するときだけサブネットと関連付けて、利用が終わったら関連付けを解除することで費用を抑えることが出来ますが、
- 複数人で利用する
- 1 日 1 回程度は VPN 接続する

という環境で考えた場合には気軽に関連付けの解除ができないため 1 ヶ月関連付けたままという条件にします。


|サブネットの関連付け数|VPN 接続クライアント数 / 日|接続時間数 / 日|1ヶ月あたりの稼働日数|料金(ドル)|料金(円 143円換算)|
|--|--|--|--|--|--|
|1|3|9|22|139.20$|¥19,962|
|1|3|6|22|129.30$|¥18,542|
|1|3|3|22|129.30$|¥17,127|
|1|5|9|22|159.00$|¥22,807|
|1|5|6|22|142.50$|¥20,440|
|1|5|3|22|126.00$|¥18,073|
|1|10|9|22|208.50$|¥29,907|
|1|10|6|22|175.50$|¥25,173|
|1|10|3|22|142.50$|¥20,440|

**AWS Client VPN エンドポイントアソシエーション** の占める割合が大きく、1 サブネットと関連付けて 1 ヶ月利用するだけで 100$ (¥15,000) くらいかかります。
ちなみに **Site-to-Site VPN 接続** はもう少しお安く 1 ヶ月まるまる利用したとしても 35.04$ (¥5,000) 程度です。