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 で十分と思って利用しています.用途・要件に応じて選択していけばよいと思います.
コメント