毎月進化する490円/月のVPS「ServersMan@VPS」をオンラインストレージやVPNで活用しよう 5ページ

OpenVPNを使って遠隔地にあるPCを仮想ネットワークで接続する

 ServersMan@VPSでは、4月のアップデートによりtunデバイスが利用可能となった。tunデバイスはVPNなどに利用される仮想ネットワークデバイスであり、これによりServersMan@VPSを経由して異なるネットワーク間を接続できるようになる。

VPNとは?

 VPN(Virtual Private Network)は、VPNサーバー/クライアント間を仮想的な専用通信回線で接続する技術だ。VPNサーバー/クライアント間で通信パケットを暗号化し、カプセル化・トンネリングしてやり取りすることで、サーバー/クライアント間の通信を秘匿する。通信自体はインターネットやIP網などの公衆/共有回線を経由して行われるが、これによりあたかも専用線でVPNサーバー/クライアント間を直接接続したかのようなネットワーク構成を実現できるのが特徴だ。

 VPNを実現するためのソフトウェアはいくつかあるが、さまざまなプラットフォームで利用でき、比較的導入が容易なものに「OpenVPN」がある。以下ではServersMan@VPSにこのOpenVPNをインストールし、異なるネットワーク内にある複数のマシンを同一の仮想ネットワークに接続する例を紹介する。

ServersMan@VPSでのOpenVPN導入

 OpenVPNはCentOSの標準リポジトリに含まれていないため、デフォルト設定ではyumコマンドからのインストールができない。ソースコードからインストールすることも可能ではあるが手間がかかるため、ここではサードパーティのパッケージリポジトリであるRPMforgeで提供されているパッケージを利用する方法を紹介する。RPMforgeの導入についてはCentOSの公式Wikiページで解説されているので、詳細はそちらを参照してほしい。ここでは、基本的な手順のみを解説する。

 まず、RPMForgeで提供されているパッケージをインストールするために必要なGPG鍵をインポートする。

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

 続いて、RPMforgeを利用するためのパッケージ「rpmforge-release」をダウンロードする。

# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

 パッケージをインストールする前に、ダウンロードしたパッケージが正しいものかどうかを「rpm -K」コマンドで検証しておく。「OK」と表示されれば正当なパッケージであるので、「rpm -i」コマンドでrpmforge-releaseパッケージをインストールする。

# rpm -K rpmforge-release-0.5.2-2.el5.rf.*.rpm
rpmforge-release-0.5.2-2.el5.rf.i386.rpm: (sha1) dsa sha1 md5 gpg OK
# rpm -i rpmforge-release-0.5.2-2.el5.rf.*.rpm

 以上でRPMforgeの設定は完了だ。OpenVPNは「openvpn」というパッケージ名で提供されているので、これをインストールする。

# yum install openvpn

OpenVPNのサーバー側設定

 OpenVPNを利用する前には、接続に使用する証明書や暗号鍵などの準備や、適切な設定ファイルの用意が必要だ。下記ではOpenVPNを利用するためにサーバー側で必要となる最小限の作業のみを解説する。なお、OpenVPNにはさまざまな設定項目があり、不適切な設定を行うとセキュリティ的な不備となる可能性もある。設定の詳細についてはドキュメントなどを参照してほしい。

設定スクリプトのコピー

 yumコマンドでOpenVPNをインストールした場合、/usr/share/doc/openvpn-<バージョン番号>/以下にさまざまな関連ファイルがインストールされる。まず、/usr/share/doc/openvpn-<バージョン番号>/easy-rsa/以下に用意されている証明書/暗号鍵の生成スクリプトを/etc/openvpn/以下にコピーしておく。

# cp -a /usr/share/doc/openvpn-<バージョン番号>/easy-rsa /etc/openvpn/

証明書や暗号鍵の生成

 続いて、/etc/openvpn/easy-rsa/以下にコピーした設定スクリプトを利用してサーバー証明書や暗号鍵を生成する。なお、以下の作業はすべてroot権限で行う必要がある。

 まず、/etc/openvpn/easy-rsa/2.0/varsファイルを修正して鍵情報を設定する。

# vi /etc/openvpn/easy-rsa/2.0/vars

 このファイルの末尾には下記のような鍵の所有者情報を指定する欄があるので、適切な値を入力しておく。

# 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="JP"  ←国名を指定
export KEY_PROVINCE="Tokyo"  ←県名を指定
export KEY_CITY="Arakawa-ku"  ←市区町村名を指定
export KEY_ORG="OSDN"  ←組織名を指定
export KEY_EMAIL="example@osdn.jp"  ←担当者メールアドレスを指定

 varsファイルを修正後、次のようにvarファイルを読み込んだうえで「clean-all」および「build-ca」スクリプトを実行する。途中で鍵情報の入力を求められるが、これらはvarファイル中で設定しているので、基本的には何も入力せずにEnterを入力すれば良い。

# cd /etc/openvpn/easy-rsa/2.0/
# chmod +x *
# . vars
# ./clean-all
# ./build-ca
Generating a 1024 bit RSA private key
 :
 :
-----
Country Name (2 letter code) [JP]:  ←Enterを入力
State or Province Name (full name) [Tokyo]:  ←Enterを入力
Locality Name (eg, city) [Arakawa-ku]:  ←Enterを入力
Organization Name (eg, company) [OSDN]:  ←Enterを入力
Organizational Unit Name (eg, section) []:  ←Enterを入力
Common Name (eg, your name or your server's hostname) [OSDN CA]:  ←Enterを入力
Name []:  ←Enterを入力
Email Address [hirom@mosdn.jp]:  ←Enterを入力

 これで/etc/openvpn/easy-rsa/2.0/keys/以下にCA証明書やCA秘密鍵が作成される。続いて、「build-key-server」スクリプトを実行してサーバー証明書を作成する。

# ./build-key-server server
Generating a 1024 bit RSA private key
 :
 :
-----
Country Name (2 letter code) [JP]:  ←Enterを入力
State or Province Name (full name) [Tokyo]:  ←Enterを入力
Locality Name (eg, city) [Arakawa-ku]:  ←Enterを入力
Organization Name (eg, company) [OSDN]:  ←Enterを入力
Organizational Unit Name (eg, section) []:  ←Enterを入力
Common Name (eg, your name or your server's hostname) [server]:  ←Enterを入力
Name []:  ←Enterを入力
Email Address [hirom@mosdn.jp]:  ←Enterを入力

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  ←Enterを入力
An optional company name []:  ←Enterを入力
 :
 :
Certificate is to be certified until Apr 29 11:44:54 2021 GMT (3650 days)
Sign the certificate? [y/n]:y  ←「y」を入力

1 out of 1 certificate requests certified, commit? [y/n]y  ←「y」を入力
Write out database with 1 new entries
Data Base Updated

 以上で、/etc/openvpn/easy-rsa/2.0/keys/以下にサーバー証明書やサーバー秘密鍵が作成される。

 次に、「build-dh」スクリプトを実行して暗号鍵の共有に用いられるDH(Diffie-Hellman key)パラメータファイルの生成を行う。生成にやや時間はかかるが、特に必要な設定項目などはない。

# ./build-dh

 DHパラメータは、デフォルトでは/etc/openvpn/easy-rsa/2.0/keys/dh1024.pemというファイルに保存される。

 生成した証明書や暗号鍵、DHパラメータファイルなどは/etc/openvpn/以下にコピーし、暗号鍵のパーミッションの変更も行っておく。

# cp keys/server.crt keys/server.key /etc/openvpn/
# cd /etc/openvpn/easy-rsa/2.0/keys
# cp ca.crt server.crt server.key dh1024.pem /etc/openvpn/
# cd /etc/openvpn/
# chmod 600 *.key

 最後にサーバー用の設定ファイルを準備する。サンプル設定ファイルが「/usr/share/doc/openvpn-<バージョン番号>/sample-config-files/server.conf」として用意されているので、これを/etc/openvpn/以下にコピーする。

# cp /usr/share/doc/openvpn-<バージョン番号>/sample-config-files/server.conf /etc/openvpn/

 この設定ファイル内には標準的な設定がすでに記述されているので、VPNで使用するIPアドレスやポート番号などを明示的に変更したい場合を除き、特に修正をする必要はない。ただし、デフォルトではVPNサーバーはルート権限で動作する設定となっているので、この部分だけは変更しておくと良い。

 変更すべき部分は、下記の「user nobody」および「group nobody」の部分だ。それぞれ行頭に「;」が付加されてコメントアウトされているので、この「;」を削除すれば良い。

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user nobody  ←行頭の;を削除
group nobody  ←行頭の;を削除

 以上でサーバー側の設定は完了である。yumコマンドでインストールを行った場合、/etc/init.d/以下に起動スクリプト「openvpn」がインストールされているはずなので、こちらの引数に「start」を指定して実行するとVPNサーバーが起動される。

# /etc/init.d/openvpn start

 ほかのサービスと同様、「stop」引数を付けて実行するとVPNサーバーを停止できる。

# /etc/init.d/openvpn stop