【AWS】OpenVPNサーバーをPrivate Subnetに配置し、NATとALBとNLBで全体構成を試みました

# 前書
OpenVPNサーバーをPublic Subnet配置し、そして直接Public IPを経由することで、接続するのが一般的なやり方だと考えられます。
ただし、本番環境では、Public IPを安易に公開することは、みなさんは控えたいですよね。
そこで、OpenVPNサーバーをPrivate Subentに配置し、つまりPublic IPを持たせず、ALBを前に置いておき、そしてNLB経由で実際クライアント側と接続することを考えました。

# 構成図
簡単に構成図を書きました。
1. user -> ALB のアクセスは、HTTPS通信です。ただし、``/admin/``パスに対してはIP制御をかけています。
1. NLB -> User のアクセスは、UDP1194とTCP443を経由しています。
1. ACMとRoute53を用いて、ALBとNLBにSSL証明書の発行とドメインの関連付けをします。

![vpn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/bd1fa536-3038-6776-aa47-1fab6f7777ea.png)


# １．OpenVPNサーバーの構築
詳細OpenVPNの構築手順はここで省きますが、以下公式ドキュメントをご覧ください。

https://openvpn.net

ちなみに私はAmazonLinux2を使って構築していました。
なお、EC2用のセキュリティグループは以下のように設定します。
![截屏2023-06-06 12.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c61f3397-94a5-cc07-d1af-4dd0977360f6.png)


# ２．ACMでSSL証明書をリクエスト（Route53にドメインがあることが前提）
今回ALBで利用するSSL証明書を``vpn-alb-01.xxxxxxx``にして、作成しました。
![截屏2023-06-04 0.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/00918cd7-06bf-c9e5-08f7-202cd39ddea4.png)

NLB用のSSL証明書を``vpn-nlb-01.xxxxxxx``にして、リクエストする
![截屏2023-06-04 0.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/7020971e-0728-a726-b3ac-6e8e86a5857d.png)

証明書をリクエスト成功したら、それぞれRoute53にレコードの追加を忘れずに行うこと。
![截屏2023-06-06 10.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/043c27df-8030-c855-5d61-821f2c3de2b1.png)


# 3. ALBを作成する
まずALB用のセキュリティグループを作成する
HTTPS 443 を開放する
![截屏2023-06-06 10.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/00a3e4e7-ee87-cac3-b5bb-d443defd7f4d.png)

ALBのバックエンドとしてOpenVPNサーバーがALBのターゲットとなるため、ターゲットグループを作成し、OpenVPNサーバーをターゲットに入れてください。
なお、Health CheckはHTTPSの443ポートです。
![截屏2023-06-04 0.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0fcdfc6d-0011-0a1c-19cf-f9c7090d20b2.png)

インターネット向けのALBを作成します。
![截屏2023-06-06 11.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/40e58ace-770c-c065-3a57-73d2161f0c55.png)

リスナーをHTTPSにし、上記作成したtarget groupを選択します。
![截屏2023-06-06 11.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/80b704c4-b0f5-c994-4bd8-8cbf06de764f.png)

ACMからALB用のSSL証明書を選択の上、作成します。
![截屏2023-06-06 11.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/caeacbef-f7ac-7c37-3d39-782218bfae4c.png)


# ４．ALB用のドメインレコードをRoute53で作成
ALBが作成されたら、DNS名をRoute53のドメインにCNAMEとして追加すること
![截屏2023-06-04 0.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6d55b451-ff19-f1cb-c1a5-f01fc4b5c204.png)

# ５．NLBを作成する
NLB用のターゲットグループを２つ作成します。
- TCP 443ポートのTarget Group
- UDP 1194ポートのTarget Group。なおここのヘルスチェックポートを22番ポートに変更すること
![截屏2023-06-06 11.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/7c590ef2-d583-7e51-cabc-a2c8813c4877.png)

インターネット向けのNLBを作成します。
![截屏2023-06-06 11.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/1ff98624-607b-89ba-a08c-12c689d2ecc5.png)

上記2ターゲットグループを選択します。
![截屏2023-06-06 11.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/a0fcda53-2cd1-4d74-3037-9e2c5d7eb2fb.png)

# ６．ALB用のドメインレコードをRoute53で作成
NLBが作成されたら、DNS名をRoute53のドメインにCNAMEとして追加すること
![截屏2023-06-06 11.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/710d6d2d-0602-e969-d5f1-6bf41afcfe10.png)

# ７．ALBの/admin/パスに対するIP制御
パス``/admin/``へのアクセスは、特定のIPしかできないように絞ること。
なぜそうするかというと、パス``/admin/``には、OpenVPNの管理画面であり、それをIP絞ってのアクセスとする。
設定方法はリスナーに以下のルールを設定すれば良いです。
![截屏2023-06-06 11.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/7b391455-04b4-592a-9ec0-ec97276b3c78.png)

# ８．OpenVPNサーバーの設定
ALBのドメインに対する接続します。
![截屏2023-06-06 12.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0cbd4c6d-36d3-f3a3-6011-a7f7f82d1b37.png)

ログインできたら、「Go to Admin Panel」を押下します。
![截屏2023-06-06 12.03.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/87f8dc41-4896-8585-2ed0-873bd8cf7291.png)

管理画面が入れたら、「CONFIGURATION」->「NETWORK SETTINGS」->「Hostname or IP Address」に、NLBのドメインURLを入れ替えてください
![截屏2023-06-06 12.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/66cc6e14-8e03-493a-25c1-edef4b38ba94.png)

なお、テストとして、あらかじめALBのリスナールールの``/admin/``パスに定義していないIPからアクセスすると、403エラーが確認できました。
![IMG_52AB40B15F47-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/86bfc33f-1a51-4995-c98e-d20616ef4eed.jpeg)

# ９．VPN接続確認
「OpenVPN Connect」ツールから、ALBのドメインURLを入れてください
![截屏2023-06-06 12.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c914cb28-e90a-628b-6203-c0020d8adc4c.png)

ログインIDとPWを入力の上、無事に接続できました。
![截屏2023-06-06 12.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/4630aec9-8678-7e31-36f3-b280047a171a.png)

本記事はどなたの参考になれば嬉しいです。

# 参考
以下の記事を参考しました。

https://medium.com/avmconsulting-blog/running-openvpn-server-with-alb-and-nlb-ca9ad4b88c82