AWS Client VPN を用いて固定グローバル IP を一時的に使えるようにする

# はじめに
## 対象読者
* 固定グローバル IP を一時的に使えるようにしたい
* あまり月額固定費を大きくかけたくない
* AWS を用いることに抵抗がない

## 前書き
* 本記事は、以下の先達記事から多大な影響を受けています

https://qiita.com/kskinaba/items/f7d848a5621de19e1db4

* ただし進めていて苦戦したところがいくつかありましたので、自分なりに再構成し直してみた次第です


# 事前準備
## 相互認証キー生成
* 後で必要となるので、最初に OpenVPN でキーを生成しておきます
* 以下のコマンドは Ubuntu で実行していますが、ご自身の環境にあわせておこなってください

```
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1.domain.tld nopass
```

* 生成過程で `name` の入力を求められますが、任意の識別しやすい名前を入力しておくとよいでしょう
* キーは以下のように出力されます

| サーバ証明書 (server)  |  |
| --- | --- |
| 証明書本文 | `~/easy-rsa/easyrsa3/pki/issued/server.crt` |
| 証明書のプライベートキー | `~/easy-rsa/easyrsa3/pki/private/server.key` |
| 証明書チェーン | `~/easy-rsa/easyrsa3/pki/ca.crt` |

| クライアント証明書 (client1.domain.tld)  |  |
| --- | --- |
| 証明書本文 | `~/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 の管理画面 URL は以下です
  * https://ap-northeast-1.console.aws.amazon.com/acm/home
* ここに、先ほど生成した証明書 `server`, `client1.domain.tld` それぞれをインポートします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/81f1cd20-5eb6-4bbf-e9fc-e863b4ea342b.png)

* インポートが完了すると以下のように表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/bdebca4c-1200-555e-7799-690955bcbe03.png)

## 予告
* 以下の二つのファイルはまた後で使うことになります
  * `~/easy-rsa/easyrsa3/pki/issued/client1.domain.tld.crt`
  * `~/easy-rsa/easyrsa3/pki/private/client1.domain.tld.key`


# 使えるようになるまでの設定
## VPC
* 最初に VPC を新しく作成するか、既存の VPC を使うか決めます
* まだ VPC を作ったことがなかったら新規作成を進めます
* 管理画面 URL は以下
  * https://ap-northeast-1.console.aws.amazon.com/vpc/
* 以下のように作成できていれば大丈夫です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8e038053-06de-8d86-aa46-e24128d65998.png)


## サブネット
* VPC の用意ができたら、サブネットを新しく作成します
* VPC の `IPv4 CIDR` が定められているので、それに従って設定をおこないましょう
* たとえば以下画像のように VPC の `IPv4 CIDR` が `172.31.0.0/16`であれば、サブネットの `IPv4 CIDR` を `172.31.100.0/24` などとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b6405e76-6bb7-8f49-76d3-95fa931e2cdd.png)

* `Name` キーに対しては `for-vpn` などと入力しておくと、分かりやすくなってオススメです


## Elasic IP アドレス
* 続いてグローバル IP アドレスの発行をします
* ここで発行されたものが、以後永続的に使用される固定グローバル IP となります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c6387150-ac95-00e1-1451-a070d55b3156.png)

* ここでも同様に `Name` キーに対しては `for-vpn` などと入力しておくと、分かりやすくなってオススメです
* 割り当てが完了すると、一覧で以下のように表示されます。以下では二つの Elasitc IP がある場合ですが、`for-vpn` という名前をつけておいたら分かりやすくなるというのが一目瞭然ですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b17c244d-caee-cae8-90e1-b1742275a954.png)


## NAT ゲートウェイ
* そうしたら NAT ゲートウェイで、上記で用意したサブネットと Elasitc IP アドレスとを関連づけます
* ここでも、プルダウンで選択するときに、先に名前を設定しておくことにより `(for-vpn)` と表示されるようになるので、分かりやすくて楽です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1e92e3ac-04be-d06c-000b-b9531a383dce.png)

* NAT ゲートウェイを作成すると、一覧に以下のように表示されます
* 作成直後は状態が `Pending` になっていますが、時間が経過すると `Available` に変わります
  * 特に `Available` に変わるまで待つ必要はありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7a6e1748-a2f0-c386-d408-67ca8c255199.png)

## ルートテーブル
* どんどん進めていきましょう。次にルートテーブルの作成です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/04c11f96-7074-2ab7-8846-f9c29465f81e.png)

* 以下のように、ルートを一つ追加して、送信先 `0.0.0.0/0` で NAT ゲートウェイと関連づけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7883a228-c7f1-fd64-e5a1-034c85a054cb.png)

* 完了すると以下のように表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/6819e7a2-d1f1-0e9c-d2c6-f98ab14786d0.png)

## プライベートサブネットの作成
* もう一度サブネットの作成をおこないます
* 今度はプライベート用として `172.16.101.0/24` として第三オクテットには `101` を宛てました
* 名前もそれとわかるように `for-vpn-private` としておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0719b1f1-6ef3-b3d7-08e9-6ea758b72503.png)

## プライベートサブネットとルートテーブルの関連づけ
* このプライベートサブネットと、ルートテーブルを関連づけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7a00543a-1671-ab77-0dcd-57e33e2de346.png)

## Client VPN エンドポイントの作成
* いよいよ終端が見えてきました。あとちょっとです
* Client VPN エンドポイントを以下のように作成します
  * 任意の識別しやすい名前で
  * `172.32.0.0/22` のように第二オクテットを `32` として、今までの `31` とは別のものにします
  * `サーバー証明書 ARN`, `クライアント証明書 ARN` については、事前準備でおこなった ACM に登録してあるものを選びます
    * 認証オプションは `相互認証を使用` で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2af65e69-2e22-e334-95ac-c32cc7f5885f.png)

* また DNS サーバについて設定しておくことで名前解決できるようになります。所定のものがあればそちらを、もし特になければ `1.1.1.1` と `8.8.8.8` あたりを設定しておけばよいでしょう
  * 言わずと知れた Cloudflare と Google の DNS です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ca4d9873-1513-6916-26f1-dc95f6563590.png)

https://1.1.1.1/


## Client VPN エンドポイントを NAT ゲートウェイへ関連づけ
* さらにこれを NAT ゲートウェイへ関連づけます。下部のタブ内にあります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f237a301-5cb2-5df4-f383-071503fc0a15.png)

* 以下のように `for-vpn-private` と関連づけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/fb029a1c-c1f0-b87b-3e55-4561e34b2de3.png)

## Client VPN エンドポイントのルートテーブルに追加
* そして右側にある別タブ `ルートテーブル` を開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b45fabf5-9b6a-912f-ded1-afe2f68386c2.png)

* ここに送信先 `0.0.0.0/0` のものを一つ追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0e33757f-fba9-4dc2-a7a6-c442a06d3888.png)

* 完了すると以下のようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/99569845-45e1-ac48-f69c-747964018dff.png)

## Client VPN エンドポイントに承認ルール ＝ 認証ルール 追加
* さらに左側にある別タブ `承認ルール` を開きます
* ボタンには `認証ルールを追加` とありますが、訳語が混じっているだけのようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f891375f-6a0a-9d80-ff8e-724ee9751a86.png)

* 先ほど追加した `0.0.0.0/0` を許可するように設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ba8aa7c9-a9ab-dee5-25a6-9ec9908c9dd7.png)

* ルールを追加してしばらく待つと `Active` になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e5a1ac1e-ecb6-9208-911d-6cb3fae54d69.png)

* 長かったですが、これで準備完了です！

## クライアント VPN エンドポイント設定ファイルのダウンロード
* クライアント VPN エンドポイント の管理画面で右上の方にある `クライアント設定をダウンロード` ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/561c4bb5-d947-b3d8-7d47-ccb91d71edbb.png)

* モーダルでダイアログが表示されるので、そのままダウンロードすると、ローカルには `ovpn` 形式のファイルが落ちてきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9896166a-354b-c778-d820-cfa6323bac6d.png)

## ダウンロードした設定ファイルの編集
* ダウンロードした `ovpn` ファイルを任意のテキストエディタで開いてください
* すると以下のような内容が表示されるかと思います

```
client
dev tun
proto udp
remote example.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
~
-----END CERTIFICATE-----
</ca>

reneg-sec 0
verify-x509-name server name
```

* 上記の `verb 3` と `<ca>` との間の行に追記が必要です
* 冒頭で準備した `~/easy-rsa/easyrsa3/pki/issued/client1.domain.tld.crt` ファイルから `<cert>~</cert>` をコピペしてきます
* また `~/easy-rsa/easyrsa3/pki/private/client1.domain.tld.key` からも `<key>~</key>` をコピペしてきます

```
client
dev tun
proto udp
remote example.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
verb 3

<cert>
-----BEGIN CERTIFICATE-----
~
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
~
-----END PRIVATE KEY-----
</key>

<ca>
-----BEGIN CERTIFICATE-----
~
-----END CERTIFICATE-----
</ca>

reneg-sec 0
verify-x509-name server name
```

* 最終的には上記のようになります
* これで本当に設定は完了しました！


# 接続
## VPN クライアントソフトの用意
* いざ接続となりますが、クライアントソフトは AWS が公式で用意している AWS Client VPN を用いることにします

https://aws.amazon.com/jp/vpn/client-vpn-download/

* OS に合わせたインストーラを実行して進めるだけです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/297b812f-db15-e4a2-aa8b-7b870609aa30.png)

* クライアントを起動すると以下のようになっています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/32f11805-a014-8595-84c3-122e0285979c.png)

* 任意の名前でプロファイルを追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/78fee229-c7e3-c6f0-102c-c5eaa353bfd1.png)

* ファイルは先ほど編集を完了させた `opvn` を指定しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7a3c9933-f6f3-a1d0-1703-789f603b083c.png)

## 接続
* あとは接続ボタンを押せば完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5a54cb24-b62c-5bd1-787b-80d0142d94c6.png)

## 確認
* たとえば以下の CMAN さんにアクセスして、IP アドレスが正しく変わっているかどうか確認できれば大丈夫です。問題なければ、設定した Elasitc IP が表示されているはずです

https://www.cman.jp/network/support/go_access.cgi

* お疲れ様でした！
* もし CMAN のサイト他、どの URL へアクセスしても何も表示されない！　という場合は、名前解決ができていない可能性があるので、DNS まわりの設定を見直してみてください
* なお、VPN クライアントソフトが `接続完了` と表示された後に `接続済み` に変化するまで、数秒時間がかかるので、アクセスできるようになるまで少しラグがあります

## `opvn` ファイルの配布にあたり
* なお組織内で働いている場合 `opvn` ファイルを同僚に配付する場面もあるかと思います
* 上記でお分かりいただけると思いますが、この `opvn` ファイルさえ保有していれば、誰でも接続できてしまうということになるわけですから、取り扱いは厳重注意としましょう


# 節約のための設定解除
## 要注意点：この状態を保持しておくと月額 2 万円超
* ただし、以下の先達記事でも `セットアップした状態だと、維持費は月150ドル？！` と書かれているとおり、このままだと維持費がかさんでしまいます

https://qiita.com/kskinaba/items/f7d848a5621de19e1db4#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%81%9F%E7%8A%B6%E6%85%8B%E3%81%A0%E3%81%A8%E7%B6%AD%E6%8C%81%E8%B2%BB%E3%81%AF%E6%9C%88150%E3%83%89%E3%83%AB

* よって、同記事でも推奨されているように、以下の対応をおこない、使わない時は最小限の維持費で待機状態にしておくようにします

## 前提の確認
* なお、節約のための設定解除の際、以下の点が気になるかと思います
  * 固定グローバル IP が変更とならないか
  * `opvn` 設定ファイルに変更の必要が生じないか
* この二点については、特に心配する必要がありません。変更されませんし、変更の必要も生じません

# NAT ゲートウェイを削除
* まず NAT ゲートウェイですが、こちらは解除でなく削除します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/93ac6c4e-6c85-9d38-d239-9c7efb6d8a4f.png)

* 削除実行後、しばらくすると一覧から表示が消えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/54294da2-9016-1821-03f3-e505766610eb.png)

## Client VPN のサブネットとの関連付けを解除
* こちらは解除です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/4aaaa8b4-a008-c8d5-a8e6-79ce278d7594.png)

* 解除実行後、しばらくすると一覧から表示が消えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/58949480-1215-3907-e831-57915e900b3e.png)

## ルートテーブルの関連付けを確認
* NAT ゲートウェイが削除されたことによって、ルートテーブルにおける関連付けが `ブラックホール` となっていることが確認できます
* これについては、この時点でどうこうする必要もないのですが、気持ち悪ければ削除するもよしでしょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1b5291c4-cd22-e2d6-71e2-876a790face5.png)

* これで設定解除については以上です！　維持費が節約されるようになりました


# 再度使えるようにするための手順
## NAT ゲートウェイを作成
* それではここからもう一度、再度使えるようにするにはどうしたらよいか、手順を追ってみましょう
* まず NAT ゲートウェイを作成しますが、初回時におこなった通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1e92e3ac-04be-d06c-000b-b9531a383dce.png)

* 作成後の一覧画面において `プライマリパブリック IP` が、以前に設定した通りの Elasitc IP になっていることを見ておきましょう
  * `状態` のちょっと右の方に表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7a6e1748-a2f0-c386-d408-67ca8c255199.png)

## Client VPN のサブネットとの関連付けをおこなう
* こちらも同じく、初回時におこなった通りの設定です
* `for-vpn-private` と関連づけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/fb029a1c-c1f0-b87b-3e55-4561e34b2de3.png)

* 続けて、ルートテーブル追加作成
* 送信先 `0.0.0.0/0` のものを一つ追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0e33757f-fba9-4dc2-a7a6-c442a06d3888.png)

## ルートテーブルの再設定
* ブラックホール状態になってしまっているので、再設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7883a228-c7f1-fd64-e5a1-034c85a054cb.png)

* 以下のようにブラックホール状態がアクティブに変化していれば大丈夫です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/6819e7a2-d1f1-0e9c-d2c6-f98ab14786d0.png)

## 接続
* クライアントソフトを立ち上げて接続ボタンを押すと、接続されるはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5a54cb24-b62c-5bd1-787b-80d0142d94c6.png)

* ここでもし接続できなかったら、再設定してきた管理画面をもう一度見て回ってみてください

## 確認
* さらにまた CMAN さんにアクセスして、IP アドレスが正しく変わっているかどうか確認できれば大丈夫です。問題なければ、設定した Elasitc IP が表示されているはずです

https://www.cman.jp/network/support/go_access.cgi

* お疲れ様でした！


# おわりに
## 雑感
* 結構、手順が多くて大変ですね！
* ただ、維持費が月額数ドルなのであれば、初期設定を一度しておくことで、いざという時の固定グローバル IP を利用できるという逃げ道を持っておくのは悪くないのではないでしょうか
* なお Google Cloud のほうには Cloud VPN というサービスがあるものの、これはクライアント端末からの接続ができる類のものではないのです。残念

https://cloud.google.com/network-connectivity/docs/vpn/concepts/overview?hl=ja

## 参考記事
https://qiita.com/kskinaba/items/f7d848a5621de19e1db4