自宅サーバーにVPNを導入してみました。 ちょっと長くなるので、何回かにわけて導入手順を書いておきます。

OpenVPNとは

VPNとはVirtual Private Networkの略で、仮想的に専用線でつないだネットワークの様に達振る舞う事ができます。 例えば、会社なんかでは10.0.0.0/24とか192.168.0.0/24なんてネットワークを使っている思いますが、これはプライベートネットワークといって、外部(インターネット)と直接通信が出来ません。 説明し出すと長いのでこの辺りの細かい説明は省略します。 一方、皆さんの自宅でもおそらく192.168.0.0/24のネットワークを使っていると思うのですが、コレもプライベートネットワークです。 当然直接インターネットには繋げません。(モデムルーターとか使っているハズです。) VPNの便利な所は、此の会社のプライベートネットワークと自宅プライベートネットワークの間で仮想的にブリッジネットワークを使って、仮想的に専用線を引いている様に接続出来るコトです。 例を挙げると、会社のネットワークを10.0.0.0/24、自宅ネットワークを192.168.0.0/24と仮定すると、仮想的にNICを作成して、会社と自宅PCに10.0.1.0/24アドレスを割り当てます。Linuxのファイアウォールで転送のポリシーを設定してあげれば、自宅に居ながら会社のネットワークにセキュアにアクセス出来るようになります。 実装面から言うと、パケット自体はインターネット上を暗号化されて通る事になります。 10.0.1.0/24ネットワーク宛のパケットをSSL/TSL方式で暗号化し、更にグローバルIP用にカプセル化して送信することでこのセキュアな接続を実現しています。 今回はVPNサーバーとしてLinux、クライアントとして、WindowsとMacを使っています。 サーバー側でブリッジモードは使っていません。(ネットワーク上の都合です)

OpenVPN導入

まずはサーバ側のインストール OpenVPN本体と、ライブラリlzoが必要なのでダウンロードします。
# cd /usr/local/src
# wget http://openvpn.net/release/openvpn-2.0.5.tar.gz
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-1.08.tar.gz
lzo → OpenVPNの順にインストール
# tar zxvf lzo-1.08.tar.gz
# cd lzo-1.08
# ./configure
# make
# make install
# tar zxvf openvpn-2.0.5.tar.gz
# cd openvpn-2.0.5
# ./configure 
# make
# make install
設定ファイルの置き場と、サンプル設定ファイルのコピー。
# mkdir /etc/openvpn/
# cp sample-scripts/openvpn.init /etc/openvpn
# chmod 755 /etc/openvpn/openvpn.init
OpenVPNの設定ファイルを作成します。
# vi /etc/openvpn/server.conf

# 通信に使用するプロトコル及びポート番号の指定 port 5000 proto udp # 使用する仮想ネットワークデバイスの指定 dev tap0 # CA証明書、サーバ証明書、サーバ秘密鍵、DH鍵のパス指定 # ※パス指定は、絶対パスまたはserver.confの設置ディレクトリからの相対パスでの指定 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key dh /etc/openvpn/easy-rsa/keys/dh1024.pem # OpenVPNサーバのネットワーク設定 # 書式:server [OpenVPNサーバのアドレス] [ネットマスク] server 10.0.1.0 255.255.255.0 # クライアントにサーバ側ネットワークへの経路を伝えるための設定 # 書式:push “route [OpenVPNサーバ側のネットワークアドレス] [ネットマスク]” push "route 10.0.1.0 255.255.255.0" # クライアント同士の通信を可能にするための設定 client-to-client # VPN接続間の生存確認のための設定 keepalive 10 120 # パケット転送の際にLZO圧縮を有効にする comp-lzo # OpenVPNデーモン起動ユーザ・グループの指定 ※Windowsシステム以外設定可能 user nobody group nobody # VPNが落ちた場合の再接続設定 persist-key persist-tun # ステータスログのパス指定 status /var/log/openvpn-status.log # ログのパス指定 log /var/log/openvpn.log log-append /var/log/openvpn.log # ログの詳細レベルの指定 verb 3 # OpenVPN管理インターフェイスの起動設定 management localhost 7505
パケットの転送を許可する。
# echo 1 > /proc/sys/net/ipv4/ip_forward
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1	←"1"に変更

OpenSSL設定

続いて、SSLの設定。 用意されているスクリプトを使用するので割と簡単です。 OpenSSLが入っていなければ、入れておいてください。
# yum install openssl
精製用のスクリプトを移動。
# cp -r /usr/local/src/openvpn-2.0.5/easy-rsa /etc/openvpn
SSL設定用の環境設定スクリプトを編集。
# vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=JP               ←国名
export KEY_PROVINCE=Tokyo           ←県名
export KEY_CITY=Minatoku            ←市町村名
export KEY_ORG="hackmylife"         ←団体名
export KEY_EMAIL="test@mail.example.com" ←メールアドレス
証明書を作成。
# cd /etc/openvpn/easy-rsa/
# . ./vars
# mkdir keys
# ./build-ca
Generating a 1024 bit RSA private key
...........++++++
...............................++++++
writing new private key to 'ca.key'