前書
OpenVPNサーバーをPublic Subnet配置し、そして直接Public IPを経由することで、接続するのが一般的なやり方だと考えられます。
ただし、本番環境では、Public IPを安易に公開することは、みなさんは控えたいですよね。
そこで、OpenVPNサーバーをPrivate Subentに配置し、つまりPublic IPを持たせず、ALBを前に置いておき、そしてNLB経由で実際クライアント側と接続することを考えました。
構成図
簡単に構成図を書きました。
- user -> ALB のアクセスは、HTTPS通信です。ただし、
/admin/
パスに対してはIP制御をかけています。 - NLB -> User のアクセスは、UDP1194とTCP443を経由しています。
- ACMとRoute53を用いて、ALBとNLBにSSL証明書の発行とドメインの関連付けをします。
1.OpenVPNサーバーの構築
詳細OpenVPNの構築手順はここで省きますが、以下公式ドキュメントをご覧ください。
ちなみに私はAmazonLinux2を使って構築していました。
なお、EC2用のセキュリティグループは以下のように設定します。
2.ACMでSSL証明書をリクエスト(Route53にドメインがあることが前提)
今回ALBで利用するSSL証明書をvpn-alb-01.xxxxxxx
にして、作成しました。
NLB用のSSL証明書をvpn-nlb-01.xxxxxxx
にして、リクエストする
証明書をリクエスト成功したら、それぞれRoute53にレコードの追加を忘れずに行うこと。
3. ALBを作成する
まずALB用のセキュリティグループを作成する
HTTPS 443 を開放する
ALBのバックエンドとしてOpenVPNサーバーがALBのターゲットとなるため、ターゲットグループを作成し、OpenVPNサーバーをターゲットに入れてください。
なお、Health CheckはHTTPSの443ポートです。
リスナーをHTTPSにし、上記作成したtarget groupを選択します。
4.ALB用のドメインレコードをRoute53で作成
ALBが作成されたら、DNS名をRoute53のドメインにCNAMEとして追加すること
5.NLBを作成する
NLB用のターゲットグループを2つ作成します。
6.ALB用のドメインレコードをRoute53で作成
NLBが作成されたら、DNS名をRoute53のドメインにCNAMEとして追加すること
7.ALBの/admin/パスに対するIP制御
パス/admin/
へのアクセスは、特定のIPしかできないように絞ること。
なぜそうするかというと、パス/admin/
には、OpenVPNの管理画面であり、それをIP絞ってのアクセスとする。
設定方法はリスナーに以下のルールを設定すれば良いです。
8.OpenVPNサーバーの設定
ログインできたら、「Go to Admin Panel」を押下します。
管理画面が入れたら、「CONFIGURATION」->「NETWORK SETTINGS」->「Hostname or IP Address」に、NLBのドメインURLを入れ替えてください
なお、テストとして、あらかじめALBのリスナールールの/admin/
パスに定義していないIPからアクセスすると、403エラーが確認できました。
9.VPN接続確認
「OpenVPN Connect」ツールから、ALBのドメインURLを入れてください
本記事はどなたの参考になれば嬉しいです。
参考
以下の記事を参考しました。