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の構成図は初めて書きます。
お作法も分からないので間違っていればご指摘ください。
このような構成図になります。
AWS Client VPNそのものは簡単に構築可能ですが、ポイントが2つあり、
- 証明書設定
- ルートテーブル設定
です。
それぞれ作業の順序に沿い、手順を記載していきます。
1. AWS CloudShell、証明局構築、サーバ証明書作成、クライアント証明書作成、サーバ証明書登録
AWS Client VPNは証明書認証とAD認証の両方がありますが今回は簡単に証明書認証を使います。
当然証明書の作成、登録が必要なのですが、これもAWS CLIのWeb版であるAWS CloudShellで簡単に終わらせてしまいます。
1-1. AWS CLI CloudShell
始めて開始する場合は以下のように環境構築と出てきますが、しばらくすると起動します。
1-2. 認証局構築
以下のコマンドを丸々コピペでうまくいきます。
sudo yum install openssl -y
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
念のため順に意味を説明すると
1行目
sudo yum install openssl -y
見たまんまのopensslをインストールします。
yumってことはこの環境、CentOSベースなんですかね。
証明書作成するのにOpenSSLをインストールします。
うまくいくと以下の通りになります。
[cloudshell-user@ip-10-0-17-146 ~]$ sudo yum install openssl -y
Loaded plugins: ovl, priorities
Resolving Dependencies
--> Running transaction check
---> Package openssl.x86_64 1:1.0.2k-24.amzn2.0.3 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================================================================================================================================================
Installing:
openssl x86_64 1:1.0.2k-24.amzn2.0.3 amzn2-core 496 k
Transaction Summary
============================================================================================================================================================================================================================================================================================
Install 1 Package
Total download size: 496 k
Installed size: 830 k
Downloading packages:
openssl-1.0.2k-24.amzn2.0.3.x86_64.rpm | 496 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 1:openssl-1.0.2k-24.amzn2.0.3.x86_64 1/1
Verifying : 1:openssl-1.0.2k-24.amzn2.0.3.x86_64 1/1
Installed:
openssl.x86_64 1:1.0.2k-24.amzn2.0.3
Complete!
[cloudshell-user@ip-10-0-17-146 ~]$
2行目
git clone https://github.com/OpenVPN/easy-rsa.git
GitからOpenVPNの環境を引っ張ってきます。
Gitのインストールしなくても動作することからAWS CloudShellにはGitは元々インストールされているんですね。
うまくいくと以下のようになります。
[cloudshell-user@ip-10-0-17-146 ~]$ git clone https://github.com/OpenVPN/easy-rsa.git
Cloning into 'easy-rsa'...
remote: Enumerating objects: 3644, done.
remote: Counting objects: 100% (83/83), done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 3644 (delta 37), reused 81 (delta 36), pack-reused 3561
Receiving objects: 100% (3644/3644), 25.02 MiB | 14.10 MiB/s, done.
Resolving deltas: 100% (1715/1715), done.
[cloudshell-user@ip-10-0-17-146 ~]$
3行目
cd easy-rsa/easyrsa3
2行目のコマンドでGitから引っ張ってきたディレクトリに移動し、4行目
./easyrsa init-pki
PKI(公開鍵基盤)を初期化します。
PKIとは
Public Key Infrastructure
の略です。
ここのコマンドまで一気にコピペで動作します。
うまくいくと以下のようになります。
[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とは
Certificate Authorities
の略です。
このコマンドを実行した時点でこの環境が認証局となります。
このコマンドを実行すると以下のようになります。
[cloudshell-user@ip-10-0-134-175 easyrsa3]$ ./easyrsa build-ca nopass
* Using Easy-RSA configuration from: /home/cloudshell-user/easy-rsa/easyrsa3/pki/vars
* Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
EasyRSA DN 'commonName-Only' mode (cn_only)
* Current CA Distinguished Name fields:
commonName = Easy-RSA CA
Type the word 'yes' to continue, or any other input to abort.
Create CA certificate with these DN settings ?
「これらの設定でCA構築続けていいの?」と聞いてくるので、
yes
と入力してエンターキーを押しましょう。
すると以下のように出力されてCAの構築が完了します。
Create CA certificate with these DN settings ? yes
.....+++
.....+++
Notice
------
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/cloudshell-user/easy-rsa/easyrsa3/pki/ca.crt
[cloudshell-user@ip-10-0-134-175 easyrsa3]$
最後の行でCA証明書を作成していますね。
1-4. サーバ証明書作成
次に以下のコマンドを実行します。
./easyrsa build-server-full aws_client_vpn nopass
このコマンドはパスワード無しでアクセスできるサーバ証明書を作成します。
このコマンドだとサーバ証明書の名前はaws_client_vpnという名前になりますので、お好きな名前にしてください。
このコマンドの実行結果は以下の通りになります。
* Using Easy-RSA configuration from: /home/cloudshell-user/easy-rsa/easyrsa3/pki/vars
* Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
.................................................+++
............................................................................................+++
writing new private key to '/home/cloudshell-user/easy-rsa/easyrsa3/pki/996e6e25/temp.79eb41a6'
-----
Notice
------
Keypair and certificate request completed. Your files are:
req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/aws_client_vpn.req
key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/aws_client_vpn.key
Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/safessl-easyrsa.cnf.init-tmp
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'aws_client_vpn'
Certificate is to be certified until Oct 5 13:28:44 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at: /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/aws_client_vpn.crt
12行目、13行目辺りでreqファイルとkeyファイルが作成されています。
最後の行でサーバ証明書が作成されていますね。
1-5. クライアント証明書作成
以下のコマンドを実行します。
./easyrsa build-client-full user01 nopass
このコマンドはパスワード無しでアクセスできるクライアント証明書を作成します。
このコマンドだとクライアント証明書の名前はuser01という名前になりますので、お好きな名前にしてください。
このコマンドの実行結果は以下の通りになります。
* Using Easy-RSA configuration from: /home/cloudshell-user/easy-rsa/easyrsa3/pki/vars
* Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
.................................+++
............+++
writing new private key to '/home/cloudshell-user/easy-rsa/easyrsa3/pki/604fa2a8/temp.297982dc'
-----
Notice
------
Keypair and certificate request completed. Your files are:
req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/user01.req
key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/user01.key
Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/safessl-easyrsa.cnf.init-tmp
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'user01'
Certificate is to be certified until Oct 5 13:32:42 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at: /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/user01.crt
12行目、13行目辺りでreqファイルとkeyファイルが作成されています。
最後の行でクライアント証明書が作成されていますね。
認証局の説明は改めて記事を書こうかなと思います。
このCAで作成されたサーバ証明書、クライアント証明書はセットになりますので今後この環境を移行する際はご注意ください。
1-6. サーバ証明書登録
ここまでで作成したCA証明書ファイル、サーバ証明書ファイルとサーバキーファイル、クライアント証明書とクライアントキーファイルを別のフォルダにコピーします。
移動するフォルダの名前は任意の名前で結構です。
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/aws_client_vpn.crt ~/custom_folder/
cp pki/private/aws_client_vpn.key ~/custom_folder/
cp pki/issued/user01.crt ~/custom_folder
cp pki/private/user01.key ~/custom_folder/
cd ~/custom_folder/
ここまで一気にコピペして動作します。
エラー無く各ファイルがコピーできればここまでの作業はうまくいっています。
コピーするファイルが見つからなくてエラーになっている場合は該当箇所の作業を見直しましょう。
最後に以下のコマンドを実行します。
aws acm import-certificate --certificate fileb://aws_client_vpn.crt --private-key fileb://aws_client_vpn.key --certificate-chain fileb://ca.crt
このコマンドがうまくいくと以下のようなメッセージができます。
{
"CertificateArn": "arn:aws:acm:ap-northeast-1:218139198967:certificate/c91e1227-cb8f-4135-8af7-a9296c37a09f"
}
これでAWS Certificate Manager(ACM)にc91e1227-cb8f-4135-8af7-a9296c37a09fという名前でこの手順で作成したサーバ証明書が登録されます。
2. クライアント証明書のダウンロード
AWS CloudShellの右上のあるActionをクリックして、FilesのDownloadをクリックします。
以下のような画面が出てくるのでクライアント証明書とクライアントキーのパスを入力してダウンロードします。
ここでダウンロードしたクライアント証明書とクライアントキーはAWS Client VPNを接続する際に必要になってきますので大事に保管しましょう。
またこれらのファイルが漏えいすると誰でもAWS Client VPNに接続できてしまうようになりますので、厳重に保管しましょう。
3. 各種リソース作成
最終構成が上述の
この構成であり、かつ既存VPCが以下のような簡単な構成で既に存在している、既存VPCのネットワークアドレスを使い切っている場合は既存VPCにネットワークアドレスを追加してください。
3-1. VPCにネットワークアドレスを追加する
ここのサブネットは今回の構成ではInternet Gatewayを作成しないプライベートサブネットとなります。
次の構成図内の赤枠を部分を作成します。
このプライベートサブネットには赤枠内にあるAWS VPN Clientが接続しに来るため(AWS VPN Clientの接続の受け口である)のVPN Gatewayのリソースとルートテーブルが存在します。
詳細はそれぞれのリソースの作成項目で説明します。
既存VPCの設定画面にアクセスしアクションのCIDRの編集をクリックします。
新しい IPv4 CIDR を追加をクリックします。
3-2. サブネットを追加する
AWSコンソール内のVPCから、サブネットを選択し、サブネットを作成をクリックします。
VPC内にあるIPアドレス帯の中から余っているIPアドレス帯を選んでサブネットを作成しましょう。
これでプライベートサブネットの作成は完了です。
3-3. NAT Gatewayの作成
続いてNAT Gatewayの設定です。
AWS VPN Clientをフルルートで構成し、AWS VPN Client接続後にインターネット接続する際のグローバルIPアドレスを固定IPアドレスにする際の1つ目のポイントになる設定でもあります。
構成図内ですと以下の赤枠内のリソースです。
VPCの設定画面内の左ペイン内にあるNAT Gatewayを選択し、画面右上にあるNAT Gatewayの作成をクリックします。
NAT Gatewayの名前は適当で構いません。
上述の構成図の通りサブネットはDefault RouteがInternet Gatewayを向いているPublic Subnetとします。
インターネットへ接続できるように、接続タイプはパブリックとし、グローバルIPアドレスを固定にするためのElastic IPを割り当てをクリックします。
ここでElastic IPを割り当てを選択しないと、フルルート設定のAWS VPN Clientに接続してインターネットに接続した場合、グローバルIPアドレスが固定IPアドレスになりません。
ここまで入力し、最後にNATゲートウェイを作成をクリックします。
3-4. ルートテーブルの作成
続いてルートテーブルの作成です。
パブリックサブネットはDefault RouteがInternet Gateway、プライベートサブネットはDefault RouteがNAT Gatewayとなりこのルートテーブルの作成が2つ目のポイントになります。
構成図でいうと以下の赤枠内のリソースです。
既存VPCの設定画面内のルートテーブルの項目をクリックし、画面右上のルートテーブルの作成をクリックします。
ルートテーブル名は適当で良いと思うのですが、今後管理がしやすいようにどのサブネットに関連付いているかがわかりやすいようにサブネット名をルートテーブル名に加えておくと良いかもしれません。
VPCは既存VPCを選択し、最後にルートテーブルの作成をクリックします。
3-5. ルートテーブルの設定
作成されたルートテーブルを選択し、設定タブ内のルートを選択しDefaultの設定を確認し、その右隣にあるルートを編集をクリックします。
ルートを編集内のルートを追加をクリックします。
送信先に0.0.0.0/0(Default Route)と入力し、ターゲットにNATゲートウェイを選択します。
ターゲットにNATゲートウェイを選択すると、前の手順3-3. NAT Gatewayの作成で作成したNAT Gatewayを自動で選択してくれます。
NATゲートウェイを選択したら最後に変更を保存をクリックします。
これでこのルートテーブルのDefault GatewayがNAT Gatewayに向きましたので、このルートテーブルをプライベートサブネットに関連付けます。
ルート追加が終わったルートテーブルを開き、サブネットの関連付けをクリックします。
プライベートサブネットを選択し、関連付けを保存をクリックします。
3-6. VPN Gatewayの作成
最後のリソース作成手順です。
構成図でいうと以下の図の赤枠部分、プライベートサブネット内にあるそのものズバリ、VPN Gatewayになります。
VPC設定画面を開き、左ペイン内のクライアント VPN エンドポイントをクリックします。
2022年7月3日時点ではまだNewの文字がありますね。
新しいサービスです。
画面が開いたらクライアント VPN エンドポイントを作成をクリックします。
まずは赤枠内の設定から行います。
名前は適当で良いです。
クライアント IPv4 CIDRですが、オンプレミスで利用していないセグメント、かつVPCで利用していないセグメントを最大/16から最小/22の間で設定してください。
最小で/22というと1024個のIPアドレスが使えるので、かなり広いレンジです。
続いて後続の肝心の挙動に関する設定、特に認証情報部分ですが、ここのサーバ証明書とクライアント証明書で最初の手順、1. AWS CloudShell、証明局構築、サーバ証明書作成、クライアント証明書作成、サーバ証明書登録で作成し、ACMに登録した証明書を指定します。
また認証オプションは相互認証を使用にチェックを入れます。
この設定でVPN GatewayとACMに登録したサーバ証明書、クライアント証明書が関連付き、認証ができるようになります。
これ以降の設定はオプション設定となりますが、設定しておいた方が接続時や接続不良時のトラブルシュートがしやすくなります。
環境によって設定値が変わってきますので、DNSサーバやトランスポートプロトコルは適宜環境に合わせて変更してください。
DNSサーバはAWS VPN Client接続時にクライアントPCに割り振られるDNSサーバのIPアドレスになります。
私はAWSのVPC内で名前解決を行う必要もないのでGoogleのパブリックDNSを入れていますが、接続先のVPC内で独自の名前解決を行う際は必要なDNSサーバのIPアドレスを入力してください。
トランスポート プロトコルはデフォルト設定だとUDPとなっておりますが、これを私はTCPに変更しています。
スプリットトンネルですが、これが冒頭の説明フルルートかそうでない(スプリットトンネル)かを変更するパラメータになります。
今回はAWS Clinet VPN接続時にクライアントPCのデフォルトゲートウェイをAWSに向ける、つまりフルルートなのでこのスプリットトンネルの設定値はOffになります。
VPC IDはVPN GatewayのあるVPC、セキュリティグループに関しては何も設定していないDefaultのセキュリティグループを選択しました。
接続元IPアドレスを絞りたい場合は別でセキュリティグループを作成して適宜設定しましょう。
VPN ポートはトランスポートプロトコルをTCPにしてあるので443にしました。
TCPでも1194で接続できるんですかね?
不勉強でわかりませんが、一般的な企業ネットワーク内からの接続を考えた場合は443の方が無難なので443にしました。
逆に443だと誰でも企業内から接続できてしまうのでそうなると都合が悪い場合は1194にした方が良いかもしれません。
そしてクライアントPCからAWS Client VPNが接続したがしてないかを判断しやすくするために私はクライアントログインバナーを有効化の設定を有効にし、ログインバナーにWelcome AWS Client VPN !と入力しました。
そして最後にクライアントVPNエンドポイントを作成をクリックします。
長かったですね。
しかしまだ完了じゃないです。
作成ボタンをクリックするとクライアント VPN エンドポイントの最初の画面に戻りますが、ここから更に設定を行います。
状態がしばらく赤枠のようにPendingになっていますが気にせず進めます。
一部ここからの追加設定が終わらないと状態がPendingから進みません。
3-7. クライアント VPN エンドポイントのターゲットネットワーク関連付け設定
ターゲットネットワークの関連付けのタブを選択し、ターゲットネットワークを関連付けるをクリックします。
VPCと関連付けるサブネットを選択を設定します。
でもこの設定ってVPC IDとかをクライアント VPN エンドポイントの作成時に設定しているので、そこで一括でできないんですかね?
VPCの選択はVPC IDでやってるはずなんですけど、なんでなんでしょうか?
まぁ重複する設定を何度も入力するのは面倒ですが、まぁ良いでしょう。
必須パラメータなので仕方ないです。
構成図と見比べて
このクライアント VPN エンドポイントは構成図でいうとVPN Gatewayなのでプライベートサブネットですね。
この構成図に合わせて設定を行うと以下のようになります。
ターゲットネットワークを関連付けるをクリックしましょう。
設定後に念のため確認しておきましょう。
3-8. クライアント VPN エンドポイントの承認ルール設定
はい、まだ設定は続きます。
承認ルール設定です。
これはこのAWS Clinet VPN接続後、VPC内のどのネットワークに接続して良いかを制御する設定です。
承認ルールのタブをクリックし、認証ルールを追加をクリックします。(表現は統一してほしいですね。)
AWS Clinet VPN接続後、VPC内のどのネットワークに接続して良いかを制御する設定なので、VPC内のIPアドレス帯はもちろん、今回はフルルートでこのAWS Clinet VPN経由でインターネットに接続するので、0.0.0.0/0も対象になります。
まずはインターネットから
続いてVPC内のネットワーク
こうしてAWS Clinet VPN経由で接続させたいネットワークへの許可を行います。
アクセス権をすべてのユーザーに許可するは今回はどのネットワーク宛も許可します。
これはADで認証を行っている場合はかなり強力な設定で、ユーザごとにアクセス先を制御できます。
今回は証明書認証なのですべてのユーザに許可、で良いかと思います。
3-9. クライアント VPN エンドポイントのルートテーブル設定
はい。
まだまだ設定は続きます。
項目多いな。
ルートテーブルタグを選択し、ルートを作成をクリックします。
ご覧の通りVPC内のネットワークは何も設定しなくてもルートは切られています。
つまり前項の設定と併せて考えると、AWS Clinet VPNからVPCへはルートはデフォルトで暗黙的に切られている(経路は設定されている)が、接続を許可するか否かは承認タブの設定次第ということが言えると思います。
細かな制御ができるということで小回りの利く設定ができるということですが、どうしても設定項目が多くなる、ということで表裏一体なのかもしれません。
それにしても設定項目が多くて面倒だ・・・
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を表示させます。
赤枠内のこれですね。
これでAWS Clinet VPNのAWS側の設定は完了です。
改めて記事書いてみて思いましたが、AWSは設定項目が多いですね。
めちゃくちゃ面倒です。
この構築の手間も含めてAzureとAWSを比較します。
次の記事ではAWS Clinet VPNのクライアントPC側の設定をご紹介します。
Azure P2Sとの比較まで書ききるまで何日かかるかな・・・
本日はここまで。