http://www.manabii.info/2014/11/openvpn-setting-memo-for-debian-7-wheezy.html
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 証明書
クライアント証明書
クライアント証明書の秘密鍵
※静的鍵を使用する場合は、それを含める必要がある。
このファイルを iTunes のファイル共有機能で OpenVPN Connect に読み込ませる。
■その他 OpenVPN で有用と思われるコマンド
・使用できる ciphers 一覧
openvpn –show-ciphers
・使用できる tls-ciphers 一覧
openvpn –show-tls
・使用できる認証用 HMAC 一覧
openvpn –show-digests
■設定していて思った点
簡単に証明書が作成できるツールがついているのが良い。
サーバと、各クライアント間での暗号方式 (cipher) やメッセージハッシュ (auth) は同一である必要がある模様。
クライアントの設定も、基本テキストベースなので、この辺りは設定内容に自信が無い。(とりあえずつながった程度。今までは OS 標準の VPN クライアントしかさわったことがないので新鮮だった。)
■参考にさせて頂いたサイト
OpenVPN.JP | OpenVPN日本語情報サイト
OpenVPN – Debian Wiki
How to install and set-up OpenVPN in Debian 7 (Wheezy) | Stavrovski.Net
OpenVPN で不要になったクライアント証明書を無効にし、該クライアントからの接続を拒否する | レンタルサーバー・自宅サーバー設定・構築のヒント