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
- ほかはデフォルトのまま
- VPC
- インターネットゲートウェイの作成
- 名前は
vpn-test-internet-gateway
- 名前は
- インターネットゲートウェイの編集
- VPC にアタッチで
vpn-test-vpc
を選択
- VPC にアタッチで
- EC2 インスタンス作成
- 名前は
vpn-test-ec2
- AMIは
Amazon Linux 2023 AMI
- インスタンスタイプには
t2.micro
(動作検証するだけなので無料枠を利用) - キーペアは新たに作成
- ネットワーク設定
- VPC、サブネットは順に
vpn-test-vpc
vpn-test-subnet
を指定
- VPC、サブネットは順に
- セキュリティグループ
- 新規作成
- 名前は
vpn-test-security-group
- ルールは、あらゆる場所からアクセスできるようにしておく
- ssh, 任意の場所
- http, 任意の場所
- ほかはデフォルトのまま
- 名前は
- Elastic IP の作成
- すべてデフォルトのまま
- 先ほど作成した EC2 に割り当て
- ルートテーブルの編集
- EC2 と割り当てたことで自動で新規作成されているはずなので、
vpn-test-vpc
と関連づいているものを見つける - ルートを編集
- 0.0.0.0/0, インターネットゲートウェイ
vpn-test-internet-gateway
を指定
- 0.0.0.0/0, インターネットゲートウェイ
- サブネットの関連付け
- 利用可能なサブネットに、サブネット
vpn-test-subnet
があるので選択
- 利用可能なサブネットに、サブネット
- EC2 と割り当てたことで自動で新規作成されているはずなので、
- EC2 に ssh 接続できることを確認
- nginx インストール
以下は Amazon Linux 2023 における手順ブラウザ http://{Elastic IP で割り当てた IP} にアクセスsudo dnf -y install nginx sudo service nginx start sudo netstat -nltp curl localhost
- nginx インストール
クライアント 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
を指定
- VPC に
- 認証ルールを追加
- アクセスを有効にする送信先ネットワークに
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 ともにアクセスできないことを確認
- Elastic IP の割り当てを解除
ほかの VPN サービスとの料金比較
現在インターリンクを使用しているのでそちらと比較してみます。
結論としては、AWS Client VPN は結構お高いです。特別な理由がない限りはほかの VPN サービスを利用するほうが安く済みます。
インターリンク
基本料金が月額 ¥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) 程度です。