AWS環境にOpenVPNでVPNを構築


AWS環境にOpenVPNをインストールし、ソフトウェアVPN環境を構築するための簡単な構築メモです。
クライアント側に専用クライアントのインストールが必要ですが、ハードウェアVPNを構築するほどのコストを掛けられ無いような規模であれば、役に立つこともあるかと思います。

## 環境

Ppublicセグメントでは、OpenVPN用サーバのみを公開し、Privateセグメントの各サーバに対しては、クライアントからプライベートアドレスで接続できるようにします。

![env.png](https://qiita-image-store.s3.amazonaws.com/0/22689/0151c220-aa26-80f7-4c96-b2da38e8ce03.png "env.png")


## AWSの設定

* OpenVPNをインストールしたサーバにEIPを設定。
* OpenVPNをインストールしたサーバのみをPublicセグメントのセキュリティグループに所属させる。
* Privateセグメントのセキュリティグループに、Publicセグメントに設定したセキュリティグループからのアクセスを許可。
* Publicセグメントのセキュリティグループに以下を設定。  
  ```
Custom UDP Rule, UDP, 1194, 0.0.0.0/0
  ```
* Routeテーブルに、VPNのクライアント側のセグメントから、OpenVPNをインストールしたサーバへのルーティングを設定。
* OpenVPNをインストールしたサーバに対し、Source/dest.checkをdisabled。

## OpenVPNのインストール

```bash
sudo yum install openvpn
```

## easy-rsaのインストール

Amazon Linuxでは、標準でeasy-rsaに相当するパッケージがインストールされていません。このため、個別にインストールする必要がありますが、yumにepelリポジトリを有効にするオプションの指定が必要です。

```bash
sudo yum install easy-rsa --enablerepo=epel
```

以下にインスト−ルされます。

* /usr/share/easy-rsa

## 各種keyの作成

### build-ca

```bash
cd /usr/share/easy-rsa/2.0
sudo -s
source ./vars
./clean-all
./build-ca
```

#### 入力例

```
Country Name (2 letter code) [US]:JP
State or Province Name (full name) [CA]:Tokyo
Locality Name (eg, city) [SanFrancisco]:Hoge-shi
Organization Name (eg, company) [Fort-Funston]:Fuga Company
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:Hoge Dept.
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:openvpn-ca
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:ec2-user@example.com
```

### build-key-server

```bash
./build-key-server server
```

#### 入力例

```
Country Name (2 letter code) [US]:JP
State or Province Name (full name) [CA]:Tokyo
Locality Name (eg, city) [SanFrancisco]:Hoge-shi
Organization Name (eg, company) [Fort-Funston]:Fuga Company
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:Hoge Dept.
Common Name (eg, your name or your server's hostname) [server]:openvpn-server
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:ec2-user@example.com
```

### build-key

以下はアクセスを許可するアカウント毎に作成します。

```bash
./build-key [username]
```

#### 入力例

```
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Tokyo'
localityName          :PRINTABLE:'Hoge-shi'
organizationName      :PRINTABLE:'Fuga Company'
organizationalUnitName:PRINTABLE:'Hoge Dept.'
commonName            :PRINTABLE:'ec2-user'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'ec2-user@example.com'
```

### build-dh

```bash
./build-dh
```

### リンクの作成

```bash
ln -s /usr/share/easy-rsa/2.0/keys/ca.crt .
ln -s /usr/share/easy-rsa/2.0/keys/server.crt .
ln -s /usr/share/easy-rsa/2.0/keys/server.key .
ln -s /usr/share/easy-rsa/2.0/keys/dh2048.pem .
```

## OpenVPNの設定

### /etc/openvpn/config.conf

```
port 1194
proto udp
dev tun

server 172.25.254.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "route 172.31.0.0 255.255.240.0"

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

status /var/log/openvpn-status.log
verb 3
```

## OpenVPNプロセスの再起動

```bash
sudo /etc/rc.d/init.d/openvpn restart
```

## OpenVPNの自動起動設定

```bash
sudo chkconfig --level 345 openvpn on
```

## IP Forwardingを設定

OpenVPNをインストールした開発環境管理サーバで、IP Forwardingを有効にします。

### /etc/sysct.conf

```
net.ipv4.ip_forward = 1
```

設定を読み込みます。

```bash
sudo sysctl -p
```

## OpenVPN Clinet for Mac

Macであれば[Tunnelblick](https://code.google.com/p/tunnelblick/)が良いと思います。以下は設定例です。

### Tunnelblick

```
client
remote [OpenVPN用サーバに設定したEIP]
proto udp
dev tun
port 1194

tls-client

ca ca.crt
cert [username].crt
key [username].key

comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
```

## OpenVPN Client for Windows

[vpnux Client](http://www.vpnux.jp/)が非常に使いやすくてお勧めです。