OCI:OpenVPNによるSSL-VPN接続手順

# はじめに
この記事はOracle Cloud Infrastructure(OCI)上に配備したComputeに対し、OpenVPNを利用したSSL-VPN接続をする手順です。
OCIにはIPSec VPN接続もありますが、ルーターが必要なので個人でセキュアに接続したい場合は、SSL-VPN接続があります。
OpenVPNを利用すれば、SSHポート転送によるPrivate Subnet上のComputeにアクセスする方法と異なり、アクセスするユーザーやログの管理、秘密鍵の使いまわしをしなくてすみます。

# 構成図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/ce29f6e6-96ab-6a10-79fc-f4cd9ed60f8a.jpeg" width=60%>

- 前提
    - 東京リージョンを利用
    - 利用者はWindows10を利用
- 補足
    - OpenVPNのAccess Serverはパブリックサブネット上に配備し、パブリックIPアドレスを割り当てます。

# 1.VCN作成
OpenVPN ServerとアクセスしたいTarget Serverを配備するVCNを構築します。
VCNの作成には、ネットワーキング・ソリューションの作成を利用します。

Webコンソール右上のハンバーガーボタンからネットワーキングをクリックすると、ネットワーキングの画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/5fcc4107-8678-3697-ee96-c241848357ef.jpeg" width=60%>

インターネット接続性を持つVCNの作成のVCNウィザードの起動をクリックします。
※もう一つのインターネット接続性とVPN接続性を持つVCNの作成は、IPSec VPN接続の場合に利用します。

クリック後、以下の項目を設定し確認後、作成をクリックするとVCNと必要なリソースが作成されます。

- VCN名
- 作成先のコンパートメントの選択(あらかじめ作成しておいてください。)
- Public SubnetのCIDR
- Private SubnetのCIDR
- DNS解決(デフォルトチェック済みのまま)

OpenVpenのAcceess Serverへアクセスするためには、セキュリティリスト、または、セキュリティグループに追加のツールを設定する必要があります。
今回は、セキュリティリストに設定します。
Webコンソールにて、作成したVCNのPublic Subnetのセキュリティリスト画面を開き、イングレスルールの追加を行います。
追加は、イングレスルールの下3つです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/85283312-271d-a923-a04c-13e1f40c482f.jpeg" width=60%>

- TCPイングレスルール
    - Port 943：OpenVPNのAccess ServerのAdmin/Client Portalへのアクセス
    - Port 443：OpenVPN VPN tunnel用
- UDPイングレスルール
    - Port 1194：OpenVPN VPN tunnel用

接続元のCIDRは0.0.0.0/0としていますが、構築する環境にあわせて適宜変更してください。

# 1.OpenVPN Serverの初期設定
Webコンソールにて、マーケットプレイス画面を表示します。
画面上部にて検索できるので、OpenVPNと入力するとヒットします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/cedb39b2-437c-0f72-d292-c5a83f5217d3.jpeg" width=60%>

無料版とBYOL版の2つありますが、無料版を選択します。
無料版は、2つの無料VPN接続が可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/56088401-b7c7-dde1-7529-97f0679fbaeb.jpeg" width=60%>

この画面の使用手順には、[Quick Start Guide](https://openvpn.net/oracle-quick-start-guide/)がリンクで記載されています。
リンク先は英語ですが、手順が掲載されています。
そのため、本記事はこの手順を実際にやってみて日本語で補足します。

オラクルとパートナーの各利用規約を確認後、同意するにチェックをいれインスタンスの起動をクリックすると、コンピュート・インスタンスの作成の画面に遷移します。

必要な項目を設定後、作成をクリックします。

- コンピュート・インスタンス名：OpenVPN Access Server
- ネットワーキングの構成：
    - サブネット：Public Subnet
    - パブリックIPアドレスの割り当て：選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/27ecfc5e-38b5-063a-7002-aacddad6ff04.jpeg" width=60%>

作成後、vNICの設定を変更します。
デフォルトでは、すべてのvNICはネットワーク・トラフィックの送信元/宛先のチェックを行います。
今回は、vNICがトラフィックをプライベートサブネットに配備したComputeなどに転送する必要があるため、チェックいれて無効にします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/a38c60a4-a25c-fa09-ee06-6825422e2a05.jpeg" width=60%>

# 2.OpenVPNの設定
コンピュート・インスタンスが起動したら、teratermによりSSH接続します。
OCIが提供しているOracle Linuxでは、ログインユーザーが「opc」ですが、OpenVpnのAccess Serverでは、「openvpnas」です。

ログイン後、OpenVPN Access serverセットアップウィザードが自動的に実行されます。
このウィザードを再度実行したい場合は、`$sudo ovpn-init`コマンドを実行します。

EULAを読み、同意を示すためにyesを入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/b0d4ea21-36a6-89dd-98b7-910d83c8f61c.jpeg" width=60%>

次に、プライマリノードかを聞かれるので、yesを入力します。
スタンバイノードの場合は、noを入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/5f958bc0-d68f-b829-3522-7925e63898b7.jpeg" width=60%>

管理者WebUIで使用するネットワークインターフェイスとIPアドレスを指定します。
`(2) ens3: 10.0.0.2`は配備したOpenVPN Access ServerのPrivate IPアドレスです。
(2)を指定します。
このオプションは管理者WebUIのウィザード設定後、変更可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/c9884001-84ac-b672-a33e-be1dbdcd0f0a.jpeg" width=60%>

管理者WebUIで利用するポート番号はデフォルト943のままとします。
OpenVPNデーモンのTCPポート番号もデフォルト443のままとします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/adb04f77-be4b-622b-178d-71e493b7b86b.jpeg" width=60%>

クライアントのトラフィックは、デフォルトでVPNを経由してルーティングされるべきかについては、デフォルトyesのままとします。
デフォルトyesの場合、クライアントが接続している間にすべてVPN経由となります。
クライアントDNS トラフィックは、デフォルトで VPNを経由してルーティングされるべきかについては、デフォルトyesのままとします。
1つ前の質問でyesを選択した場合は、ここでyes/noどちらを設定したにかかわらず、すべてのトラフィックがVPN経由でルーティングされます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/76de3790-bf8c-fc1d-7d59-01aaede0adff.jpeg" width=60%>

内部DB経由でローカル認証を使用するかについては、デフォルトyesのままとします。
このオプションをオンにすると、管理者WebUI 内でユーザー名とパスワードを定義および/または変更することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/0652ac07-6dd6-92d9-1c9f-b041b57795dd.jpeg" width=60%>

プライベートサブネットはデフォルトでクライアントからアクセスできるようにすべきかについては、デフォルトyesのままとします。
このオプションは、OpenVPNアクセスサーバーのデフォルトのセキュリティ設定を定義します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/e24501fd-9f78-396a-6575-e7642a596483.jpeg" width=60%>

管理者UI に「openvpn」としてログインするかについては、デフォルトのままとします。
OpenVPN-ASライセンスキーを指定してください(または空白のままにして後で指定してください)については、BYOLではないので、空白のままEnterをおします。
OpenVPN Access Server には、テスト用に2つの無料ライセンスが含まれています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/70870212-fcd7-ac56-8387-40ed7373b45b.jpeg" width=60%>

セットアップウィザードを完了した後、管理者WebUIにアクセスして VPN の設定をすることができます。
プライベートIP アドレスの部分を割り当てられた外部のパブリックIPアドレスに置き換えてアクセスします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/e891cba8-f1d5-0b4f-ab62-c7fad2dcc1d5.jpeg" width=60%>

セットアップウィザードで「Do you wish to log in the Admin UI as "openvpn"? オプションにyesを選択した場合、このアカウントのパスワードを定義する必要があります。
`$sudo passwd openvpn`を実行しパスワードを設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/11154d08-c209-048b-1807-241e8f7f911c.jpeg" width=60%>

# 3.管理者WebUI設定
### ネットワーク設定
セットアップウィザード完了後に表示される管理者UIのURLのプライベートIPアドレスをパブリックIPアドレスに置き換えてアクセスします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/63b283aa-6537-261d-6317-dc19d48ef655.jpeg" width=60%>

- Username：openvpn
- Password：`$sudo passwd openvpn`で設定したパスワード

使用許諾を確認後、Agreeをクリックすると、以下の画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/7aeee500-0f61-faf8-5b53-6c63fbec4898.jpeg" width=60%>

左側のメニューにて、CONFIGURATION>Network Settingをクリックします。
Hostname or IP Addressの値をプライベートIPアドレスからパブリックIPアドレスに設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/6f3521d7-1073-33c0-4e39-ca806cad5852.jpeg" width=60%>

画面下のSave Settingsをクリックし、Update Runnning Serverをクリックします。

次にVPN Settingをクリックし、RoutingにプライベートサブネットのCIDRを追加します。
ここで、Should client Internet traffic be routed through the VPN?の設定がYesになっていることも確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/62f51898-7467-f370-1e43-53887efebc6d.jpeg" width=60%>

※DNSの設定が必要かは確認後追加

Advanced VPNをクリックし、Should clients be able to communicate with each other on the VPN IP Network?の設定をYesに設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/4097afbb-2d99-cc51-6c5c-574fc93e60d3.jpeg" width=60%>

画面下のSave Settingsをクリックし、Update Runnning Serverをクリックします。

### User設定
管理者WebUIの左側のUSER MANAGEMENTのUser Permissionsをクリックします。
デフォルトは、Admin権限をもつopenvpnユーザーのみです。
通常時にプライベートサブネットに配備したComputeへの接続で利用するためのユーザーを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/e35ce8bc-e4cc-02be-ac0e-7b7ea103ffbd.jpeg" width=60%>

New Usernameにユーザー名を設定し、More Settingsをクリックするとパスワードなどを設定することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/fa81b1e1-bb97-c757-d02e-114b8833e8c9.jpeg" width=60%>

画面下のSave Settingsをクリックし、Update Runnning Serverをクリックします。
Usernameに作成したユーザー名が表示されていれば追加されています。

# 4.クライアントUI設定
セットアップウィザード完了後に表示されるクライアントUIのURLのプライベートIPアドレスをパブリックIPアドレスに置き換えてアクセスします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/aaaddae5-0375-c6e8-3677-b06d50604843.jpeg" width=60%>

- Username：管理者WebUIで作成したユーザー名
- Password：管理者WebUIで作成したユーザーに設定したパスワード

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/5234f379-0e31-c10c-3cb5-74fa471e981e.jpeg" width=60%>

Windowsのクライアントをダウンロードし、インストールします。
インストール後、OpenVPN Connectを起動すると以下の画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/2105359e-c3ba-9ffd-f84b-72031044aafe.jpeg" width=60%>

ボタンをクリックするとユーザー名とパスワードを聞かれるので、管理者WebUIで作成したユーザー情報を入力します。
認証が通るとCONNECTEDとなります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/e2207c2d-a534-c350-b2f4-030eea69431a.jpeg" width=60%>

接続後は、他のWebページなどはアクセスできません。

### 接続テスト
プライベートサブネットに任意のComputeを配備します。
今回はOracle Linuxを配備しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/90c5c405-65c4-d4a1-c96d-ae15993fc2ec.jpeg" width=60%>

OpenVPNを接続した状態で、teratermでアクセスします。
- ホスト：10.0.1.2
- ユーザー名：opc
- 秘密鍵：配備時に設定した公開鍵に紐づく秘密鍵
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641052/13092938-460a-4157-6a97-342848486ace.jpeg" width=60%>

Windows端末からpingで確認したり、Windows Serverを配備したりする場合は、プライベートサブネットのセキュリティリストにpingやRDPを許可する必要があります。