OpenVPN 設定メモ (Debian 7 Wheezy)

OpenVZ (多分) の VPS を借りて、VPN サーバを立てようとしたのだけど、IPsec に必要なモジュールがロードされていなくて動作せず、他の VPN と言っても今さら PPTP は無いし、で探したところ、「OpenVPN」と言うものがあったので、それの設定メモ。

■設定環境

多分 OpenVZ で動作していると思われる VPS 。
ゲスト OS として、Debian 7 Wheezy AMD64 を利用。

■サーバの環境確認

サーバで tun が使えるかどうか確認。
※ほとんどの VPS で使えるはずだが、場合によっては使用できない可能性もあるため。

$ ls -la /dev/net/tun
crw------- 1 root root 10, 200 Nov 23 15:52 /dev/net/tun

上記のように /dev/net/tun が存在すれば OK 。

■ OpenVPN のサーバをインストール

# apt-get install openvpn

例によって、apt-get コマンドでインストールする。

■証明書を作成するツールの設定

OpenVPN のパッケージに easy-rsa という、証明書を簡単に作ってくれるツールがあるので、それを任意のディレクトリにコピーしてくる。

$ cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa
$ chmod 700 easy-rsa
$ cd easy-rsa

・vars ファイルを編集する。

export KEY_SIZE=2048

・pkitool ファイルを編集する。(証明書を sha256 で発行したいので)

openssl のパラメータで「sha1」となっているところを「sha256」に置換。(2 箇所)

■証明書などの作成 (初回のみ)

・環境変数を読み込む。(シェルから抜けた場合は、作業前に必ず実行する。)

$ source ./vars

・鍵をクリアする。(初回のみ。証明書を作ってからやると全部消えるので注意。)

$ ./clean-all

・Diffie Hellman パラメータの生成。(初回のみ。それなりに時間がかかる。)

$ ./build-dh

・CA を作成する (初回のみ。)

$ ./build-ca

以下の入力内容は例である。実際に適切に入力を行うこと。

Country Name (2 letter code) []:JP
State or Province Name (full name) []:.
Locality Name (eg, city) []:.
Organization Name (eg, company) []:Example
Organizational Unit Name (eg, section) []:Example
Common Name (eg, your name or your server's hostname) []:www.example.com
Name []:.
Email Address []:example@example.com

・OpenVPN のサーバ側の証明書を作成する。(初回のみ。)

$ ./build-key-server server

以下の入力内容は例である。実際に適切に入力を行うこと。

Country Name (2 letter code) []:JP
State or Province Name (full name) []:.
Locality Name (eg, city) []:.
Organization Name (eg, company) []:Example
Organizational Unit Name (eg, section) []:Example
Common Name (eg, your name or your server's hostname) []:www.example.com
Name []:.
Email Address []:example@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 
An optional company name []:

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

・静的鍵の作成 (初回のみ。オプション。)

openvpn --genkey --secret keys/ta.key

証明書での認証以外に、別の共有シークレットとなる静的鍵を生成する。必要に応じて作成。(特に作らなくても良い。)

■クライアント証明書の作成 (クライアント毎に実行)

書式: build-key クライアント名

環境変数を読み込む。(シェルから抜けた場合は、作業前に必ず実行する。)

$ source ./vars

クライアント証明書を発行する。

$ ./build-key pc-01

以下の入力内容は例である。実際に適切に入力を行うこと。

Country Name (2 letter code) []:JP
State or Province Name (full name) []:.
Locality Name (eg, city) []:.
Organization Name (eg, company) []:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) [pc-01]:
Name []:.
Email Address []:example@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

■ OpenVPN サーバ側の設定

・証明書格納ディレクトリを作成する。

# mkdir /etc/openvpn/certs
# chmod 755 /etc/openvpn/certs
# mkdir /etc/openvpn/private
# chmod 700 /etc/openvpn/private

・証明書と秘密鍵をそれぞれコピーする。

作成した証明書は、easy-rsa/keys ディレクトリにあるので、そこへ移動する。

# cp -p ca.crt server.crt dh2048.pem /etc/openvpn/certs/
# chown -R root:root /etc/openvpn/certs
# cp -p server.key /etc/openvpn/private/
# chown -R root:root /etc/openvpn/private/

・静的鍵を作成した場合は以下も実行

# cp -p ta.key /etc/openvpn/private/
# chown root:root /etc/openvpn/private/ta.key

・設定ファイルのひな形をコピー

# cd /etc/openvpn
# zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > server.conf

・/etc/openvpn/server.conf を以下の内容で作成する。

port 1194
proto udp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/private/server.key
dh /etc/openvpn/certs/dh2048.pem
server 192.168.64.0 255.255.255.0 # ここでの IPv4 ネットワークは、内部的に VPN で使用するもの。
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS aaa.bbb.ccc.ddd" # DNS キャッシュサーバを指定
push "dhcp-option DNS vvv.xxx.yyy.zzz" # DNS キャッシュサーバを指定 (オプション)
client-to-client # VPN クライアント間で通信を許すかという設定のようである。
keepalive 10 120
# 静的鍵を使う場合は有効化する
#tls-auth /etc/openvpn/private/ta.key 0
# 以下の暗号化形式が各クライアントと合致する必要あり。
cipher AES-256-CBC
# 以下のメッセージハッシュも各クライアントと合致する必要あり。
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

・OpenVPN サーバを起動

/etc/init.d/openvpn restart

・サーバ側は、NAPT し、パケット転送を許可しておく。

# iptables -P FORWARD DROP
# iptables -A INPUT -p udp --dport 1194 -i venet0 -d [サーバの IPv4 アドレス] -j ACCEPT
# iptables -A FORWARD -i tun0 -o tun0 -s 192.168.64.0/24 -d 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i tun0 -o venet0 -s 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i venet0 -o tun0 -d 192.168.64.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -o venet0 -s 192.168.64.0/24 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward

■クライアント証明書の失効方法

書式: revoke-full クライアント名

・環境変数を読み込む。(シェルから抜けた場合は、作業前に必ず実行する。)

$ source ./vars

・pc-01 という証明書を失効させる。

$ ./revoke-full pc-01

・crl ファイルを OpenVPN で読み込むようにする。

# cd keys/
# cp -p crl.pem /etc/openvpn/certs/
# chown root:root /etc/openvpn/certs/crl.pem

・OpenVPN 設定ファイル、/etc/openvpn/server.conf へ crl ファイルのパスを設定。(初回のみ)

crl-verify /etc/openvpn/certs/crl.pem

※なお、crl ファイルは、誰からも読めなければならない。

・OpenVPN を再起動する。

# /etc/init.d/openvpn restart

次回以降に新たに証明書を失効させた場合、crl.pem を /etc/openvpn/certs にコピーする。
※ OpenVPN の再起動は不要。

■クライアントの追加

「クライアント証明書の作成 (クライアント毎に実行)」の項をクライアント分だけ行う。

■クライアント側の設定

クライアント側には
ca.crt
server.crt
pc-01.crt
pc-01.key (秘密)
ta.key (秘密: 静的鍵を作成した場合のみ)
を安全な経路でコピーして、この情報を用いて接続。

■ iOS デバイスクライアントの設定例

クライアントソフトウェアとして、「OpenVPN Connect」を使用する場合の設定ファイルの例。

「example.ovpn」という様なファイル名で作成する。

client
dev tun
proto udp
remote [サーバの IPv4 アドレスまたは FQDN] 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher AES-256-CBC
auth SHA256
comp-lzo
verb 1
<ca>
CA 証明書
</ca>
<cert>
クライアント証明書
</cert>
<key>
クライアント証明書の秘密鍵
</key>

※静的鍵を使用する場合は、「key-direction 1」の指定と「<tls-auth>」と「</tls-auth>」でくくってそれを含める必要がある。
※改行コードは LF 。

このファイルを iTunes のファイル共有機能で OpenVPN Connect に読み込ませる。

■その他 OpenVPN で有用と思われるコマンド

・使用できる ciphers 一覧

openvpn --show-ciphers

・使用できる tls-ciphers 一覧

openvpn --show-tls

・使用できる認証用 HMAC 一覧

openvpn --show-digests

■設定していて思った点

簡単に証明書が作成できるツールがついているのが良い。
サーバと、各クライアント間での暗号方式 (cipher) やメッセージハッシュ (auth) は同一である必要がある模様。
クライアントの設定も、基本テキストベースなので、この辺りは設定内容に自信が無い。(とりあえずつながった程度。今までは OS 標準の VPN クライアントしかさわったことがないので新鮮だった。)
「OpenVPN Connect」の意地でも VPN 接続を維持しようとする動作に感動。

■参考にさせて頂いたサイト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です