【初心者】AWS クライアントVPN を使ってみる

# 目的
- クライアントVPN接続の調査の案件があり、やり方を載せたサイトは既にいくつかあったが、自分で一通り実機で触って気になるところを確認する。

# AWS クライアントVPN とは (自分の理解)
- 自分のPCにVPNクライアントソフトを入れて、インターネット経由で安全にAWS VPCへ接続できる。さらにそのVPCを経由したインターネット接続やオンプレミス接続ができる。

# やったこと
- VPN接続を認証するためのADを用意する(ADサーバの構築、AD Connectorによる利用設定)。
- クライアントVPNエンドポイントの作成とVPC(Subnet)への紐づけを行う。
- クライアントPCへVPNソフトウェアのインストールと設定を行う。
- PCからVPNソフトウェアを用いてVPNアクセスし、AD上のユーザID/パスワードを用いて認証し、VPC内に接続する。さらにDirectConnectの先のオンプレサーバへアクセスする。（クライアントVPNの機能としてはクライアント証明書による認証も可能だが今回は未検証）

# 構成図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a18b0584-df82-c704-aae7-c7d5612be321.png)

# 手順
## 事前準備
- 構成図の通り、以下の既存環境をベースとして利用。
    - VPC (10.4.0.0/16)
    - Subnet (10.4.0.0/24: サーバ配置用、10.4.10.0/24: Client VPN接続用)
    - Direct Connect に接続されたVGWがアタッチされている (各SubnetからDirect Connect 経由でオンプレサーバへアクセス可能)

## ADサーバの構築とAD Connectorによる利用設定
- ADの構築
    - Windows Server 2016のインスタンスを作成し、ADを構築する。
    - VPN接続時に認証に使うためのユーザ「vpndemouser」を作成する。
    - AD Connector と接続するためのユーザ「connectoraccount」を作成する。権限の設定について、[AWS公式ドキュメント：権限をサービスアカウントに委任する](https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/prereq_connector.html#connect_delegate_privileges) を参照する。

![vpn02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3e17a230-8594-c168-7649-968a9418c11e.png)


- AD Connector の設定
    - 作成したADサーバをVPN接続時の認証に使うには、AD Connector と接続させる必要がある。以下の手順で接続を行う。
        - Directory Service - ディレクトリのセットアップ
        - AD Connectorを選択
        - スモールを選択
        - VPC及びサブネットを選択(サブネットは2つ必要)
        - 接続先のADサーバの情報(ドメイン名、IPアドレス、前手順で作成した接続用のサービスアカウントのID/Passwd)を入力
        - 設定後、ステータスが「Active」になることを確認

![vpn03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c659f63b-eee4-91c9-9df3-342c5545f37b.png)

![vpn04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e4036b26-a637-bc34-a446-7c910b8ba3c4.png)


## クライアントVPNエンドポイントの作成

- ACMでの証明書作成
    - クライアントVPNエンドポイントを作成する際、サーバ証明書が必要となるため、先に作成する。手順は省略するが、例えば[サーバワークス社ブログ：ACM証明書発行をDNS検証で行う](http://blog.serverworks.co.jp/tech/2017/12/04/acm-dns/)を参照。

- クライアントVPNエンドポイントの作成
    - VPC - クライアントVPNエンドポイント - クライアントVPNエンドポイントの作成
        - クライアントIPv4 CIDR: 172.16.0.0/22 (VPCのCIDRとは別のアドレスレンジが必要)
        - サーバー証明書ARN： ACMで作成したサーバ証明書
        - 認証オプション：　ユーザーベースの認証（今回はクライアント証明書ではなく、ADに登録されたID/Passwdを使用）
        - ディレクトリID：　作成したAD Connector のID
        - ClowdWatch Logs ロググループ/ログストリーム：　あらかじめ作成しておいたロググループ/ログストリームを指定
        - VPC ID：接続させたいVPC
        - セキュリティグループID：　デフォルトのセキュリティグループ
    - 上記を設定すると、エンドポイントが作成されるが、状態が「保留中」となる。

![vpn06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4cdfdb9a-7446-207b-3533-5afd28ea2e5f.png)
![vpn07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/70d09630-3ba8-ad98-6233-08276dad8205.png)


- エンドポイントの設定
    - 「関連付け」タブの「関連付け」ボタンにて、作成したエンドポイントを紐づけるVPC/Subnetを設定する。今回は 10.4.10.0/24のサブネットを設定。この設定後、エンドポイントの状態が「保留中」から「使用可能」に変化する。
    - 「認証」タブの「受信の承認」ボタンにて、VPNアクセス時に接続先として許可したいアドレスレンジを指定する。今回は、10.4.0.0/16 (VPCのCIDR)及び10.1.0.0/16(DirectConnectの先のオンプレミスNW)の2つを指定する。
    - 「ルートテーブル」タブの「ルートの作成」ボタンから、VPC以外のCIDRへのルートテーブルを追加する。今回は10.1.0.0/16(Direct Connect経由のオンプレミスNW)を追加する。


![vpn08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/0b884d0f-e3cc-494a-32a6-5d87c9219136.png)
![vpn09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6e6c68c0-e2ce-1e04-1566-16b93c3d07bf.png)
![vpn10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/038fcc9b-2cb3-32df-6552-faaa77ac5405.png)


## PCにクライアントソフトをインストール
- 作成したクライアントVPNエンドポイントを選択し、「クライアント設定のダウンロード」ボタンを実行すると、「downloaded-client-config.ovpn」という設定ファイルがダウンロードできる。
- AWS公式のVPNクライアントソフトを[AWS公式サイトのダウンロードページ](https://aws.amazon.com/jp/vpn/client-vpn-download/)からダウンロードしインストールする。(Windows版/Mac版があるが、今回はWindows版を使用)
- ソフトウェアを起動し、ダウンロードした設定ファイル(downloaded-client-config.ovpn)をプロファイルとして設定する。

![vpn11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/160d5209-8dd8-7f00-a298-588039536f3b.png)

# 動作確認
- VPNクライアントによる接続
    - プロファイル設定済のAWS VPNクライアントにて、「接続」を実行し、ID/Password(今回はADに登録したID)で接続する。状態が「接続済み」になればOK。
    - 最初正常に接続できなかったため、トラブルシューティングを実施し、最終的に設定ファイルを修正した。詳細はトラブルシューティングの項を参照。
    - VPC内のサーバ(10.4.0.78)、及びオンプレサーバ(10.1.0.1)までpingやhttpアクセスができることを確認。
    - 接続の状況についてはマネージメントコンソールの画面（「接続」タブ）でも確認できる。（誰が接続中なのか等）

![vpn12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5c5038b4-ee5c-864a-6cc4-a676e9c9839f.png)

- ソースIPアドレスの確認
    - VPN接続したクライアントPCからVPC内のEC2インスタンス(nginx)にアクセスした際のアクセスログを確認する。PCにアサインされる172.16.0.0/22のアドレスではなく、クライアントVPNエンドポイントのIP(10.4.10.96)がソースIPアドレスとなっている。
    
```
10.4.10.96 - - [02/May/2020:16:38:12 +0000] "GET / HTTP/1.1" 200 3520 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0" "-"		
10.4.10.96 - - [02/May/2020:16:38:12 +0000] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://10.4.0.78/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0" "-"
```

- CloudWatch (メトリクス)の確認
    - 作成したクライアントVPNエンドポイントについて、ActiveConnectionCount(アクティブな接続数)等のメトリクス情報を取得できる。

![vpn15a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d357e9a7-bef9-4589-2675-e848b8357da8.png)

- CloudWatch Logsの確認
    - 接続、切断に関するログ（時刻、ログインID、PCのIPアドレス等)を保存できる。

![vpn16a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/63860b7c-3fbd-6a31-928a-d3da6df805ff.png)

# トラブルシューティング

- ダウンロードした設定ファイル(downloaded-client-config.ovpn)をAWS VPNクライアントで指定して接続を試みたが、接続が確立できずエラーになったため、以下の手順での対応を実施。
- AWS VPNクライアント(v1.1.1)ではエラーログが出ず原因が分からなかったため、別途OpenVPNクライアントをインストールし、同じ設定ファイルを利用して接続をテスト。OpenVPNのダウンロードは[公式サイトのダウンロードページから](https://www.openvpn.jp/download/)。
- OpenVPNクライアントは接続時に進捗やエラーが表示される。接続要求時に以下のエラーが発生。


```
Sun May 03 00:39:23 2020 VERIFY ERROR: depth=3, error=unable to get issuer certificate: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Services Root Certificate Authority - G2		
Sun May 03 00:39:23 2020 OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
```	
- 検索した結果、以下のサイトに記載の対処（設定ファイルの一部内容書き換え）にて接続可能に。修正した設定ファイルをAWS VPNクライアントで使用すると接続可能になった。（参照したサイト：[Reddit: Any ideas to successfully connect to an AWS Client VPN endpoint? Getting certificate verify failed](https://www.reddit.com/r/aws/comments/aeohf5/any_ideas_to_successfully_connect_to_an_aws/)）

# 所感
- 特別にVPN終端装置を用意しなくても手軽にVPN接続が可能になるのは便利。