Ubuntu 12.04でOpenVPNをインストールする

Contents

OpenVPNを導入してみたくなり、Ubuntu 12.04 で導入してみました。ネットワークの分野はまだよく理解できていないため、自分で手を動かして動作させられたことに満足です。

OpenVPN とは

異なるネットワークに所属する個々のクライアントを仮想的な同一ネットワークに所属させる仕組み……のようです。VPN を経由した通信はすべて暗号化されるため、物理的に離れた機器同士を接続する際に使われるようです。色々と試行錯誤して試してみた結果、要するにインターネットからアクセス可能な公開用ルーターに相当するものに接続、ルーターにぶら下がっている機器同士で暗号化された通信を実現しているようです。

簡単に図で説明してみます。物理的には以下の様な構成になっているとします。

自宅内のネットワーク

1つ目は自宅内のネットワーク:

20130915_HomeNetwork

外部の公衆無線LANサービスなどに接続している機器が所属するネットワーク

2つめは自宅外のネットワーク。例えば外部の公衆無線LANサービスに接続した iPad とかですかね。iPhone などでもいいですね:

20130915_PublicWifi

VPNネットワーク

VPNで接続すると仮想的なプライベートネットワークにぶら下がることになります。VPNサーバはグローバルIPを持ち、外部からアクセスできる必要があります。

20130915_VPNNetwork

このように仮想的なプライベートネットワークに各サーバがぶら下がる形になります。

OpenVPNのインストール

OpenVPN のインストール方法を説明します。サーバ側で実施する作業を解説します!

事前設定: カーネルパラメータ

/etc/sysctl.confを編集し、IPv4 のパケット転送を許可します:

net.ipv4.ip_forward=1

※ 「#」を外します。

編集後 sudo sysctl -p を実行します。

事前設定: ファイアーウォールの設定

OpenVPNサーバをOpenVPNクライアントのデフォルトゲートウェイにした場合、VPNに接続したクライアントがインターネットと接続するためには、OpenVPNサーバ側でパケットをインターネット側に転送して上げる必要があります。以下のコマンドを実行してあげます:

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE

パッケージのインストール

パッケージをインストールします:

sudo aptitude install openvpn libssl-dev openssl

OpenVPNサーバ側の設定

サーバ鍵の作成

ひな形になるファイルがあるので、それをコピーしてあげます:

sudo mkdir /etc/openvpn/easy-rsa/
sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
sudo chown -R $USER /etc/openvpn/easy-rsa/

認証局の設定情報を指定してあげます:

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”NY”
export KEY_CITY=”New York City”
export KEY_ORG=”Queens”
export KEY_EMAIL=”me@myhost.mydomain”

サーバ用の鍵を作成します:

cd /etc/openvpn/easy-rsa/
ln -s openssl-1.0.0.cnf openssl.cnf

cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-dh
./pkitool –initca
./pkitool –server server
cd keys
openvpn –genkey –secret ta.key

サーバ用のキーを所定の場所にコピーします:

cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

OpenVPN サーバの設定

サンプルとなるファイルをコピーします:

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz

vi /etc/openvpn/server.confで設定ファイルを編集します。

以下の行を編集して、OpenVPN内部のネットワークで使用する IP アドレスを指定します。デフォルトは「10.8.0.0/24」です:

server 192.168.2.0 255.255.255.0

OpenVPNサーバをデフォルトゲートウェイとして扱うために、以下の設定の「;」を削除してあげます:

push "redirect-gateway def1 bypass-dhcp"

セキュリティ上の理由から、OpenVPNサーバを実行するユーザー・グループを指定してあげます:

user nobody
group nogroup

server.confのサンプル

server.confのサンプルはこのようになります:

# OpenVPN server config file
#
# Generated by Chef - local changes will be overwritten

port 1194
proto tcp
dev tun
keepalive 10 120
comp-lzo
local 0.0.0.0

# Keys and certificates.
ca   /etc/openvpn/keys/ca.crt
key  /etc/openvpn/keys/server.key # This file should be kept secret.
cert /etc/openvpn/keys/server.crt
dh   /etc/openvpn/keys/dh1024.pem

ifconfig-pool-persist /etc/openvpn/ipp.txt

server 10.8.0.0 255.255.0.0

user nobody
group nogroup

# avoid accessing certain resources on restart
persist-key
persist-tun

# current client connections
status /etc/openvpn/openvpn-status.log

# logging settings.
log-append  /var/log/openvpn.log
verb 1  # don't spam the log with messages.
mute 10 # suppress identical messages > 10 occurances.

script-security 1
push "redirect-gateway def1 bypass-dhcp"

OpenVPNクライアント側の設定

クライアント用の鍵作成

以下のコマンドを実行して、クライアント用の鍵を作成します:

cd /etc/openvpn/easy-rsa/
source vars
KEY_CN=someuniqueclientcn ./pkitool client

注意点としては、KEY_CNを変更してあげないとうまく鍵作成ができないことです。詳細はGreenpossum today: TXT_DB error number 2 when generating openvpn client certificatesを参照ください。

クライアントへの鍵配備

以下のファイルをクライアント側へ配備します:

  • /etc/openvpn/ca.crt
  • /etc/openvpn/ta.key
  • /etc/openvpn/easy-rsa/keys/client.crt
  • /etc/openvpn/easy-rsa/keys/client.key

またクライアント用の設定ファイルも server.conf をベースに作成する必要があります。ovpnという形式でクライアントキーなどを一つのファイルにまとめることが可能です。iPhoneでOpenVPNを使おうを参考にしてください。この設定ファイルもクライアント側に配備します。

クライアント用設定ファイルのサンプル

クライアント用の設定ファイルのサンプルです:

client
dev tun
proto tcp
remote openvpn-server.kazu634.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
;ca ca.crt
;cert ipad.crt
;key ipad.key
comp-lzo
verb 3

<ca>
-----BEGIN CERTIFICATE-----
MIIDuDCCAyGgAwIBAgIJANv02SnW6i6TMA0GCSqGSIb3DQEBBQUAMIGaMQswCQYD
[... snip ...]
Ggx0uDBQuVzhC4skB9YXt+Z2TCzXogEBtE9h/A0tR8t+ErsoXSDJ3UC7MRI=
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIID9TCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBmjELMAkGA1UEBhMCSlAx
[... snip ...]
5uE2hKer80ia
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMesHWRNGH9klvU/
[... snip ...]
GHsGbRenaBWR0A==
-----END PRIVATE KEY-----
</key>

まとめ

OpenVPNクライアント側でクライアント用に生成したファイル一式を配備してあげれば、OpenVPNで接続できるようになります。

参考