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


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

VPSを作る

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

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

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

OpenVPNサーバを立てる

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

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

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

$ apt-get update && apt-get install openvpn easy-rsa 

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

make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

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

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="[email protected]"
export KEY_OU="MyOrganizationalUnit"

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

. /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を作成します。

./clean-all
./build-ca

PKIの初期化

./pkitool --initca

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

./build-key-server conoha

DH共通鍵を作成します。

./build-dh

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

cp keys/*.crt keys/*.key keys/dh2048.pem /etc/openvpn

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

openvpn --genkey --secret ta.key
cp ta.key /etc/openvpn

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

./build-key client

ネットワークの設定

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

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
sysctl -p

server.confの編集

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

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サーバの起動

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

openvpn /etc/openvpn/server.conf

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

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