2006年5月6日土曜日

(FreeBSD) 実家と自宅をvtunでVPN接続

ゴールデンウィーク特別企画!?ちょうど帰省中ということで・・・
実家内LANと自宅内LANとを、VPN接続でつないじゃう方法。



vtunというソフトを使って、2つのプライベートネットワーク同士を、インターネットを介して、接続できます。



Windowsのファイル共有とか、netmeetingなど、NATではうまく使えないようなソフトも、VPN接続しちゃうと、軽々使えるようになっちゃいます。実用的かどうかは別の話ですけど。



こんな感じのネットワークを想定しています。



Vtund





■ vtunのインストール



FreeBSDのportsになっているので、いつもと同様に、こんなかんじ。

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

自宅と実家の2カ所にある、2台のFreeBSDマシンに両方ともインストールします。



■ /usr/local/etc/vtund.confの設定



どっちでもいいのですが、とりあえず、



  • 接続を待ち受ける側(サーバ)として、図の192.168.0.21のIPアドレスを持つFreeBSD0というマシン


  • 接続しに行く側(クライアント)としては、図の192.168.1.40のIPアドレスを持つFreeBSD1というマシン


ということにしておきます。



vtundは、VPN接続用に、新たにネットワークインターフェイス(tun0など)をつくります。そのtun0というネットワークインターフェイスに対して、それぞれ、10.0.0.1、10.0.0.2というIPアドレスを割り振りました(point to pointなので、たぶん、両端に同じIPアドレスを割り振ってもかまわないかも)。



○ サーバ側のvtund.conf



こんなかんじの設定を追加します。



tun-ttt {
  passwd 秘密の合い言葉;
  compress lzo:5;
  type tun;
  proto tcp;
  keepalive yes;
  encrypt yes;
  stat yes;
  up {
        ifconfig "%% 10.0.0.1 10.0.0.2 netmask 0xffffffff mtu 1450";
        route "add -net 192.168.1.0 -netmask 255.255.255.0 10.0.0.2";
  };
  down {
        ifconfig "%% delete down";
        route "delete -net 192.168.1.0 -netmask 255.255.255.0";
  };
}



「tun-ttt」というのは、このVPN接続に対してつけた、テキトウな名前です。



パスワードが書き込まれているので、他人に見られないようにするために、ファイルのパーミッションを落としておきます。

# chmod 600 vtund.conf



○ クライアント側のvtund.conf



「秘密の合い言葉」は、サーバ側と同じものを指定します。



tun-ttt {
  passwd 秘密の合い言葉;
  type tun;
  comp lzo:5;
  encr yes;
  persist no;
  up {
        ifconfig "%% 10.0.0.2 10.0.0.1 mtu 1450";
        route "add -net 192.168.0.0 -netmask 255.255.255.0 10.0.0.1";
  };
  down {
        ifconfig "%% delete down";
        route "delete -net 192.168.0.0 -netmask 255.255.255.0";
  };
}



こちらも同様、他人に見られないようにするために、ファイルのパーミッションを落としておきます。

# chmod 600 vtund.conf



■ /etc/rc.confの設定



サーバ側、クライアント側ともに、IPルーターとして動くように設定しなければなりません。通常のEthernetのインターフェイスと、VPN接続用のインターフェイスの、2本を持つことになり、2つのインターフェイス間で、パケットのルーティングをする必要があるからです。



○ サーバ側のrc.confに追加

gateway_enable="YES"
vtund_enable="YES"

○ クライアント側のrc.confに追加

gateway_enable="YES"



■ ADSLルータの設定(NATとルーティング)



○ NAT



vtundが、TCP(vtund.confでの設定によってはUDP)のポート番号5000を使います。このパケットが、vtundを実行するFreeBSDへ送られるように、ADSLルータのNATの設定をします。



○ ルーティング



たぶんきっとあるはずの機能ですが、ADSLルータに、IPのルーティング情報を教えてあげる必要があります。



  • 192.168.0.0/24側ののネットワークでは、宛先が192.168.1.0/24と10.0.0.0/24のパケットは、(サーバ)vtundを実行する192.168.0.21のFreeBSD0へ送る


  • 192.168.1.0/24側ののネットワークでは、宛先が192.168.0.0/24と10.0.0.0/24のパケットは、(クライアント)vtundを実行する192.168.1.40のFreeBSD1へ送る


というようなルールを、それぞれのADSLルータで設定します。



たとえば、こんな感じです(192.168.1.1のルータで設定した内容)。



Vtund2







■ ダイナミックDNSサービスとか



サーバ側のグローバルIPアドレスがわからないと、そもそも接続できませんから、それを知るための手段として、ダイナミックDNSサービスとかを利用するとよろしいかと。



固定IP接続を使っているなら、気にしなくていい話です。





■ vtundの実行



サーバ側では、vtundが自動起動するようにしておきます。こんな感じで動いているはずです。



(サーバ側)# ps ax | grep vtun
685  ??  Is     0:00.02 vtund: waiting for connections on port 5000 (vtund)



クライアント側では、こんな風に実行。



# /usr/local/sbin/vtund tun-ttt ttt.example.com



tun-ttt」は、vtund.confファイルで指定した名前です。ttt.example.comは、サーバ側のホスト名(もしくはグローバルIPアドレス)。さきほどダイナミックDNSとか言ってたのは、ここで必要になるからです。



うまくいけば、ifconfig -aを実行してみると、tun0というようなインターフェイスが出現するはずです。



(クライアント側で実行した場合)
# ifconfig -a
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.1.40 netmask 0xffffff00 broadcast 192.168.1.255
        inet6 うんたら%fxp0 prefixlen 64 scopeid 0x1
        ether かんたら
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1450
        inet 10.0.0.2 --> 10.0.0.1 netmask 0xff000000
        inet6 ほげ%tun0 prefixlen 64 scopeid 0x4
        Opened by PID 59758





図の、PC1から、PC0にtracerouteした例。



nhh@PC1 % traceroute 192.168.0.23
traceroute to 192.168.0.23 (192.168.0.23), 64 hops max, 40 byte packets
1  FreeBSD1 (192.168.1.40)  0.452 ms  0.398 ms  0.202 ms
2  vpn-ttt (10.0.0.1)  43.607 ms  44.634 ms  43.883 ms
3  PC0 (192.168.0.23)  43.521 ms  44.230 ms  44.022 ms



■ さいごに



こんなかんじのことを、もう2~3年くらいやってますが、そこそこ便利です。



たま~に、うまくネットワークが通じていないことがあるので(ADSLでIPアドレスが変化したときとか)、そのときは、サーバ側で、もはやうまく動いていないと思われるvtund(コネクションごとにvtundがforkするようなので、そのうちのどれか1つ)をkillすると、またVPN接続が復活するようです。





■ 参考





0 件のコメント:

コメントを投稿