【初心者向け】AWS Client VPNの概念を理解する

記事タイトルとURLをコピーする

こんにちは!エンタープライズクラウド部技術2課の日高です。
私がAWS Client VPNを使い始める際に、理解しづらい部分があったので、AWS Client VPNの概念を本ブログにまとめていきたいと思います。

AWS Client VPNの概要

AWS Client VPNとはマネージドのOpen VPNサーバー機能を簡易に展開可能なサービスです。
VPN接続で、個人のパソコンやスマートフォンなどのクライアント端末からVPCに接続することができます。
VPN接続には、OpenVPNを利用することで安全なTLS接続を提供しています。

ユースケースとしては、リモートワークの際に自宅PCからVPCにVPN接続するだったり、パブリックサブネットにある踏み台サーバーの代わりに使用して、プライベートサブネットにあるEC2にアクセスするなどが考えられます。(もちろん他にもユースケースは考えられます)

通信の大まかな流れとしては、Client-Client VPN Endpointの間でTLS接続をし、Client VPN EndpointからClient VPN network interfacesを経由し、VPCなどと通信をします。

Client VPN EndpointとClient VPN network interfacesを簡単にまとめると以下のようになります。

  • Client VPN Endpoint   
    • クライアント端末からの接続を受けるためのネットワークインターフェイス
    • 図内の「ユーザー不可視のClient VPN 基盤」にある VPNサーバーの入り口
    • クライアント端末が TLS で接続する場所
  • Client VPN network interfaces
    • 接続先VPCと接続するためのネットワークインターフェイス
    • 「ユーザー不可視のClient VPN 基盤」にある VPNサーバーが 接続先 VPC と通信するネットワークインターフェイス

AWS Client VPNに関するコンポーネント

AWS Client VPNに関するコンポーネントを、下記の通信範囲に分けて対応するコンポーネントごとに書いていきます。

  1. Client-Client VPN Endpoint間
  2. Client VPN Endpoint-Client VPN network interfaces間
  3. Client VPN network interfaces-その他

1. Client-Client VPN Endpoint間

本見出しでは、 Client-Client VPN Endpoint間 の通信範囲と、登場するコンポーネントについて記載します。 
※Client VPN Endpointの説明は「2. Client VPN Endpoint-Client VPN network interfaces間」に記載します。

Client(クライアント)

Clientとは、公式ドキュメントには以下の用に記載されています。

VPN セッションを確立するためにクライアント VPN エンドポイントに接続するエンドユーザー。
エンドユーザーは、OpenVPN クライアントをダウンロードし、作成した Client VPN 設定ファイルを使用して VPN セッションを確立する必要があります。

クライアント VPN のコンポーネント抜粋

Client VPN Endpointに接続するエンドユーザーのことを指すようです。
他の表現として、クライアント端末と呼ばれる場合もあります。

またVPN接続を開始するには、クライアントにてVPN接続ツールをダウンロードし、作成したClient VPN 設定ファイルを使用します。
接続ツールはこちらからダウンロードすることができます。

クライアント CIDR

クライアントに割り当てられる IP アドレスの、割り当て元となる IPアドレス範囲です。
Client VPN Endpointへの各接続には、クライアント CIDR 範囲から一意の IP アドレスが割り当てられそのIPアドレスを送信元として通信します。

クライアント VPN ポート

AWS Client VPN の待受ポートとして、TCP / UDPの443/1194 がサポートされています。
デフォルトでは、ポート番号443が選択されます。

Client-Client VPN Endpoint間のまとめ

Client-Client VPN Endpoint間のまとめでは、(1)VPN接続開始時 (2)VPN接続後のトンネル内部 の2つの通信について見ていきます。

(1)VPN接続開始時 VPN接続開始時は図の通りクライアントのグローバルIPアドレス(ユーザのネットワークCIDR内のグローバルIPアドレス)が送信元のIPアドレスになります。
例えば自宅PC(204.222.164.100)からClient-Client VPN Endpoint内のVPNサーバーに接続する場合だと、送信元のIPアドレスは 204.222.164.100 になります。

ClientVPNのグローバルIPアドレスに通信が受理されたら、クライアントCIDR範囲のIPアドレスを持つ仮想インタフェース(トンネルインターフェイスとも呼ばれます)が作成されます。(図上にて青枠で囲まれているもの)

同時にクライアント端末のルートテーブルが書き換えられて、一部ないし全ての通信について作成された仮想インタフェースを通るようになります。(後述のスプリットトンネルと、Client VPNのルートテーブルの設定次第で挙動が変わります)

また、Client VPN EndpointのグローバルIPアドレスはClient-Client VPN EndpointのDNS名を名前解決することで分かります。

実際に、コマンドプロンプトから nslookup (Client VPN EndpointのDNS名)をたたくとClient-Client VPN EndpointのグローバルIPアドレスが表示されました。
この際に、アスタリスク(DNS名は .×××××.×××××.ap-northeast-1.amazonaws.comのように 「(アスタリスク)」が含まれている)のところになにかしら値を入れないと名前解決ができないため注意が必要です。

(2)VPN接続後のトンネル内部

(1)でも記載しましたが、VPNセッションが確立した後の通信では仮想インターフェイス(青枠)を通るため、送信元IPアドレスがクライアントCIDRから割り当てられたIPアドレスになります。

例えば、Client からEC2インスタンスにSSH接続を行いたい場合の宛先IPアドレスは「接続先のIPアドレス」、接続ポートは「22」になります

補足

今までの内容をもう少し細かく考えてみます。
ここから記載する内容は、AWSからは詳細フロー・基盤構造は公開されておらず筆者の推測によるものです。
実際の挙動とは多少異なるところがあるかもしれませんが、その点はご了承ください

  1. VPN接続が許可されるとVPN接続専用の仮想NICがクライアント端末上に生成される
  2. 同時にクライアントのルートテーブルが、下記に書かれている(1),(2)のように書き換わる
  3. クライアント端末上に生成された仮想NICにルーティングされた通信は、暗号化・トンネリング処理がクライアントソフトによって施される
  4. ClientVPN基盤に転送された通信は、基盤側のVPN用プロセスによって解読・復号化される
  5. Client VPN Endpoint上のルートテーブル設定に基づき、Associate済みのサブネットのうち 具体的にどのサブネット(のENI)経由で通信を行うかを決定して通信する

(1)スプリットトンネルが無効の場合
localを除いた全通信のデフォルトゲートがクライアント端末上に生成された仮想NICに向く

(2)スプリットトンネルが有効の場合
Client VPN Endpointのルートテーブル設定上でルーティングを許可している通信先のCIDRに関してのみnext hopがクライアント端末上に生成された仮想NICになる(図では②を想定していて、赤字箇所が該当している)

以上の手順のようにAWSの裏側でNICが作られ通信が行われているのではないかと考えています。

2. Client VPN Endpoint-Client VPN network interfaces間

「2. Client VPN Endpoint-Client VPN network interfaces間」で上記の図の通信範囲と、登場するコンポーネントについて記載します。

クライアント VPN ネットワークインターフェイス(Client VPN network interfaces)

冒頭にも記載しましたが Client VPN network interfacesの概要は以下の通りです。

  • 接続先VPCと接続するためのネットワークインターフェイス
  • 「ユーザー不可視のClient VPN 基盤」にある VPNサーバーが 接続先 VPC と通信するネットワークインターフェイス

サブネットを後述のClient VPN Endpointに関連付けると、そのサブネットにClient VPN network interfacesが作成され、Client VPN Endpoint→VPC に送信されるトラフィックは、Client VPN network interfacesを介して送信されます。
この通信の際に、NAPTが適用され、クライアント CIDR 範囲から送信元 IP アドレスが、Client VPN network interfacesのIPアドレスに変換されるため注意が必要です。

クライアント VPN エンドポイント(Client VPN Endpoint)

AWS Client VPN のメインとなるコンポーネントになり、クライアント端末が TLS で接続する場所となります。
また、VPNサーバ接続時の各種オプション(後述の認証パターン、ロギング、スプリットトンネルの適用有無など)を司っています。

  • マネジメントコンソールにてパラメータを表示してみます

今回すべては解説しきれないので、この中からいくつか解説していきます。

ターゲットネットワーク

ターゲットネットワークは、Client VPN Endpointに関連付けるネットワーク(サブネット)のことです。
注意点としては、ターゲットネットワークの対象となるサブネットは、Client VPN Endpointを関連づけた VPC のサブネットである必要があります。
また、複数ターゲットネットワークを選択する場合は、選択されるサブネットが異なる AZである必要があります。( AZ ごとに1つのサブネットしか選択できない)

このターゲットネットワークにClient VPN network interfacesが作成されます。

ルートテーブル

Client VPN Endpointには、ルートテーブルが紐づいています。
ターゲットネットワークと関連付けを行うと自動的にターゲットネットワークが所属するVPCのCIDRがルートに追加されます。
もちろん、手動でルートを追加することも可能になります。(VPC 外へのアクセスを行いたい場合など)

注意点としては、複数のターゲットネットワークを関連づけた場合、ルートテーブル内のエントリは両者で揃える必要があります。

マネジメントコンソールでは以下のように表示されます。

セキュリティグループ

マネジメントコンソールでは、Client VPN Endpointにて表示されていますが、Client VPN network interfacesに関連付けるセキュリティグループです。

もちろんセキュリティグループを複数指定することも可能ですが、指定しない場合は VPC の default のセキュリティグループが関連付けられます。
Client VPN network interfacesに関連付けるセキュリティグループでは、インバウンドは開放する必要はありません。

これは明示的な理由は書かれていませんが、VPC内のリソースからClientVPN network interfacesを通じたVPN接続や管理コンソールへのアクセスについては、マネージドサービスの都合で禁止していて、裏側でAWSがClient VPN Endpointからの通信を許可してくれているのではないのかなと個人的には考えています。

「 Client VPN network interfaces→宛先」のアウトバウンドトラフィックが、セキュリティグループのアウトバウンド設定により制御されます。

承認ルール

承認ルールにて、VPN接続を介してアクセスできるネットワークとユーザーを制限します。
デフォルトでは承認ルールが存在していないため、ユーザーがリソースやネットワークにアクセスできるように承認ルールを設定する必要があります

「認証ルールを追加」を選択すると、アクセスを有効にする送信先ネットワークと、アクセス権をどのユーザーに許可するのかが指定できます。
1つの Client VPN Endpointに対して複数の承認ルールを設定することができます。

認証タイプ

AWS Client VPNでは、Client VPN Endpointへの接続を許可するかどうかを判断するための認証タイプが以下から選択可能です。
※相互認証とフェデレーション認証、相互認証と Active Directory 認証を組み合わせて使用することもできます。(相互認証は必須で、ユーザーベース同士は不可)

  • 相互認証 (証明書ベース)
  • Active Directory 認証 (ユーザーベース)
  • シングルサインオン (SAML ベースのフェデレーション認証) (ユーザーベース)
サーバー証明書

AWS Client VPNではVPN接続をする際にサーバー証明書が必要となります。
サーバー証明書はAmazon Certificate Manager(今後はACMと表記)にある必要があり、マネジメントコンソールで表示されているサーバー証明書ARNは、ACMのARNが指定されています。

※サーバー証明書の発行手順は以下をご覧ください。

docs.aws.amazon.com

スプリットトンネル

有効にすることで「Client VPN ルートテーブルで宛先として定義されている CIDRへの通信」以外を、VPNトンネルを経由せず、VPN接続をする前のルートで通信を行います。
デフォルトでは無効になっています。

無効の状態だと、すべてのトラフィックが Client VPN を経由します。

接続ログ

Client VPN Endpointの接続ログを有効にすることで、接続イベントをCloudWatch Logs ロググループに記録できます。

接続ログの例として以下のようなものが取得できます。(接続ログエントリ抜粋)

{
    "connection-log-type": "connection-attempt",
    "connection-attempt-status": "successful",
    "connection-reset-status": "NA",
    "connection-attempt-failure-reason": "NA",
    "connection-id": "cvpn-connection-abc123abc123abc12",
    "client-vpn-endpoint-id": "cvpn-endpoint-aaa111bbb222ccc33",
    "transport-protocol": "udp",
    "connection-start-time": "2020-03-26 20:37:15",
    "connection-last-update-time": "2020-03-26 20:37:15",
    "client-ip": "10.0.1.2",
    "common-name": "client1",
    "device-type": "mac",
    "device-ip": "98.247.202.82",
    "port": "50096",
    "ingress-bytes": "0",
    "egress-bytes": "0",
    "ingress-packets": "0",
    "egress-packets": "0",
    "connection-end-time": "NA",
    "username": "joe"
    }

※注意点 認証タイプによってログの形式は微妙に異なります。
またログ出力のタイミングは、 接続試行時と終了時です。

Client VPN Endpoint-Client VPN network interfaces間のまとめ

  • Client VPN Endpointへの接続を許可する認証タイプを指定する必要がある
  • Client VPN EndpointにはVPN接続するためにサーバー証明書が必要でACMにプロビジョニングされている必要がある
  • 承認ルールにて、VPN接続を介してアクセスできるネットワークとユーザーを制限する必要がある
  • ターゲットネットワークを関連付けることにより、Client VPN Endpointのルートテーブルにターゲットネットワークが所属するVPCのCIDRがルートに追加される(手動でルート編集することも可能)

3. Client VPN network interfaces-その他

Client VPN network interfaces から通信可能な接続先は、以下に依存します。

  • Client VPN network interfacesが紐づいているサブネットの以下設定
    • ルートテーブル
    • NACLの設定
  • Client VPN network interfaces
    • セキュリティグループのアウトバウンドルール

また、Client VPN network interfacesの説明にも記載しましたが、Client VPN経由でVPC内のリソースにアクセスするとき、送信元NATされているため接続元IPアドレスはClient VPN network interfacesのIPアドレスになるため注意が必要です。

まとめ

今回説明した全体像は上記の図のようになります。

本ブログを読んでいただいた後、弊社の杉村が書いたブログのハンズオンをやっていただくと、より理解が深まると思うのでよければご覧ください。
本記事が誰かの助けになれば幸いです。

blog.serverworks.co.jp

日高 僚太(執筆記事の一覧)

EC部技術2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp