AWSにOpenVPNでVPNを構築してみた

AWSにOpenVPNを使ってVPNを構築したのでその時のメモです。
まぁすでに[こちら](http://qiita.com/hideki/items/657a5701133e713fcf8c)に良記事があるのですが、
構築環境の違いか途中でうまくいかなかったので別途残しておきます。

# 環境
EIPが付与されたインスタンスをVPNサーバとし、
手元のWindows PCにVPNクライアントをインストールして上記サーバに接続するとします。
セキュリティグループは以下のように設定して下さい。

![23.png](https://qiita-image-store.s3.amazonaws.com/0/17731/0e2fb062-2755-7c0b-f231-6fc7c7506a60.png)


# サーバの設定
はじめにVPNサーバとなるインスタンスにOpenVPNをインストールし、その設定を行います。
以降はrootユーザで実施してください。

## OpenVPNのインストール

```bash:
# 必要なパッケージのインストール
yum -y install openvpn openssl-devel lzo-devel pam-devel

# easy-rsaのインストール
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
```

## 各種鍵・証明書の作成

```bash:
cd /etc/openvpn/easyrsa3/
# 認証局の初期化
./easyrsa init-pki
# 認証局の作成
./easyrsa build-ca
# パスフレーズを入力（2回とも同じ内容でOK）
cp pki/ca.crt /etc/openvpn/

./easyrsa build-server-full server nopass
# 先ほど入力したパスフレーズを入力
cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/

# 証明書失効リスト(CRL)の作成
./easyrsa gen-crl
cp easyrsa3/pki/crl.pem /etc/openvpn/

# DHパラメータの作成
./easyrsa gen-dh
cp pki/dh.pem /etc/openvpn/

# TLS認証鍵の作成
openvpn --genkey --secret /etc/openvpn/ta.key
cp /usr/share/doc/openvpn-2.3.6/sample/sample-config-files/server.conf /etc/openvpn/
```

## 設定ファイルの編集
先ほどコピーした設定ファイルを編集します。他は元ファイルのままでOKです。

```bash:/etc/openvpn/server.conf
dh dh.pem # dh dh2048.pemを変更

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0" # 追加

tls-auth ta.key 0 # コメント解除

# コメント解除
user nobody
group nobody

log-append openvpn.log # コメント解除

# 以下の2行を最後に追加
management localhost 7505
crl-verify crl.pem
```

## クライアント証明書と秘密鍵の生成

```bash:
cd /etc/openvpn/easyrsa3
./easyrsa build-client-full client1
# クライアント用パスフレーズの入力（2回とも同じ内容でOK）
# サーバ用パスフレーズの入力
```

build-client-fullコマンドに指定するクライアント名は一意である必要があるので、注意してください。

## OpenVPNの起動
起動スクリプトを以下のように修正し、

```bash:/etc/init.d/openvpn
# 以下の行をコメント解除
echo 1 > /proc/sys/net/ipv4/ip_forward
```

OpenVPNを起動します。

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

以上でサーバサイドの設定は終了です。

# クライアントの設定
windowsにおけるVPNクライアントの設定を行います。
といっても[vpnux Client](http://www.plum-systems.co.jp/vpnux-client/)を使うと簡単に設定できます。

## vpnux Clientのインストール
[こちら](http://www.plum-systems.co.jp/vpnux-client/)からvpnux Clientをダウンロードし、インストールします。

## プロファイルの設定
プロファイルを新規作成し、以下のように設定して下さい。

![20_2.png](https://qiita-image-store.s3.amazonaws.com/0/17731/259591a6-1a3d-8dd1-ffe2-7bb732e10d9a.png)

![21_2.png](https://qiita-image-store.s3.amazonaws.com/0/17731/5466638f-4e74-78af-9be8-e9393838972e.png)

1. VPNサーバのEIPを指定してください。
2. サーバからca.crtをダウンロードし、それを指定して下さい。
3. 「証明書認証を使用」にチェックを入れて下さい。
4. サーバからclient1.crtをダウンロードし、それを指定して下さい。
5. サーバからclient1.keyをダウンロードし、それを指定して下さい。
6. サーバからta.keyをダウンロードし、それを指定して下さい。

以上でクライアントサイドの設定も完了です。

# 接続確認
では、実際に接続してみます。
先ほど作成したプロファイルを選択し、秘密鍵のパスフレーズを入力してください。

![22.png](https://qiita-image-store.s3.amazonaws.com/0/17731/c448e99b-bc29-52c8-1730-10dce7779b5b.png)

無事接続ができたら、クライアント・サーバ双方からそれぞれpingしてみます。

```bash:client(10.8.0.6)
C:\Users\yosuke.saito>ping 10.8.0.1

10.8.0.1 に ping を送信しています 32 バイトのデータ:
10.8.0.1 からの応答: バイト数 =32 時間 =27ms TTL=64
10.8.0.1 からの応答: バイト数 =32 時間 =10ms TTL=64
10.8.0.1 からの応答: バイト数 =32 時間 =11ms TTL=64
10.8.0.1 からの応答: バイト数 =32 時間 =12ms TTL=64

10.8.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 10ms、最大 = 27ms、平均 = 15ms
```

```bash:server(10.8.0.1)
[ec2-user@ip-10-0-1-82 ~]$ ping -c 4 10.8.0.6
PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data.
64 bytes from 10.8.0.6: icmp_seq=1 ttl=128 time=10.3 ms
64 bytes from 10.8.0.6: icmp_seq=2 ttl=128 time=532 ms
64 bytes from 10.8.0.6: icmp_seq=3 ttl=128 time=164 ms
64 bytes from 10.8.0.6: icmp_seq=4 ttl=128 time=84.2 ms

--- 10.8.0.6 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3088ms
rtt min/avg/max/mdev = 10.325/197.853/532.513/200.747 ms
```

疎通できているのが確認できました。

簡単にはなりますが、以上でVPNの構築は終わりです。
ぜひ参考にして頂けると幸いです。
vpnux Clientが簡単過ぎて驚いた。