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

概要

クロスプラットフォーム対応のVTUNで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
圧縮機能のライブラリらしい
VTUNコンパイル時の設定で使用しないで構築することも可能ではある。
(LZOを使用せず、ZLibを使用するオプションがある。ただし、LZOの方がパフォーマンスは上とのこと。) これもインストールは簡単。

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

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

tar xvzf vtun*.gz
cd vtun ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib --sysconfdir=/etc/vpn --localstatedir=/var
make
su
make install

VPNの設定

このソフトはクライアント/サーバ・スタイルを取っているので、設定ファイルの内容がクライアントとサーバで若干異なるので注意。

設定ファイルの作成
ファイル中のifconfigとrouteの設定は、各OSのものに依存するので、適宜編集のこと。
なお、ifconfigに渡すコマンドラインに、「%%」を含めると、VTUNが使用したトンネルデバイスの名前(たとえばtun0など)になる。
サーバ側
options {
  ifconfig      /sbin/ifconfig;
  route         /sbin/route;
}

# Default session options
default {
  type          tun;
  proto         tcp;
  encr          yes;
  speed         0;
  keepalive     yes;               # サーバ固有。接続を維持する。
  compress      lzo:9;
}

MyVPN {                            # MyVPNは、このVPN接続につける任意の名前
  pass  password;                  # passwordは、接続に必要なパスワード

  up {                             # 接続時に実行する一連のコマンド群(ifconfig/route)
        ifconfig "%% inet ccc.ccc.ccc.ccc qqq.qqq.qqq.qqq mtu 1450";
        route "add -net ccc.ccc.ccc.0/24 qqq.qqq.qqq.qqq";
  };

  down {                           # 切断時に実行する一連のコマンド群(ifconfig/route)
        route "delete ccc.ccc.ccc.0";
        ifconfig "%% delete down";
  };
}

クライアント側
options {
  ifconfig      /sbin/ifconfig;
  route         /sbin/route;
  timeout       60;
}

# Default session options
default {
  type          tun;
  proto         tcp;
  encr          yes;
  speed         0;
  compress      lzo:9;
  persist       yes;               # クライアント固有。切断されたとき、自動的に再接続。
}

MyVPN {                            # MyVPNは、このVPN接続につける任意の名前
  pass  password;                  # passwordは、接続に必要なパスワード

  up {                             # 接続時に実行する一連のコマンド群(ifconfig/route)
        ifconfig "%% inet sss.sss.sss.sss rrr.rrr.rrr.rrr mtu 1450";
        route "add -net sss.sss.sss.0/24 rrr.rrr.rrr.rrr";
  };

  down {                           # 切断時に実行する一連のコマンド群(ifconfig/route)
        route "delete xxx.xxx.xxx.0";
        ifconfig "%% delete down";
  };
}
VPNソフトの起動
設定が完了したら、起動用のスクリプトを作成する。ファイル名はvpn.shとでもしておく。


#!/bin/sh

/usr/local/sbin/vtund [option]

optionは、動作モードを指定する。

-sサーバモードで起動
-iinetdタイプのサーバモードで起動
なしクライアントモードで起動

なお、動作モードについては、コマンドラインでなく設定ファイルでも、指定可能である。
その他の技術情報
NATの内側にVPNルータを置く場合
VTUNはデフォルトで5000/UDPを使うので、これをNATの内側にあるVPNルータにフォワードする。
たとえば、FreeBSDのnatdであれば、natd.confに次のように追加する。
redirect_port (VPNルータのIPアドレス):5000 5000

市販のルータでも、ポートフォワード機能が有れば実現可能と思われる。