作成中

OpenVPN のための Solaris 用 TAP ドライバ/TUN ドライバの変更と OpenVPN の修正?

目次

ご注意

ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合にはシステムがパニックもしくはハングし、システムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。本プログラムの使用により発生したトラブルなど、いかなる損害についても一切の責任を負いかねます。ご利用は自己責任にてお願いいたします。

概要

OpenVPN で利用する Solaris 用の TAP デバイスのドライバと、 この Solaris 用 TAP デバイスを利用するための OpenVPN のコードの差分ファイル(tun.c のみ)です。 これらを使うことで、Solaris 上で OpenVPN を使って レイヤ 2(Ethernet レベル)の VPN を構築することが できるようになります。

もともとは 「Solaris で SoftEther もどきを動かそう」で仮想 HUB と 仮想 NIC デーモン間で利用するプロトコルの参考にしようと OpenVPN のコードを参照していていたのですが、Solaris 用の TAP デバイスが無いのがわかり、せっかくだったので、以前で書いた ste 仮想 NIC ドライバを元に TUN ドライバを TAP ドライバに改変してみることにしました。

TUN/TAP ドライバの変更

OpenVPN は 仮想ネットワークに接続するため仮想ネットワークドライバとして Universal TUN/TAP ドライバ を利用しています。 TUN/TAP ドライバは Windows/Linux/BSD/MAC 等、各 OS 上で実装されたものが公開・配布されており、 この TUN/TAP デバイスを使って OpenVPN の仮想ネットワークを構成することができます。
ドライバ名にある「TUN」と「TAP」は別々の機能を有したネットワークドライバで、 各々以下のような特徴を持っています。

TUN ドライバ
IP トンネルを行うための 仮想 Point-To-Point ネットワークデバイスのドライバ。
TAP ドライバ
Ethernet トンネルを行うための仮想 Ethernet ネットワークデバイスのドライバ。

TUN ドライバと TAP ドライバを比べた場合、VPN 上で単に IP レイヤのユニキャストのパケット しか交換しないのであれば、利用する側としてはほとんど差はないと思います。しかし、たとえば ブロードキャストパケットやマルチキャストパケットを伝送する必要がある場合や、 レイヤ 3 プロトコルとしてIP 以外のプロトコルを使う場合には TAP(=Ethernet ネットワークデバイス) を使う必要があります。
実際には、ほとんどの OS の場合この2つのドライバは一緒に配布されており、TUN、TAP デバイスとも に利用可能です。しかし、Solaris 用の TUN/TAP ドライバには「TUN」ドライバ、つまり Point-To-Point ネットワークデバイスのドライバしか含まれておりません。
Solaris 用の TUN ドライバの最終更新日(2000/06/20)を見る限り、今後 Solaris 用の TAP ドライバ がリリースされる可能性は残念ながら少なそうです・・(やはり Solaris というところでしょうか) そこで、この Solaris 用 TUN ドライバを改造し、TAP ドライバに変更してみました。

OpenVPN 側の変更

現在のところ(Version 2.0.7) OpenVPN 側も Solaris 用の TAP デバイス(/dev/tap)を処理するルーチン が存在せず、そのままでは TAP ドライバを作ったとしても OpenVPN の設定ファイルで「dev tap」などと してもエラーになってしまいます。Solaris 用の TAP ドライバが存在しないので、当然といえば当然かもしれませんが・・。 そこで、OpenVPN 側のコードも併せて変更、追加を行い、Solaris 上でも「dev tap」が利用できるように しました。

ソースコードとダウンロード

Solaris 用 TAP(および TUN) ドライバソースファイル
tuntap.tar

tar ファイルに含まれるファイル
Makefile.in
configure
configure.in
if_tun.h
install-sh
tap.conf
tun.conf
tun.c

本コードは http://vtun.sourceforge.net/tun/ の TUN/TAP ドライバのコードを元にしており、本コードの配布は GPL に準じます。

Solaris 用 TAP デバイス対応のための OpenVPN の差分ファイル

tun.c

本コードは http://openvpn.net の tun.c のコードを元にしており、本コードの配布は GPL に準じます。

コンパイル&インストール

Solaris 用 TAP(および TUN) ドライバ

コンパイルには gcc を使います。上記の tuntap.tar ファイルを展開し tuntap ディレクトリに移動後、configure, make を実行すると「tun」と「tap」という2つのドライバが 作成されます。コンパイル終了後、make install にてファイルのコピーと、システムへのデバイスの追加が行われます。

# ./configure						    
checking for gcc... gcc					    
checking for C compiler default output file name... a.out   
checking whether the C compiler works... yes		    
checking whether we are cross compiling... no		    
checking for suffix of executables...			    
checking for suffix of object files... o		    
checking whether we are using the GNU C compiler... yes	    
checking whether gcc accepts -g... yes			    
checking for gcc option to accept ANSI C... none needed	    
checking for a BSD-compatible install... ./install-sh -c    
checking for isainfo... :				    
configure: creating ./config.status			    
config.status: creating Makefile	
		    
# make                                            
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
-DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 04/23/2006\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tun.o -DTUNTAP_TUN
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
-DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 04/23/2006\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tap.o -DTUNTAP_TAP
ld -r -o tun tun.o
ld -r -o tap tap.o

# make install
ld -r -o tun tun.o
ld -r -o tap tap.o
./install-sh -c -m 644 -o root -g root if_tun.h /usr/include/net
./install-sh -c -m 644 -o root -g root tun /usr/kernel/drv/sparcv9
./install-sh -c -m 644 -o root -g root tap /usr/kernel/drv/sparcv9
./install-sh -c -m 644 -o root -g root tun.conf /usr/kernel/drv
./install-sh -c -m 644 -o root -g root tap.conf /usr/kernel/drv
/usr/sbin/rem_drv tun >/dev/null 2>&1
/usr/sbin/rem_drv tap >/dev/null 2>&1
/usr/sbin/add_drv tun
/usr/sbin/add_drv tap
#

差分ファイルを使った OpenVPN のコンパイル

特別な操作はありません。OpenVPN のダウンロードページ より OpenVPN 2.0.7 のソースコードをダウンロードしてきて展開し、展開後のディレクトリに上記の tun.c ファイルをコピーし、通常通り configure, make, make install を行います。

# unzip openvpn-2.0.7.zip
# cd openvpn-2.0.7/
# cp /download_files/tun.c .

# ./configure
checking for ifconfig... /usr/sbin/ifconfig
checking for ip... ip
checking for route... /usr/sbin/route
... 略...

# make
make  all-am
if gcc -DHAVE_CONFIG_H -I. -I. -I.    -I.  -g -O2 -MT base64.o -MD
... 略...

# make install
test -z "/usr/local/sbin" || /var/tmp/openvpn-2.0.7/install-sh -d "/usr/local/sbin"
 ./install-sh -c 'openvpn' '/usr/local/sbin/openvpn'
test -z "/usr/local/man/man8" || /var/tmp/openvpn-2.0.7/install-sh -d "/usr/local/man/man8"
./install-sh -c -m 644 './openvpn.8' '/usr/local/man/man8/openvpn.8'
#

** tun.c は OpenVPN 2.0.7 に含まれている tun.c ファイルをもとにしておりますので、それ以外のバージョンの OpenVPN のソースコード群と一緒にコンパイルするとエラーになってしまうかもしれません。



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS