AWS EC2のプライベートIPにOpenVPNで接続する【Windows Server】

# はじめに
業務でクラウド(Oracle Cloud Infrastructure)を扱う機会があり、プライベートIPでインスタンスにアクセスするということを初めて経験した。インターネットに直接面していないプライベートIPにどうやってアクセスするんだろうという単純な疑問が湧いたので少し調べてみたところ、(他にも方法はありそうだが)VPNを用いればアクセスできそうだと分かったので実際に試してみた。

今回はある程度使い慣れたAWSのEC2でWindows Serverを立ち上げ、OpenVPNを用いたRDP接続を行った。
そんなに役立たない内容かもしれないが、備忘録の意味も込めて執筆する(IPフォワーディングの部分などかなり手間取ったので)

# 手順

### VPC、サブネット、IGWの作成

**1.「VPC」で検索 > 「VPC」をクリック > 「VPCを作成」をクリック**

適当なIPv4 CIDRを入力し、VPCを作成をクリックしてVPCを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/c788011a-87fe-71fe-847f-2262d3c740bd.png)


**2.「サブネット」 > 「サブネットを作成」をクリック**

作成したVPC IDを選択する。
こだわりがなければプレースホルダー通りに「IPv4 サブネット CIDRブロック」を入力

**3.VPCのダッシュボードの左側の「インターネットゲートウェイ」をクリック**

作成画面に移動し、名前を付けて作成
その後、作成したインターネットゲートウェイの詳細画面で「アクション」をクリックし、「VPCにアタッチ」で作成したVPCにインターネットゲートウェイをアタッチする。

**4.作成したVPC詳細画面の「メインルートテーブル」の詳細画面に遷移 > ルートテーブルの詳細画面に遷移**

(VPCからメインルートテーブルをクリックして遷移)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/27f50112-a8fa-db2a-f5ae-d9ba645afd37.png)


(ルートテーブルの詳細画面)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/594ab2dd-00e6-835b-e9b5-a0f0aee75170.png)


「ルートを編集」をクリック > 「ルートを追加」 > 0.0.0.0/0を送信先として、作成したインターネットゲートウェイを追加し、「変更を保存」

### EC2インスタンスの作成

(この辺りは個人に依るところが多いと思うが、筆者の例を挙げる)
「EC2」で検索 > 「インスタンスを起動」をクリック

**1.アプリケーションおよびOSイメージ(Amazon マシンイメージ)**

今回はWinsows Serverを利用するので、「その他のAMIを閲覧する」を選択。「Microsoft Windows Server 2019 Base」を選択。(OSのライセンス料はインスタンスの利用料に含まれるらしい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/a1a3ad8f-323c-1dfd-7ef4-2632375cf712.png)


**2.インスタンスタイプ**

今回は「t2.micro」を選択

**3.キーペア (ログイン)**

リモートデスクトップによるWindows Serverへのログイン時に使用
「新しいキーペアの作成」をクリック
RSAと.pemを選択し、「キーペアを作成」をクリック。
「キーペア名」に作成したものを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/74db4dfc-8b45-96ff-ff8d-bc0b37a7298a.png)


**4.ネットワーク設定**

「編集」をクリック。
「VPC」「サブネット」に先ほど作成したものを割り当てる。
「パブリックIPの自動割り当て」を有効化。(OpenVPN有効化のために最初だけパブリック)
「セキュリティグループを作成」を選択。
「インバウンドセキュリティグループのルールを設定」で自宅からのRDP (Remote Desktop Protocol)とOpenVPN用のUDP接続を許可。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/ce0ab735-1c58-3263-19b5-704ba59b0de3.png)


**5.概要 (画面右側)**

「インスタンスを起動」をクリック
起動後、インスタンス一覧の画面に戻って、インスタンスが作成されていることを確認

### インスタンスへのRDP接続

**1.作成したインスタンスの「インスタンスID」をクリックしてインスタンスの詳細画面を開き、右上の「接続」をクリック**

**2.「RDPクライアント」タブを開き、「パスワードを取得」をクリック**

「プライベートキーファイルのアップロード」から、先ほど作成したキー(.pem)をアップロードし、「パスワードを復号化」
そうすると、**画面下側の「パスワード」にWindows ServerへのRDP接続(ログイン)時に使うパスワードが表示されるので、メモしておく**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/5934165b-8c88-e6a4-a25b-b64ffd208294.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/a0e915a1-6a15-130c-5cbe-1a87c3c07247.png)



**3.「リモートデスクトップファイルのダウンロード」から.rdpファイルをダウンロードし、それを実行する**

接続時に求められるパスワードは先ほどメモしたものを用いる

### OpenVPNのセットアップ (Windows Server側)

**1.OpenVPNのインストール**

OpenVPN.jpのページを開き、64ビット版.msiファイルをインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/76274f00-e43c-b251-7958-61b77370f828.png)


インストールしたら実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/1dc268c1-1127-3da1-2240-c41e5a3a3ffb.png)


ここで、**「Install Now」でなく、「Customize」をクリックし、下記のようにOpenSSLのインストールを指定する**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/1eae8bbc-e8f1-f4b2-9f84-2796b2a28319.png)


その後右下のInstall Nowをクリック

**2.証明書などのセットアップ**

C:\Program Files\OpenVPN\easy-rsa\EasyRSA-Start.bat
を管理者権限で実行すると、コマンドプロンプトが開かれる。
その後、以下のコマンドを一行ずつ実行し、証明書とキーを生成する。

```
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
./easyrsa gen-dh
```

パスフレーズを求められたり、色んな名前を求められたりするが、そこはよしなに

生成が終わったら、
C:\Program Files\OpenVPN\config
に”ca.crt”、”server.crt”、”server.key”、”dh.pem”を入れる。またconfigフォルダ内で”server.ovpn”という設定ファイルを作成し、以下のように記述する。

```
port 1194
proto udp4
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher AES-256-CBC
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 5
push "route 10.0.0.0 255.255.255.0"
```



自身の環境や設定に合わせる
(pushはEC2インスタンスのプライベートIPへのルーティングになるようにする)

### OpenVPNのセットアップ (クライアント)

**1.OpenVPNのインストール**

Windows Serverと同様にOpenVPN.jpからインストールする。

**2.証明書などのセットアップ**

C:\Program Files\OpenVPN\config
に、Windows Serverで作成した”ca.crt”、”client.crt”、”client.key”を入れる。
また下記のような”client.ovpn”を作成し、これもconfigに入れる

```
client
dev tun
proto udp4
remote {EC2インスタンスのパブリックIP} 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher AES-256-CBC
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
verb 3
push "redirect-gateway def1"
```

### OpenVPNの接続

**1.Windows Serverの1194ポートを解放**

「コントロールパネル」を開き、「Windows Defender ファイヤーウォール」の詳細設定ページを開く。
「入力規則」> 右側の「新しい規則」を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/15f6689c-aed5-86a4-3317-b9f8ad27a03b.png)


「ポート」 > 「UDP, 特定のローカルポート(1194)」 > 「接続を許可する」 > 全てにチェック > 名前を付けて「完了」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/bcbd326a-e703-8b6b-1819-8a9817e60964.png)


**2.OpenVPNの接続を開始**

画面右下の三角マークからOpenVPNのアイコンを右クリックし、接続を開始
この操作を、サーバー側とクライアント側の双方で実施する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/9bbb80d1-8da4-4147-3e7e-ca9d7b8891d1.png)


### プライベートIPへのアクセス

**1. IPフォワーディングの有効化**

Windowsキーを押して「regedit」と入力し、レジストリエディタを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841947/80c325f0-b406-0b4b-9a79-96a64a1ad5eb.png)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
の階層まで行き、Parametersをクリック
「IPEnableRouter」をダブルクリックし、0から1に変更する
その後Windowsを再起動し、変更を反映させる

**2.プライベートIPを用いたRDP接続**

リモートデスクトップを開き、プライベートIPを入力するとインスタンスに接続できた


# おわりに
実際に使えるようにしていくにはセキュリティ面などをもっと詰めて考える必要がありそうだが、とりあえずプライベートIPにアクセスするという目的を達成できてよかった