ConoHaでOpenVPNサーバーを構築する

ConoHa上にOpenVPNサーバーを立てて、プライベートセグメント上のサーバーにアクセスするという構成を、さくっと作ってみます。

## VPSを作る

VPSを2台立てます。一つはVPNサーバーとしてグローバル側/プライベート側両方使い、もう一つはプライベートセグメントに配置します。

<img width="574" alt="vpn0.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/d28ae28c-e76e-2956-0a44-4d81c5bf6464.png">

## VPSを作成してプライベートネットワークに接続する

VPSを2つ作成します。OSはUbuntu14.04を使うとよいでしょう。aptでOpenVPNを簡単にインストールできるからです。そして、[オフィシャルのチュートリアル](https://www.conoha.jp/conoben/archives/9132)を参考に、VPSをプライベートネットワークに接続します。今回は172.18.0.0/24のプライベートネットワークを作成して使いました。

<img width="1017" alt="vpn2.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/c2f34311-22eb-1d4d-0649-ade592abab2a.png">


## OpenVPNサーバを立てる

先に書いときますが長いです。

まずVPNサーバにするVPSにSSHでログインします。

OpenVPNのインストールはapt-getするだけです。easy-rsaは認証局(CA)の作成を簡単にしてくれる便利ツールです。

```shell-session
$ apt-get update && apt-get install openvpn easy-rsa 
```

CAのディレクトリを作成して、そのディレクトリに移動します。

```shell-session
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
```

easy-rsaのパラメータファイルを編集します。

```shell-session
vi /etc/openvpn/easy-rsa/vars
```

↓このあたりの設定を適当に変更すればOKです。

```
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
```

パラメータを環境変数に反映させます。

```shell-session
. /etc/openvpn/easy-rsa/vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
```

clean-allしろと言われるので、その後build-caでcaを作成します。

```shell-session
./clean-all
./build-ca
```

PKIの初期化

```shell-session
./pkitool --initca
```

サーバーの鍵ペアの作成。最後にSign the certificate?と聞かれるのでyを選びます。

```shell-session
./build-key-server conoha
```

DH共通鍵を作成します。

```shell-session
./build-dh
```

作成した鍵などを/etc/openvpnにコピーします。

```shell-session
cp keys/*.crt keys/*.key keys/dh2048.pem /etc/openvpn
```

VPNそのものを暗号化するためのTLS鍵を作成します。このファイルも/etc/openvpnにコピーします。

```shell-session
openvpn --genkey --secret ta.key
cp ta.key /etc/openvpn
```

最後に接続するクライアント毎の鍵ペアを作成します。clientの部分はクライアントの名前で何でも良いです。これも最後にSign the certificate?と聞かれるのでyを選びます。

```
./build-key client
```

### ネットワークの設定

IPマスカレードの設定を追加しておきます。これによりVPNクライアントからのパケットがeth1に渡されます。

```shell-session
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
```

忘れないようにカーネルの設定でIPv4のフォワーディングを有効にしましょう。/etc/sysctl.confの以下の行をコメントアウトして、sysctl -pを実行します。

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

```shell-session
sysctl -p
```

### server.confの編集

次にサーバー側の設定ファイルを編集します。まずサンプルファイルをコピーしてきて展開します。

```shell-session
cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip server.conf.gz 
```

変更点は以下の通り、意味は頑張って調べよう。

```
dh dh1024.pem
↓
dh dh2048.pem
```

```
server.crt
↓
conoha.crt

server.key
↓
conoha.key
```

```
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
↓
push "route 172.18.1.0 255.255.255.0"
```

```
;tls-auth ta.key 0 # This file is secret
↓
tls-auth ta.key 0 # This file is secret
```

### OpenVPNサーバの起動

やっと起動です。とりあえず起動するだけなら以下でできます。メッセージも出るので、接続できるまではこの状態でデバッグするのが良さそうです。

```shell-session
openvpn /etc/openvpn/server.conf
```

serviceコマンドから起動することもできます。運用にはこちらですね。

```shell-session
service openvpn start
```

## クライアントの設定

やっとクライアント側です。長かった・・・('A｀)


### 必要な証明書のコピー

まずVPNサーバーからクライアントに以下のファイルを**安全な手段で**コピーしてきます。
- /etc/openvpn/ca.crt
- /etc/openvpn/ta.key
- /etc/openvpn/easy-rsa/keys/client.crt
- /etc/openvpn/easy-rsa/keys/client.key

### クライアントの設定ファイル

とりあえず以下のファイルをtest.ovpnで保存します。

```
client
tls-auth ta.key 1
dev tun
proto udp
remote [接続先IPアドレス] [接続先ポート(デフォルトは1194)]
ca ca.crt
cert client.crt
key client.key
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
```

以下のコマンドで接続します。「Initialization Sequence Completed」と出れば成功です！

```
$ sudo openvpn test.vpn
(snip)
Fri Nov 20 13:00:35 2015 Initialization Sequence Completed
```

## 疎通確認

OpenVPNは10.8.0.0という仮想ネットワークを作成します。VPNサーバーは10.8.0.1です。このIPアドレスにpingしてみましょう。

```
$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=2.35 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=2.10 ms
```

VPNに接続すると、ConoHaのローカルネットワークである172.18.1.0/24へのルーティングが自動的に作成されるので、このネットワークにも透過的に接続できます。172.18.1.1がOpenVPNサーバーで、172.18.1.2がプライベートのサーバーです。どちらにもpingが届くことを確認できます。

```
$ ping 172.18.1.1
PING 172.18.1.1 (172.18.1.1) 56(84) bytes of data.
64 bytes from 172.18.1.1: icmp_seq=1 ttl=64 time=1.94 ms
64 bytes from 172.18.1.1: icmp_seq=2 ttl=64 time=2.14 ms
```

```
$ ping 172.18.1.2
PING 172.18.1.2 (172.18.1.2) 56(84) bytes of data.
64 bytes from 172.18.1.2: icmp_seq=1 ttl=63 time=9.31 ms
64 bytes from 172.18.1.2: icmp_seq=2 ttl=63 time=7.83 ms
```

(参考にしました)
http://qiita.com/mcddx330/items/5814f5c9175fbd517be6