LinuxまたはFreeBSDでVPNを構築するための手順書

概要

クロスプラットフォーム対応のOpenVPNでVPNを構築する。

前提条件

Linuxに固有の準備

TUN/TAP Driver 1.1以降 (Kernel 2.4系で有ればtun.oで足りるかも)
RedHat 7.3であれば、

/etc/modules.conf に
alias char-major-10-200 tun

を追加する。
次に、/dev/net ディレクトリにtun デバイスファイルを作成する。
mkdir /dev/net
mknod /dev/net/tun c 10 200

IP forwardの設定
ルータになるので、IP転送を有効にする。
/etc/sysctl.conf の 「net.ipv4.ip_forward」を「1」にする。

net.ipv4.ip_forward = 1

FreeBSDに固有の準備

トンネルデバイスの設定
GENERICカーネルで有れば、tunはすでに有効になっているはず。
なければ追加する必要がある。
IP forwardの設定
/etc/rc.confに以下の行を追加する
gateway_enable="YES"

VPNの準備・インストール(各OS共通)

必要なものをそろえる。
OpenSSL
暗号化機能ライブラリ。セキュリティがらみでよくアップデートがあるので、バージョンに注意すること。
インストール手順は簡単。

tar xvzf openssl*.gz
cd openssl*
./config
make
su
make install

LZO
圧縮機能のライブラリらしい
OpenVPNコンパイル時の設定で使用しないで構築することも可能ではある。
これもインストールは簡単。

tar xvzf lzo*.gz
cd lzo*
./configure
make
su
make install

OpenVPN
VPNソフト本体。
configureでLZOのパスを指定してやる必要がある。使用しないので有れば、configure時に「--disable-lzo」を指定することも可能。

tar xvzf openvpn*.gz
./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
make
su
make install

VPNの設定

キーファイルの作成
あらかじめキーを作成しておき両者で共有する方式なので、キーファイルを生成する必要がある。
生成もopenvpnで可能なので、ややこしい手順はいらない。「vpn_secretkey」はファイル名なので任意。
できあがったファイルは、「安全な方法で」相手側に渡しておく。これが盗まれたら元も子もない。
当然、パーミッションは 600 である。

mkdir /etc/vpn
cd /etc/vpn
openvpn --genkey --secret vpn_secretkey
chmod 600 vpn_secretkey

トンネルデバイス設定スクリプト
openvpn同士の接続が完了した際に、トンネルにアドレスを割り当てるためのスクリプトを作成する。
MTUは「1450」にすること。これを忘れると、Windowsネットワークなどで不具合が生じる場合が有る。
スクリプトで、ルーティングの設定も一緒に行ってしまうとよいかもしれない。
ファイル名は「vpn_ifup.sh」とでもしておく。

なお、Linuxの場合この時点では「ifconfig -a」してもインターフェースがUPしていないため、表示されない。
また、トンネルデバイス名は「tun0」などでよい。モジュール名が「tun」なこともありややこしいので、混同しないよう注意。
Linuxの場合

#!/bin/sh

ifconfig (トンネルデバイス名) (自分側IP) pointopoint (相手側IP) mtu 1450
route add -net (相手側ネットワーク) dev (トンネルデバイス名)

FreeBSDの場合

#!/bin/sh

ifconfig (トンネルデバイス名) (自分側IP) (相手側IP) mtu 1450
route add (相手側ネットワーク) (相手側IP)

VPNソフトの起動
設定が完了したら、起動用のスクリプトを作成する。ファイル名はvpn.shとでもしておく。
--remoteで指定する相手側のアドレスは、IPアドレスではなくホスト名でも構わないが、起動した時点で名前からIPが引けない場合(PPP接続前など)では、起動に失敗するので要注意。


#!/bin/sh

/usr/local/sbin/openvpn --daemon --comp-lzo --remote (相手側グローバルIP) --dev (トンネルデバイス名) --verb 5 --secret /etc/vpn/vpn_secretkey --up "/etc/vpn/vpn_ifup.sh"

その他の技術情報
NATの内側にVPNルータを置く場合
OpenVPNはデフォルトで5000/UDPを使うので、これをNATの内側にあるVPNルータにフォワードする。
たとえば、FreeBSDのnatdであれば、natd.confに次のように追加する。
redirect_port (VPNルータのIPアドレス):5000 5000

市販のルータでも、ポートフォワード機能が有れば実現可能と思われる。
複数のVPNを構成する
標準のポート「5000/UDP」を変更すれば、openvpnを複数同時に起動できる。
ポート番号は、次のようなオプションで変更できる。
--lportローカル側のポート
--rportリモート側のポート
--port両方