OpenVPN のための Solaris 用 TAP ドライバ

目次

ご注意

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

概要

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

もともとは 「Solaris で SoftEther もどきを動かそう」の仮想 HUB と 仮想 NIC デーモン間で利用するプロトコルの参考にしようと OpenVPN のコードを参照していたのですが、Solaris 用 TAP ドライバが無いことが分かったので、TUN ドライバと以前書いた仮想 NIC ドライバを元に 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 上で単にユニキャストパケット しか伝送しないのであれば、利用する側としてはほとんど差はないと思います。しかし、たとえば ブロードキャストパケットやマルチキャストパケットを伝送する必要がある場合や、 レイヤ 3 プロトコルとしてIP 以外のプロトコルを使う場合には TAP(=Ethernet ネットワークデバイス) を使う必要があります。
ほとんどの OS の場合には、この2つのドライバは一緒に配布されており、TUN、TAP デバイス共 に利用可能です。しかし、Solaris 用の TUN/TAP ドライバには残念ながら「TUN」ドライバ、つまり Point-To-Point ネットワークデバイスのドライバしか含まれておりません。

TUN/TAP ドライバの変更点

Solaris 用の TUN ドライバの最終更新日(2000/06/20)を見る限り、今後 Solaris 用の TAP ドライバ がリリースされる可能性は残念ながら少なそうです・・(やはり Solaris というところでしょうか) そこで、既存の Solaris 用 TUN ドライバを改造し、OpenVPN で利用可能な 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.gz (05/12/2006 更新)

tar ファイルに含まれるファイル
Makefile.inconfigure スクリプトが使う Makefile の雛形
configureconfigure スクリプト
if_tun.hヘッダーファイル
install-shインストール用スクリプト
tap.confTAP ドライバ用 dirver.conf(4) ファイル
tun.confTUN ドライバ用 dirver.conf(4) ファイル
tun.cドライバのソースコード

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

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

tun.cOpenVPN の TUN/TAP ドライバへの操作が書かれているソースコード

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

動作確認済み Solaris バージョン

TAP ドライバおよび 変更後の OpenVPN の動作確認状況は以下のようになっています。

プラットフォーム
Solarisバージョン
Sparc(32bit)Sparc(64bit)x86
(VMWare上での検証を含む)
Solaris 8 以前??
Solaris9
Solaris10-

○:動作確認済み ×:動作不可 ?:未確認 -:該当なし

私の環境に限りがあるので全てを調べきれてませんが、Solaris 9 以上であれば(希望も含めて)動くのではないかと思います。

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

Solaris 用 TAP(および TUN) ドライバのコンパイル

コンパイルには gcc を使います。上記の tuntap.tar.gz ファイルを展開し tuntap ディレクトリに移動後、configure, make を実行すると「tun」と「tap」という2つのドライバが 作成されます。コンパイル終了後、make install にてファイルのコピーと、システムへのデバイスの追加が行われます。 (configure スクリプトも少々変更しており、64bit Solaris で実行された場合には 32bit モジュール ではなく、64bit ドライバをビルドし、ドライバが適切な場所にコピーされるようにしています。)

# ./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 を上記の tun.c ファイルで置き換え、通常通り configure*2, make, make install を行います。

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

# ./configure --disable-lzo
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 ファイルを元に作成しておりますので、2.0.7 以外のバージョンの OpenVPN のソースコード群と一緒にコンパイルするとエラーになってしまうかもしれません。

使い方

インストール後は通常通り OpenVPN を利用可能です。 TAP デバイスを使う場合は設定ファイルに「dev tap」と指定するか、openvpn コマンドの起動オプション として「--dev tap」を指定します。
OpenVPN の設定例」に私がテストで利用した設定ファイルをサンプルとして載せてありますのでこちらも参照いただければと思います。ただこれは単純な場合の設定例ですし、私自身あまり OpenVPN の設定について詳しくないので、詳細については公式ページのマニュアルをご参照ください。
また、Google 等で検索すると Linux や BSD での設定方法について日本語で詳しく解説されているページ見がつかりますので、 そちらも参考になるのではないかと思います。


*1 本来 SAP 値は DL_UNITDATA_REQ メッセージに含まれる DLSAP アドレスから取ってくるべきですが、x86 Solaris 9 ではなぜか DLSAP アドレスに正しい SAP 値が含まれていないようなので、このように修正しました。x86 Solaris 9 のサポートを考えなければ以前のコードの方が適切と思います。
*2 私の環境では lzo(圧縮ライブラリ) がインストールされていないため、--disable-lzo を指定しています。


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