-------- 作成中 -----------
OpenVPN のための Solaris 用 TAP ドライバ/TUN ドライバの変更と OpenVPN の修正?
ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合にはシステムがパニックもしくはハングし、システムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。本プログラムの使用により発生したトラブルなど、いかなる損害についても一切の責任を負いかねます。ご利用は自己責任にてお願いいたします。
OpenVPN で利用する Solaris 用の TAP ドライバと、 TAP デバイスを利用するための OpenVPN の差分ファイル(tun.c のみ)です。 これらを使うことで、Solaris 上で OpenVPN を使って レイヤ 2(Ethernet レベル)の VPN を構築することが できるようになります。
もともとは 「Solaris で SoftEther もどきを動かそう」の仮想 HUB と 仮想 NIC デーモン間で利用するプロトコルの参考にしようと OpenVPN のコードを参照していたのですが、Solaris 用 TAP ドライバが無いことが分かったので、TUN ドライバと以前書いた仮想 NIC ドライバを元に TAP ドライバを作ってみることにしました。 |
OpenVPN は 仮想ネットワークに接続するため仮想ネットワークドライバとして
Universal TUN/TAP ドライバ (もしくは互換ドライバ)を利用しています。
TUN/TAP ドライバは Windows/Linux/BSD/MAC 等、各 OS 上で実装されたものが公開・配布されており、
この TUN/TAP デバイスを使って OpenVPN の仮想ネットワークを構成することができます。
ドライバ名にある「TUN」と「TAP」は別々の機能を有したネットワークドライバで、
各々以下のような特徴を持っています。
TUN ドライバと TAP ドライバを比べた場合、VPN 上で単にユニキャストパケット
しか伝送しないのであれば、利用する側としてはほとんど差はないと思います。しかし、たとえば
ブロードキャストパケットやマルチキャストパケットを伝送する必要がある場合や、
レイヤ 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 ドライバを改造し、OpenVPN で利用可能な TAP ドライバを作成いたしました。
主な変更点は以下のとおりです。
現在のところ(Version 2.0.7) OpenVPN 側も Solaris 用の TAP デバイス(/dev/tap)を処理するルーチン が存在せず、そのままでは TAP ドライバを作ったとしても OpenVPN の設定ファイルで「dev tap」などと してもエラーになってしまいます。Solaris 用の TAP ドライバが存在しないので、当然といえば当然かもしれませんが・・。 そこで、OpenVPN 側のコードも併せて変更、追加を行い、Solaris 上でも「dev tap」が利用できるように しました。主な変更点は以下のとおりです。
Ethernet ネットワークデバイスとして plumb するのに必要な処理については OpenSolaris の ifconfig コマンドのソースと、ifconfig に対する truss(1M) コマンドの出力を参考にしています。全ての Solaris バージョンに通用するのかは疑問ですが、少なくとも Solaris 9 と Solaris 10、OpenSolaris 上では期待通りに動作するようです。
tar ファイルに含まれるファイル | |
Makefile.in | configure スクリプトが使う Makefile の雛形 |
configure | configure スクリプト |
if_tun.h | ヘッダーファイル |
install-sh | インストール用スクリプト |
tap.conf | TAP ドライバ用 dirver.conf(4) ファイル |
tun.conf | TUN ドライバ用 dirver.conf(4) ファイル |
tun.c | ドライバのソースコード |
本コードは http://vtun.sourceforge.net/tun/ の TUN/TAP ドライバのコードを元にしており、本コードの配布は GPL に準じます。
tun.c | OpenVPN の TUN/TAP ドライバへの操作が書かれているソースコード |
本コードは http://openvpn.net の tun.c のコードを元にしており、本コードの配布は GPL に準じます。
TAP ドライバおよび 変更後の OpenVPN の動作確認状況は以下のようになっています。
プラットフォーム Solarisバージョン | Sparc(32bit) | Sparc(64bit) | x86 (VMWare上) |
Solaris 8 以前 | ? | ? | ? |
Solaris9 | ○ | ○ | ? |
Solaris10 | - | ○ | ○ |
○:動作確認済み ×:動作不可 ?:未確認 -:該当なし
私の環境に限りがあるので全てを調べきれてませんが、Solaris 9 以上であれば(希望も含めて)動くのではないかと思います。
コンパイルには 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 2.0.7 のソースコードをダウンロードしてきて展開し、展開後のディレクトリ内にある tun.c を上記の tun.c ファイルで置き換え、通常通り configure*1, 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 のソースコード群と一緒にコンパイルするとエラーになってしまうかもしれません。
TUN、TAP ドライバおよび変更済み OpenVPN をインストール後は通常通り OpenVPN を利用可能です。
TAP デバイスを使う場合は設定ファイルに「dev tap」と指定するか、openvpn コマンドの起動オプション
として「--dev tap」を指定します。
各証明書や設定ファイルの詳細な設定方法をこちらで解説するのが難しいので、(私自身
あまりよく分かっていないので)、公式ページのマニュアルをご参照ください。
Google 等で検索すると Linux や BSD での設定方法について日本語で解説されているページ見がつかりますので、
そちらも参考になるのではないかと思います。
また「OpenVPN の設定例とパフォーマンステスト」に私がテストで利用した設定ファイルをサンプルとして載せてあり
ますのでこちらも参照いただければと思います。