ゴールデンウィーク特別企画!?ちょうど帰省中ということで・・・
実家内LANと自宅内LANとを、VPN接続でつないじゃう方法。
vtunというソフトを使って、2つのプライベートネットワーク同士を、インターネットを介して、接続できます。
Windowsのファイル共有とか、netmeetingなど、NATではうまく使えないようなソフトも、VPN接続しちゃうと、軽々使えるようになっちゃいます。実用的かどうかは別の話ですけど。
こんな感じのネットワークを想定しています。
■ 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のルータで設定した内容)。
■ ダイナミック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 件のコメント:
コメントを投稿