FreeBSDを Router として vtund を用いて VPN ルータを作成してみた.

今回は,前回の IPSec での VPN ではなく,vtund というプログラムを利用して VPN 環境を構築する.

今回の構成

VPNイメージ
Client1 と Client2 を VPN でトンネリングする形となり,Router となるホストは ipfw 等を用いてファイアウォールを構成する.
vtund はサーバ,クライアント型のプログラムの為,Router-1 を vtun サーバ.Router-2 を vtun クライアントとした.
機器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 )

カーネルコンパイル

vtund を用いて VPN を利用するには,カーネルで tun を有効にしなければならない.
( デフォルトで有効な為,特にカーネルコンパイルは必要ない ) ADSL 等で PPPoE を利用している場合は,そのカーネルがそのまま使えるはずである.

vtun のインストール

ports からインストールするのが簡単だろう
ports ツリーは最新ですか?

cd /usr/ports/net/vtun
make
make install

vtund 設定ファイル

vtund は /usr/local/etc 以下に vtund.conf を用意し,その中に設定を行う.

Router-1 の ipsec.conf は次の様になる.
options {
        port            5000;
        ifconfig        /sbin/ifconfig;
        route           /sbin/route;
        syslog          daemon;
}

default {
        type            tun;
        proto           tcp;
        compress        lzo:6;
        keepalive       yes;
        encrypt         yes;
        stat            yes;
}

vpn {
        pass            hogege;
        device          tun1;

        up {
                ifconfig "%% 192.168.254.1/32 192.168.254.2 mtu 1450";
                route "add -net 192.168.2.0/24 192.168.254.2";
        };

        down {
                ifconfig "%% delete down";
                route "delete 192.168.2.0/24";
        };
}

Router-2 の ipsec.conf は次の様になる.
options {
        port            5000;
        ifconfig        /sbin/ifconfig;
        route           /sbin/route;
        syslog          daemon;
}

default {
        type            tun;
        proto           tcp;
        compress        lzo:6;
        keepalive       yes;
        encrypt         yes;
        stat            yes;
}

vpn {
        pass            hogege;
        device          tun1;

        up {
                ifconfig "%% 192.168.254.2/32 192.168.254.1 mtu 1450";
                route "add -net 192.168.1.0/24 192.168.254.1";
        };

        down {
                ifconfig "%% delete down";
                route "delete 192.168.1.0/24";
        };
}

2つの設定を比較するとわかると思うが,options,default のセクションは同一で,vpn セクションのみ多少の違いがある.
まずは片方で設定ファイルを作成し,コピーしてから差分を変更する方が良いであろう.
今回は2つの拠点の VPN なのでエントリが1つ分しかないが,3つ,4つと増える毎に vpn2,vpn3 のように追加する必要がある.
今回は,プロトコルに TCP を用いているが,UDP の方がプロトコルの仕様上スピードの面で有利であろう.また,VPN 間のパケットはほぼ TCP が流れるだろうから,その面でも UDP にしておいた方が無難であると思う.
TCP にはパケットロスの際の再送機能がある為,VPN 通信を TCP ではり,その中も TCP が流れると,もしパケットロスが起きた場合は再送要求が2つ出る事になる為である.OS のネットワーク周りが混乱する可能性があるだろう.

vtund の起動

vtund を起動し,VPN を利用できるようにする.
まず,Router-1 側で以下の通りのコマンドを実行する.
/usr/local/sbin/vtund -s

vtund の起動が ps コマンド等で確認出来たら,Router-2 の vtund を起動する.
/usr/local/sbin/vtund vpn 43.244.x.34

Router-2 の vtund の起動方法を見てもらうと判るが,VPN セクション名と,接続先の IPアドレスを指定しているのがわかる.VPN セクション名を指定することで,サーバとクライアントの数あるセクションの内,どのセクションを使うのかを指定している訳である.

動作の確認

さて,双方の vtund を起動した後 ifconfig -a の結果を見ると,tun デバイスが生成され,VPN を張っているのが確認できるだろう.

Router-1 側では,この様になる.
tun1: flags=8051 mtu 1450
        inet 192.168.254.1 --> 192.168.254.2 netmask 0xffffffff
        Opened by PID 84449

Router-2 側では,この様になる.
tun1: flags=8051 mtu 1450
        inet 192.168.254.2 --> 192.168.254.1 netmask 0xffffffff
        Opened by PID 76368

双方のクライアントから,ping 等を実行し返事が返ってきたら,問題なく VPN 環境が構築出来ている.

まとめ

以上で FreeBSD を Router とした vtund による VPN の構築は完了した.
vtund はオープンソースプログラムな為,FreeBSD 以外の Unix系 OS でも利用可能な為,前回の IPSec を利用した VPN よりも汎用性がある.
一方を FreeBSD,もう一方を Linux というような構成も可能な為,こちらを利用する事をお勧めする.

Index に戻る


http://www.seichan.org/ 2004年 12月 1日