FreeBSD で vtun を使って VPN 構築する方法

FreeBSD

vtun というソフトウェアを利用した VPN を構成してみます.元々ブログ外で書いていたのですが説明を端折っていたのでブログで書き直します.

vtun は「Virtual Tunnel」の略称でその名のとおり,IP ネットワークでトンネルを張る為のプログラムです.オープンソースで公開されており,FreeBSD に限らず Linux でも利用が可能です.

暗号化,圧縮,帯域制御など最低限の機能は持っています.

vtun を導入する

このようなネットワークの VPN を構成してみたいと思います.
以下,サーバーと書いているのは左側,クライアントと書いてあるのは右側を指します.


FreeBSD ではパッケージとして簡単に導入することが可能です.サーバー,クライアントとも pkg install vtun でパッケージを導入してください.

# pkg install vtun
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        lzo2: 2.10_1
        vtun: 3.0.4_8

Number of packages to be installed: 2

Proceed with this action? [y/N]: y
[1/2] Installing lzo2-2.10_1...
[1/2] Extracting lzo2-2.10_1: 100%
[2/2] Installing vtun-3.0.4_8...
[2/2] Extracting vtun-3.0.4_8: 100%
#

vtun を構成する (サーバー側)

設定ファイルは /usr/local/etc/vtund.conf になります.パッケージを入れた直後の設定ファイルは解説込みでとても長いのでまっさらな状態から作成したほうが良いです.

サーバー側の設定ファイルはこのようになります.

# cat /usr/local/etc/vtund.conf

options {
  port        5000;
  bindaddr    { iface vmx0; };
  syslog      daemon;
  ifconfig    /sbin/ifconfig;
  route       /sbin/route;
}

default {
  type        tun;
  proto       tcp;
  persist     yes;
  keepalive   yes;
  compress    lzo:1;
  encrypt     yes;
  stat        yes;
  speed       0;
}

tokyo-osaka {
  password  P@ssw0rd!;
  device    tun0;
  up {
    ifconfig "%% 172.16.255.1/32 172.16.255.2 mtu 1440";
    route "add -net 192.168.2.0/24 172.16.255.2";
  };
  down {
    ifconfig "%% delete down";
    route "delete -net 192.168.2.0/24";
  };
}

options ブロック

  • port
    サーバーで待ち受けるポート番号です.今回の例だと 5000 番で待ち受けます
  • bindaddr
    どのアドレスで待ち受けるかを指定できます.今回は iface vmx0 と vmx0 インターフェイスを利用するよう指定をしています
  • syslog
    syslog のファシリティを指定します
  • ifconfig
    ifconfig コマンドのパスを指定します
  • route
    route コマンドのパスを指定します

ifconfig / route のみ今回利用していますが,同様に ppp や firewall というオプションがあり,それぞれパスを指定できるようになっています.

default ブロック

デフォルト値として定義するものを纏めるブロックになります.

  • type tun
    tun は tunnel デバイスを利用する宣言になります.そのほかに ether,tty,pipe を指定することができますが,ほぼ tun の利用になるかと思います.
  • proto tcp
    トンネルを張る際に利用するプロトコルを指定します.tcp または udp を指定可能です.パフォーマンスの観点だと udp が良いです.クライアント側が IPoE を利用している場合 udp は利用ができないため tcp を指定しています.
    PPPoE 環境の場合は udp の指定が可能です.
  • persist yes
    セッションを張りなおすかの設定です.本来はクライアント側の設定になります.セッションが切れた場合再度接続を行うのかを yes または no で指定します.
  • keepalive yes
    セッションを維持するかの設定です.サーバー側の設定になります.yes,no もしくは数字を入れます.yes の場合は 30:4 という指定と同義になり,30 秒毎にキープアライブのパケットを送信します.4回試行して成功しない場合は切断されます.
  • compress lzo:1
    コネクションの圧縮を行うかを指定できます.yes,no の他,zlib と lzo が指定可能です.
    zlib は tcp のみ利用可能です.zlib,lzo とも圧縮率を指定できます lzo:1 が圧縮率が低いけど CPU 負荷が低い,lzo:6 が圧縮率は高いけど CPU 負荷も高い.という形です.
  • encrypt yes
    暗号を行うのかを yes,no で指定できます.
  • stat yes
    yes の場合,5分毎にステータスログを出力します.
  • speed 0
    帯域制限を行う場合は 0 以外の値を入れることができます. 単位は Kbit/sec です.

プロファイル ブロック (なんて呼べばいいのだろう)

  • tokyo-osaka
    接続プロファイルの名称です.
  • password
    VPN セッションを張る際の共通パスワードです.
  • device tun0
    このセッションで利用するトンネルデバイスを指定します.
  • up
    インターフェイスが UP した際 (接続された際) 記載したコマンドが実行されます.
    今回は ifconfig でアドレス設定と route コマンドでの静的ルートの追加を行います.
  • down
    インターフェイスが DOWN した際 (切断された際) 記載したコマンドが実行されます.
    今回は作成されたインターフェイスの削除とルートの削除を行います.

サービスの起動

設定ファイルの準備ができたらサービスを起動させます.
/etc/rc.conf に次の行を追加します.

vtund_enable="YES"
vtund_flags="-s"

続いて,次のコマンドを実行してサービスを起動させます.

# /usr/local/etc/rc.d/vtund start
Starting vtund.

# ps -ax | grep vtun
1569  -  Ss     0:00.00 vtund: waiting for connections on port 5000 (vtund)

vtun を構成する (クライアント側)

続いてクライアント側の設定ファイルです.サーバー側とほぼ変わらず,最後のセクションで実行するコマンドが違っています.

options {
  port        5000;
  bindaddr    { iface vmx0; };

  syslog      daemon;

  ifconfig    /sbin/ifconfig;
  route       /sbin/route;
}

default {
  type        tun;
  proto       tcp;
  persist     yes;
  keepalive   yes;
  compress    lzo:1;
  encrypt     yes;
  stat        yes;
  speed       0;
}

tokyo-osaka {
  password  P@ssw0rd!;
  device    tun0;
  up {
    ifconfig "%% 172.16.255.2/32 172.16.255.1 mtu 1440";
    route "add -net 192.168.1.0/24 172.16.255.2";
  };
  down {
    ifconfig "%% delete down";
    route "delete -net 192.168.1.0/24";
  };
}

サービスの起動

クライアント側の設定ファイルの作成が終わったらサービスの起動を行います.
/etc/rc.conf に次の行を追加します.

vtunclient_enable="YES"
vtunclient_list="site1"
vtunclient_site1_flags="tokyo-osaka 192.168.250.253"
vtunclient_site1_pidfile="/var/run/vtun-site1.pid"

vtunclient_list は複数のセッションを張る場合 “site1 site2” とスペース区切りで記載することができます.
vtunclient_<区切り名>_flags というように次に続いていきます.
vtunclient_site1_flags は接続時に利用するプロファイルおよび vtun サーバーのアドレスを記載します.

/etc/rc.conf の準備が終わったらサービスを起動します.

# /usr/local/etc/rc.d/vtunclient start
Starting vtunclient.

# ps -ax | grep vtun
1976  -  S<s    0:00.00 vtund: tokyo-osaka tun tun0 (vtund)

接続を確認する

両方のサービスの起動が完了したら接続状況を確認します.

サーバー側およびクライアント側

tunX デバイスが生成されていること,IP アドレスが設定されていることを確認します.

# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1440
        options=80000<LINKSTATE>
        inet 172.16.255.1 --> 172.16.255.2 netmask 0xffffffff
        groups: tun
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        Opened by PID 1579

また,スタティックルートが追加されていることを確認します.

# netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            192.168.250.254    UGS        vmx0
127.0.0.1          link#4             UH          lo0
172.16.255.1       link#5             UHS         lo0
172.16.255.2       link#5             UH         tun0
192.168.1.0/24     link#2             U          vmx1
192.168.1.254      link#2             UHS         lo0
192.168.2.0/24     172.16.255.2       UGS        tun0
192.168.250.0/24   link#1             U          vmx0
192.168.250.253    link#1             UHS         lo0

ping などでの確認

ping などを利用してお互いに通信が出来るかを確認しましょう

# ping 172.16.255.2
PING 172.16.255.2 (172.16.255.2): 56 data bytes
64 bytes from 172.16.255.2: icmp_seq=0 ttl=64 time=0.622 ms
64 bytes from 172.16.255.2: icmp_seq=1 ttl=64 time=0.539 ms
^C
--- 172.16.255.2 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.539/0.581/0.622/0.041 ms

# ping 192.168.2.254
PING 192.168.2.254 (192.168.2.254): 56 data bytes
64 bytes from 192.168.2.254: icmp_seq=0 ttl=64 time=0.454 ms
64 bytes from 192.168.2.254: icmp_seq=1 ttl=64 time=0.491 ms
^C
--- 192.168.2.254 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.454/0.473/0.491/0.018 ms

いかがでしょうか.vtun は難しい設定が無く割と簡単に VPN が構成できます.ただし,共有鍵であることと暗号強度は高くないのでガチの VPN を行いたい場合は別のソフトウェアを選定したほうが良いかもしれません.
自分は VPS と家を繋ぎたい目的だけなので vtun で十分と思って利用しています.用途・要件に応じて選択していけばよいと思います.

コメント

タイトルとURLをコピーしました