簡単にVPNを構築できるツール、tinc

  tinc を使えば、仮想プライベートネットワーク(Virtual Private Network:VPN)を構築できる。VPNでは、2台のコンピュータがインターネットのような安全でないネットワークを介して通信するが、仮想ネットワーク上のホスト間のトラフィックはすべて暗号化される。

 tincは、ノートPCを自宅のWi-Fi(無線LAN)ルータに接続する場合にも使える。すでにWPA2を利用して、正当なホストしか無線LANルータに接続できないようにしているかもしれない。だが、無線LANに接続するノートPCに固定アドレスを割り当てることはできないだろう。そのため、ノートPC自体のSSHデーモンに接続したり、ノートPC上のNFS共有フォルダにアクセスしたりするには、無線LANルータがそのノートPCに割り当てたIPアドレスを割り出さなければならない。だが、ノートPCと自宅のサーバでtincを起動しておけば、こうした推測は不要になる。ノートPCの固定のVPN IPアドレスを使って接続できるからだ。

 tincでは、マシンごとに複数のVPNを構築し、個別に起動することができる。tincに必要なカーネル側の機能は、ユニバーサルTUN/TAPドライバだけである。このドライバは、カーネルモジュールとしてディストリビューションのカーネルパッケージ内にたいてい用意されている。このカーネルモジュールが利用可能かどうかを確かめるには、rootとして「modprobe tun」を実行したうえでdmesgの内容をチェックする。そこにTUN/TAPドライバに関する記述があれば、デバイス「/dev/net/tun」が追加されている。見つからない場合は、カーネルをコンパイルする必要があるだろう。

 tincのパッケージは、Ubuntu GutsyのUniverseリポジトリに収録されているほか、openSUSEユーザであれば1-Clickインストールという手軽な方法が使える。また、Fedora 7用はあるが今のところFedora 8用はない。ソースからビルドする場合は、lzo、openssl、zlibの開発版パッケージをインストールしておくこと(でないとMakefileを生成できない)。また、プレフィックスや各種パスを「./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var」のように明示的に指定する必要があるだろう。

 tincによって新たなVPNを構築すると、新しいネットワークインタフェースが設定される。VPN上への情報の送信には、カーネルによる通常のパケットルーティングが使われる。たとえば、192.168.1.222~192.168.1.232のアドレスプールからランダムにIPアドレスが割り当てられるノートPCが1台あるとする。ローカルネットワークには1台のサーバが接続されており、このサーバは192.168.1.221という固定IPアドレスを持つ。ここでサブネット192.168.11.0/24をVPN用に使うとすると、たとえばサーバには192.168.11.100、ノートPCには固定の192.168.11.7を割り当てることができる。

 これでサーバは、ネットワークインタフェースカード(NIC)に割り当てられた192.168.1.221とVPN IPアドレスとして割り当てられた192.168.11.100という2つのIPアドレスを持つことになる。ノートPCのほうは、無線LANルータへの接続時に192.168.1.222~192.168.1.232のいずれかのアドレスが与えられるが、VPN IPアドレスとしては常に192.168.11.7を使用する。LAN上のほかのホストは、サブネット192.168.11.0/24宛てのトラフィックを上記のサーバに送信すれば、ノートPCのVPNアドレス192.168.11.7を使ってノートPC上のサービスに接続できるはずである。またノートPC側では、先ほどのサーバをデフォルトルートの転送先にするなどして、トラフィックが適切にサーバにルーティングされるようにする必要がある。

 tincでは、VPNを作成するたびに設定ファイルが「/etc/tinc」のサブディレクトリ(VPN名がその名前になる)内に用意される。このように設定ディレクトリがネットワーク名によって分けられることで、ネットワーク別の設定ファイルをマージしなくても複数のVPNを起動できる。tinc自体の利用形態はクライアント/サーバモデルに限定されてはいないが、サーバマシンはノートPCのIPアドレスを事前に知っているわけではなく、自分からはVPN接続を開始できないので、ノートPCをクライアントと見なすとわかりやすい。

 ここからは、サーバ側の設定ファイルについて説明する。以下の例では、VPNの名前を「my_home_vpn」としている。「/etc/networks」内の各ネットワークに名前を付け、tincの設定でも同じ名前を使うようにするとよい。「/etc/networks」にエントリを追加しておけば、「route」のようなコマンドの出力が見やすくなる。サーバ側「tinc.conf」ファイルの内容がきわめて単純なのは、tincデーモンがすべてのネットワークインタフェースでクライアントからの接続待ちを行うからだ。

 tincは、各種スクリプトが使える場合には、それらを呼び出して特定のタスクを実行する。たとえば、VPN接続の確立にはtinc-upスクリプトが、切断にはtinc-downが使用される。これらのスクリプトによって、ルーティングテーブルの変更、NFS共有フォルダのマウント/アンマウント、通知用メッセージの表示など、さまざまな処理を行わせることができる。tinc-upとtinc-downの両スクリプトは「/etc/tinc/my_home_vpn」ディレクトリにある(パスの最後の要素は指定したVPN名になる)。tinc-upスクリプトの内容は、どんなホストでもほぼ同じだ。違いはVPN起動時にtincのネットワークインタフェースに割り当てるIPアドレスだけで、このサーバでは192.168.11.100となる。tinc-downスクリプトのほうは、どのホストでも同じ内容でよい。

 この例では、VPN上のホストがサーバとノートPCの2台しかない。サーバの設定ファイル名はtincserverであり、これはtinc.confファイルに記された「Name」パラメータに一致させる必要がある。ノートPC用の設定ファイルは、そこに指定されたIPアドレス宛てのトラフィックだけをそのPCにルーティングするようにtincに指示すると共に、そのマシンの公開鍵の情報も持つ。クライアントの公開鍵は、「tinc.conf」ファイルが用意されていれば「tincd -n my_home_vpn -K」コマンドで生成できる。ノートPC用設定ファイルに記述する公開鍵は、ノートPCの「/etc/tinc/my_home_vpn/hosts/laptop」というファイルから取得すればよい。同様に、サーバ側の公開鍵を生成すると、サーバマシンの「/etc/tinc/my_home_vpn/hosts/tincserver」というファイルに公開鍵が出力される。これらの公開鍵は秘密鍵ではないので、双方のマシンの設定ファイルに追加しておくとよいだろう。そうすれば、どちらのマシンでもファイルの内容がまったく同じになって都合がよい。以下に、サーバ側の各設定ファイルの内容を示す。

# cat /etc/networks
default 0.0.0.0
loopback 127.0.0.0
my-home-vpn 192.168.11.0

# cd /etc/tinc/my_home_vpn
# cat tinc.conf
Name = tincserver
# cat tinc-up
#!/bin/sh
ifconfig $INTERFACE 192.168.11.100 netmask 255.255.255.0
# cat tinc-down
#!/bin/sh
ifconfig $INTERFACE down

# cd hosts
# cat tincserver
Address = tincserver
Subnet = 192.168.11.0/24
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

# cat laptop
Subnet = 192.168.11.7/32
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

 サーバ側の設定は以上だ。ノートPC側では、tinc.confとtinc-upの2つのファイルを変更するだけでよい。tinc.conf内のマシン名を変えるのは当然として、tinc-upにはtincserverマシンに接続するための記述を追加する(以下を参照)。その他の設定ファイルについては、マニュアルを参照してほしい。

# cd /etc/tinc/my_home_vpn
# cat tinc.conf
Name = laptop
ConnectTo = tincserver
# cat tinc-up
#!/bin/sh
ifconfig $INTERFACE 192.168.11.7 netmask 255.255.255.0

 最初にVPNをテストする際には、以下のようにtincをデバッグモードにしてフォアグラウンドで実行し、問題なく接続できるか確認するとよい。tincdを次のようにして実行したコンソールでCtrl+cキーを押すと、tincはverboseモードになり、パケットの取得や送出がわかるようになる。

/usr/sbin/tincd -n my_home_vpn -D

 tincによる接続が確立されると、マシンに新しいネットワークインタフェースが設定され、VPN上の各マシンへの新たなルートが出来上がる。tincによってVPN接続が確立されているときのノートPC側のネットワークの設定内容を以下に示す。

# ifconfig
eth1      Link encap:Ethernet  HWaddr ...
...
my_home_vpn Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.11.7  P-t-P:192.168.11.7  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
my-home-vpn     *               255.255.255.0   U     0      0        0 my_home_vpn
link-local      *               255.255.0.0     U     0      0        0 eth1

# ping 192.168.11.100
PING 192.168.11.100 (192.168.11.100) 56(84) bytes of data.
64 bytes from 192.168.11.100: icmp_seq=1 ttl=64 time=1.77 ms
64 bytes from 192.168.11.100: icmp_seq=2 ttl=64 time=0.659 ms

--- 192.168.11.100 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.659/1.216/1.773/0.557 ms

# ssh hachiko@192.168.11.100
...

 tinc.confファイルの内容が単純で、tincのhostsディレクトリ内にある各ファイルの記述をマシンごとに変えなくてよいので、2台のホストによるVPNの設定はごく短時間で済む。マスカレードによるファイアウォールで保護されたマシンでtincによるVPNを構築する設定例が参考になるだろう。また、tincを使ってネットワークスイッチの動作を再現し、VPNを特殊なネットワークアプリケーションで使うことも可能だ。割り当てられるIPアドレスが不確実になりがちなノートPCやモバイル機器上のサービスに接続できるtincは、すでにネットワークのセキュリティが(WPA2などで)保護されている場合にも役立つ。

Ben Martinは10年以上前からファイルシステムに携わっている。博士号を持ち、現在はlibferris、各種ファイルシステム、検索ソリューションを中心としたコンサルティング業務に従事。

Linux.com 原文(2008年4月11日)