2015年3月17日火曜日

ServersMan@VPS(Ubuntu14.04-64)でOpenVPN

VPNといえば企業が拠点同士を社内LANで接続したり、
出先から社内LANに継いだりすることができる技術ですが、
別々のNAT配下に属するマシン同士を接続するのに個人でも重宝します。
VPNを個人で張ることの難しさは、
基本的に固定のグローバルIPアドレスが必要なことにつきますが、
この点vpsにはおあつらえ向きな用途であります。
以下ではServersMan@VPS(Ubuntu14.04-64)をOpenVPNサーバにして、
いろいろなマシンをOpenVPNクライアントにし、
それらの間で通信する方法を紹介します。

まずはサーバを仕立てます。以下を実行します。
# apt-get install openvpn
# apt-get install easy-rsa
# cd /etc/openvpn/
# make-cadir ca
ここで設定ファイル"/etc/openvpn/ca/vars"の環境変数を以下の如く変更します。
export KEY_COUNTRY="JP"
export KEY_PROVINCE="<県名>"
export KEY_CITY="<市名>"
export KEY_ORG="<組織名>"
export KEY_EMAIL="<メールアドレス>"
その後証明書等を作成していきます。
まずは認証局です。以下を実行します。
# cd /etc/openvpn/ca
# source ./vars
# ./clean-all
# ./build-ca
ここでの対話形式での回答にて[Common Name]にはマシンのホスト名を設定し、
その他はデフォルトのままにします。
次はサーバ証明書です。以下を実行します。
# ./build-key-server server
ここでの対話形式での回答にて[Common Name]にはサーバのFQDNを設定し、
パスワードは空にし、その他はデフォルトのままにします。
[y/n]質問の回答は'y'で構いません。
そしてDHパラメータです。以下を実行します。
# ./build-dh
ここまででサーバに必要なものが一通り揃ったので、
今度はクライアントで必要な証明書を作成します。
これは各クライアントマシン毎に別々の物を作成する必要があるので
以下をマシン数だけ随時実行します。
# ./build-key-pass client<識別名>
ここでパスフレーズはずっと覚えておく必要があるのでそれなりの文字列を入力し、
パスワードは空で、[y/n]質問の回答は'y'で構いません。

それではサーバをセットアップします。
以下を実行します。
# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
# cd /etc/openvpn/
# cp /etc/openvpn/ca/keys/ca.crt ./
# cp /etc/openvpn/ca/keys/server.crt ./
# cp /etc/openvpn/ca/keys/server.key ./
# cp /etc/openvpn/ca/keys/dh2048.pem ./
# chmod og-rx /etc/openvpn/*.key
設定ファイル"/etc/openvpn/server.conf"の
dh dh1024.pem
の行を
dh dh2048.pem
に変更し、
;client-to-client
の行の先頭の';'を削除します。
そして以下を実行します。
# /etc/init.d/openvpn start
# update-rc.d openvpn defaults

なおクライアントの設定については面倒なので改めてここで触れることはしません。
以下の過去記事を参考にしてください。
ところで、もしこのVPNを経由してVPNサーバからインターネットに出ていきたければ、
起動スクリプト"/etc/init.d/openvpn"のstart_vpn()関数の最後に
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s <VPN網のネットワークアドレス>/<VPN網のサブネットマスクビット数> -o venet0:0 -j MASQUERADE
を追加し、stop_vpn()関数の最初に
# echo 0 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -D POSTROUTING -s <VPN網のネットワークアドレス>/<VPN網のサブネットマスクビット数> -o venet0:0 -j MASQUERADE
を追加します。設定の変化の様子は
# iptables-save
の出力結果からわかります。
ただし、事はサーバだけでは済まず、各クライアントでルーティングテーブルを適切に編集する必要もあります。
そもそも普通にインターネットにアクセスできているからこそVPNサーバに接続できるので、
わざわざVPN経由にしなくとも、インターネットには直接アクセスすればいいわけで実用性はそうはありません。
どこかアクセス制限をしているような国からその国外にアクセスする手段ぐらいに過ぎません。
それにPC用OSならともかく、スマートフォンやタブレットではルーティングテーブルは多分編集不能です。
できたとしても、少なくともVPNサーバへは普通にアクセスしなければならず、
トラブルもありがちなので、それなりのスキルを持っていないと困難です。
ということでどうしてもVPN経由にしたければNATよりはプロキシを使うべきでしょう。

0 件のコメント:

コメントを投稿