AWSにOpenVPN[AmazonLinux]を構築(ユーザー & パスワード認証編)

# 1. 環境構成
環境はこんな感じ
![OpenVPN.png](https://qiita-image-store.s3.amazonaws.com/0/191445/ae63f09b-a87d-b41f-26a6-6242b37a4bec.png)

VPNでトンネルはって、プライベートサブネット上にいるEC2に接続する手順を下記に記載！！

## 1.1. VPCネットワーク
VPC CIDR：172.24.0.0/16
Public1：172.24.0.0/24
Public2：172.24.1.0/24
Private1：172.24.2.0/24
Private2：172.24.3.0/24

### 1.1.1. ルートテーブル
【Public】

| 送信先           | ターゲット               |
|:----------------|:----------------------|
| 172.24.0.0/16   | local                 |
| 0.0.0.0/0       | InternetGateway       |

【Private】

| 送信先           | ターゲット               |
|:----------------|:----------------------|
| 172.24.0.0/16   | local                 |

## 1.2. VPNサーバー
**AmazonLinux**
- PublicSubnetに配置
- EIP付与
- 送信元/送信先チェック False(OpenVPNをNATで構成する場合はTrueでもいい)

SG：Inbound TCP 0.0.0.0/443
今回はTCP 443で受け付けます

# 2. インストール手順
## 2.1. OpenVPNサーバー
AmazonLinux(OpenVPN)にSSHログイン

以下実施

```
yum --enablerepo=epel -y install openvpn openssl-devel lzo-devel pam-devel
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
rm -rf easy-rsa-master/
rm -f master.zip

# 認証局初期化
cd /etc/openvpn/easyrsa3/
./easyrsa init-pki
# CA証明書・秘密鍵作成
./easyrsa build-ca
cp pki/ca.crt /etc/openvpn

# サーバー証明書・秘密鍵作成(パスフレーズを2回入力)
./easyrsa build-server-full server nopass

cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/

# DH(Diffie Hellman)パラメータ作成(ちょっと時間かかる)
./easyrsa gen-dh
cp pki/dh.pem /etc/openvpn/

# 証明書廃止リスト作成
./easyrsa build-client-full dmy nopass
./easyrsa revoke dmy

rm -f /etc/openvpn/easyrsa3/pki/issued/dmy.crt
rm -rf /etc/openvpn/easyrsa3/pki/private/dmy.key
rm -rf /etc/openvpn/easyrsa3/pki/reqs/dmy.req

cp vars.example vars
```

varsファイル編集
`vi vars`

```vars
#set_var EASYRSA_CRL_DAYS       180
set_var EASYRSA_CRL_DAYS       3650
```

続き

```
./easyrsa gen-crl

cp /etc/openvpn/easyrsa3/pki/crl.pem /etc/openvpn/
chmod o+r /etc/openvpn/crl.pem
cd

openvpn --genkey --secret /etc/openvpn/ta.key
cp /usr/share/doc/openvpn-2.x.x/sample/sample-config-files/server.conf /etc/openvpn/
```

/etc/openvpn/server.confファイル編集

```server.conf
dev tun
#dh dh2048.pem
dh dh.pem

# OpenVPNからクライアントへ払い出すIPアドレスのレンジ
server 10.8.0.0 255.255.255.0

# クライアントがVPNを経由して、通信させたいネットワーク経路を記載(複数可)
push "route 172.24.0.0 255.255.0.0"

tls-auth ta.key 0

;comp-lzo

user nobody
group nobody

;log-append  openvpn.log
log-append  /var/log/openvpn.log

# TCP通信の場合はコメントアウト(今回はTCPなのでコメントアウト)
#explicit-exit-notify 1

# 最終行へ追加
crl-verify crl.pem

# ユーザー/パスワード認証の場合必要
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-pam.so login
client-cert-not-required
username-as-common-name
```

ログのローテーションファイル設定
/etc/logrotate.d/openvpn

```openvpn
/var/log/openvpn.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /etc/init.d/openvpn restart 2>&1 > /dev/null || true
    endscript
}
```

/etc/sysctl.confファイルを編集
IPフォワードの設定

```sysctl.conf
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
```

IPフォワードの設定を反映

```
sysctl -p
```

### 2.1.1. NAT設定の場合
```
/etc/init.d/iptables start
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

/etc/init.d/iptables save
iptables -L -n -t nat

/etc/init.d/iptables restart
```

### 2.1.2. ルーティング構成の場合
送信元/送信先チェック Falseになっていること

AWSコンソールよりルートテーブルを編集
(下記はPrivate用のテーブルです。必要であればPublic用のテーブルにも同様の設定を追記)
【Private ルートテーブル】

| 送信先           | ターゲット               |
|:----------------|:----------------------|
| 172.24.0.0/16   | local                 |
| 10.8.0.0/24     | EC2(OpenVPN)インスタンス |

↑ OpenVPNサーバーのインスタンスNICを経由する。というルートテーブルを記載してます。

## 2.2. openvpn サービス自動起動

```
chkconfig openvpn on
```

## 2.3. openvpn サービス起動

```
/etc/init.d/openvpn start
```

# 3. クライアント設定
## 3.1. サーバーでVPNユーザー作成
OSのユーザーがVPNユーザーです。
VPNサーバーでユーザーを作成します。
AmazonLinux、CentOSであれば下記です。

```
■ユーザー / パスワード
useradd vpnuser01
passwd vpnuser01
```

## 3.2. サーバーでVPNクライアント用のコンフィグファイルを作成

`cp /usr/share/doc/openvpn-2.x.x/sample/sample-config-files/client.conf ~/client.ovpn`

```client.ovpn
client
# 今回はudpではなくTCPなので変更
;proto udp
proto tcp
remote [VPNサーバのFQDN or IPアドレス] 443

ca ca.crt
# 証明書じゃなくユーザー・パスワードなのでコメントアウト
#cert client.crt
#key client.key

#remote-cert-tls server

tls-auth ta.key 1

#comp-lzo　←圧縮を無効にする。これはサーバーのconfファイルと合わせる必要がある。

auth-user-pass
```

下記ファイルをクライアント端末に配置する
`~/client.ovpn`
`/etc/openvpn/ca.crt`
`/etc/openvpn/ta.key`

## 3.3. VPNクライアント(Windows端末の場合)
[openvpnクライアントダウンロードしてインストール](https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.5-I601.exe)

`~/client.ovpn`
`/etc/openvpn/ca.crt`
`/etc/openvpn/ta.key`
上記3ファイルを
`C:\Program Files\OpenVPN\config`配下に配置する

このまま実行して接続すると、ユーザー、パスワードを聞いてくるので
LinuxOS上で作成したユーザーとパスワードを入力し接続する。

**OpenVPNクライアントがグリーンになれば接続成功**

### 3.3.1. 通信経路の確認
1. 家(PC) → OpenVPNに接続
2. 家(PC)に`10.8.0.0 255.255.255.0`のIPアドレスが/30で区切られて払い出される[最初に振られるIPはおそらく`10.8.0.6/30`]
3. 家(PC) → AWS上のプライベートEC2(Windows、Linux)に接続確認

- NAT構成の場合、3. は一方通行の通信となり、EC2(Windows、Linux)からみれば送信元IPはOpenVPNサーバーのプライベートIP

![OpenVPN_通信1.png](https://qiita-image-store.s3.amazonaws.com/0/191445/459ba3a0-fbfa-07fe-4c50-b9eebc90e148.png)

- ルーティング構成の場合、EC2(Windows、Linux)からみれば送信元IPはOpenVPNサーバーが払い出したクライアントのIPアドレス`10.8.0.6/30`となる。
[サーバーから家(PC)にも通信可能]

![OpenVPN_通信2.png](https://qiita-image-store.s3.amazonaws.com/0/191445/89f41e16-9986-cb9f-75ec-edccfd6b754a.png)