FreeBSDを Router として VPN を張ってみたので簡単に纏めてみた.

vtund を使った VPN はこちら

今回の構成

( 使用OSは 4.8-STABLE だが,4.x-RELEASE 以上ならば問題無いと思われる )
VPNイメージ
Client1 と Client2 を VPN でトンネリングする形となり,Router となるホストは ipfw 等を用いてファイアウォールを構成する.

機器GlobalIPPrivateIP
Router-143.244.x.34/32( PPPoE )192.168.1.254/24( fxp1 )
Router-243.244.x.139/32( PPPoE )192.168.2.254/24( fxp1 )

カーネルコンパイル

VPN を利用するには,カーネルで IPSEC を有効にしなければならない.
FreeBSD のカーネルは 4.0-RELEASE からモジュール形式になっているが,モジュール形式で IPSEC が有効かどうかは試していないのでコンパイルしなおした.
( 静的にカーネルに組み込んだ方が必要なリソースも少ないので,非力なマシンや,チューニングしたい場合はカーネルの再コンパイルをお勧めする )

/usr/src/sys/i386/conf 以下に GENERIC というファイルがあるので,これをコピーして編集する.
cd /usr/src/sys/i386/conf
又は
cd /sys/i386/conf
cp GENERIC VPN

ファイル VPN を編集し,以下の文字列を最後に加える.
options         IPSEC
options         IPSEC_ESP
options         IPSEC_DEBUG

追加したら,保存,終了してカーネルのコンパイルを行う.
以下のコマンドを1行づつ実行するのだが,エラーが発生しストップしてしまう場合,設定ファイルに不整合等が存在する事になるので,ファイルをチェックする事.
以下のコマンドが正常に終了したら,マシンを一度リブートする.
make depend
make all
make install

IPSec 設定ファイル

IPSec の設定ファイルは,各 Router マシンの /etc 以下に ipsec.conf として作成する.
( 標準ではファイルは存在しない.また,/etc 以下では無くても構わない )

Router-1 の ipsec.conf は次の様になる.
##### IPSec Config file #####

flush;
spdflush;

##### SAD Entry #####
# 192.168.1.0/24 <-> 192.168.2.0/24
add 43.244.x.34 43.244.x.139 esp 9991 -E simple "foobar";
add 43.244.x.139 43.244.x.34 esp 9992 -E simple "foobar";

##### SPD Entry #####
# 192.168.1.0/24 <-> 192.168.2.0/24
spdadd 192.168.1.0/24 192.168.2.0/24 any -P out ipsec esp/tunnel/43.244.x.34-43.244.x.139/require;
spdadd 192.168.2.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/43.244.x.139-43.244.x.34/require;

Router-2 の ipsec.conf は次の様になる.
##### IPSec Config file #####

flush;
spdflush;

##### SAD Entry #####
# 192.168.1.0/24 <-> 192.168.2.0/24
add 43.244.x.34 43.244.x.139 esp 9991 -E simple "foobar";
add 43.244.x.139 43.244.x.34 esp 9992 -E simple "foobar";

##### SPD Entry #####
# 192.168.1.0/24 <-> 192.168.2.0/24
spdadd 192.168.2.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/43.244.x.139-43.244.x.34/require;
spdadd 192.168.1.0/24 192.168.2.0/24 any -P in ipsec esp/tunnel/43.244.x.34-43.244.x.139/require;

2つの設定を比較するとわかると思うが,SAD Entry までは両方とも同一であり, SPD Entry のみ多少の違いがある.
まずは片方で設定ファイルを作成し,コピーしてから差分を変更する方が良いであろう.
今回は2つの拠点の VPN なのでエントリが2つ分しかないが,3つ,4つと増える毎に SAD Entry 及び,SPD Entry に追加する必要がある.
このファイルの内容を実行するには setkey -f /etc/ipsec.conf とする.
ipsec.conf ( setkey ) の詳しい説明はFreeBSD 日本語マニュアルを参照すると良いであろう.

SPD の確認

現在の IPSec のルールを確認するには setkey -D 及び setkey -DP を使う.
以下は Router-2 で実行した場合の表示である.
% setkey -D
43.244.x.139 43.244.x.34
        esp mode=any spi=9992(0x00002708) reqid=0(0x00000000)
        E: null  686f6765 6765
        seq=0x00000012 replay=0 flags=0x00000040 state=mature
        created: Oct  1 01:46:01 2003   current: Oct  1 18:25:09 2003
        diff: 59948(s)  hard: 0(s)      soft: 0(s)
        last: Oct  1 17:30:24 2003      hard: 0(s)      soft: 0(s)
        current: 2040(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 18   hard: 0 soft: 0
        sadb_seq=1 pid=36323 refcnt=2
43.244.x.34 43.244.x.139
        esp mode=any spi=9991(0x00002707) reqid=0(0x00000000)
        E: null  686f6765 6765
        seq=0x00000000 replay=0 flags=0x00000040 state=mature
        created: Oct  1 01:46:01 2003   current: Oct  1 18:25:09 2003
        diff: 59948(s)  hard: 0(s)      soft: 0(s)
        last: Oct  1 11:09:55 2003      hard: 0(s)      soft: 0(s)
        current: 876(bytes)     hard: 0(bytes)  soft: 0(bytes)
        allocated: 11   hard: 0 soft: 0
        sadb_seq=0 pid=36323 refcnt=1

% setkey -DP
192.168.1.0/24[any] 192.168.2.0/24[any] any
        in ipsec
        esp/tunnel/43.244.x.34-43.244.x.139/require
        spid=5 seq=1 pid=36334
        refcnt=1
192.168.2.0/24[any] 192.168.1.0/24[any] any
        out ipsec
        esp/tunnel/43.244.x.139-43.244.x.34/require
        spid=4 seq=0 pid=36334
        refcnt=1

動作の確認

Router-1 と Router-2 の間にトンネルを作成し,その中に経路を設定する.

Router-1 では次のようににコマンドを実行する.
% ifconfig gif0 create tunnel 43.244.x.34 43.244.x.139
% ifconfig gif0 192.168.1.254 192.168.2.254 netmask 255.255.255.255
% route add 192.168.2.0/24 192.168.2.254

Router-2 では次のようにコマンドを実行する.
% ifconfig gif0 create tunnel 43.244.x.139 43.244.x.34
% ifconfig gif0 192.168.2.254 192.168.1.254 netmask 255.255.255.255
% route add 192.168.1.0/24 192.168.1.254

以上でトンネルが作成され,ルーティングも設定された状態になった.
Router-1 のクライアントから,Router-2 のクライアントまで Ping を打ち,echo reply が帰ってくれば成功である.

再起動時の為に

/etc/rc.conf に以下のように追加し,再起動時に VPN が有効になる様に設定する.
Router-1 では次のようになる.
ipsec_enable="YES"

gif_interfaces="gif0"
gifconfig_gif0="43.244.x.34 43.244.x.139"
ifconfig_gif0="192.168.1.254 192.168.2.254 netmask 255.255.255.255"

static_routes="vpn1"
route_vpn1="192.168.2.0/24 192.168.2.254"


Router-2 では次のようになる.
ipsec_enable="YES"

gif_interfaces="gif0"
gifconfig_gif0="43.244.x.139 43.244.x.34"
ifconfig_gif0="192.168.2.254 192.168.1.254 netmask 255.255.255.255"

static_routes="vpn1"
route_vpn1="192.168.1.0/24 192.168.1.254"


static_routes を既に設定している場合は,適宜変更して記述する事

また,ipsec.conf を /etc 以外( /usr/local/etc 等 )に作成した場合は rc.conf に次の行をさらに追加する.
ipsec_file="/usr/local/etc/ipsec.conf"

まとめ

以上で FreeBSD を Router とした VPN の構築は完了した.
FreeBSD と市販の Router 間での VPN の場合は暗号鍵を交換する daemon である racoon をインストール,設定する必要がある.
自分の場合は市販 Router との接続予定は無いので,racoon の設定はしばらく予定が無いが,インストールした際は別のページを用意して纏めてみようと思う.

Index に戻る


http://www.seichan.org/ 2003年 10月 1日