&size(30){''作成中''}; [[OpenVPN のための Solaris 用 TAP ドライバ/TUN ドライバの変更と OpenVPN の修正]] #norelated *目次 [#m61115b7] #contents *ご注意 [#tc5ca38a] ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合にはシステムがパニックもしくはハングし、システムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。本プログラムの使用により発生したトラブルなど、いかなる損害についても一切の責任を負いかねます。ご利用は自己責任にてお願いいたします。 *概要[#c24015bf] [[OpenVPN:http://openvpn.net/]] で利用する 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 ドライバの変更 [#tb15c37d] OpenVPN は 仮想ネットワークに接続するため仮想ネットワークドライバとして [[Universal TUN/TAP ドライバ:http://vtun.sourceforge.net/tun]] を利用しています。 TUN/TAP ドライバは Windows/Linux/BSD/MAC 等、各 OS 上で実装されたものが公開・配布されており、 この TUN/TAP デバイスを使って OpenVPN の仮想ネットワークを構成することができます。&br; ドライバ名にある「TUN」と「TAP」は別々の機能を有したネットワークドライバで、 各々以下のような特徴を持っています。 :TUN ドライバ|IP トンネルを行うための 仮想 Point-To-Point ネットワークデバイスのドライバ。 :TAP ドライバ|Ethernet トンネルを行うための仮想 Ethernet ネットワークデバイスのドライバ。 TUN ドライバと TAP ドライバを比べた場合、VPN 上で単に IP レイヤのユニキャストのパケット しか交換しないのであれば、利用する側としてはほとんど差はないと思います。しかし、たとえば ブロードキャストパケットやマルチキャストパケットを伝送する必要がある場合や、 レイヤ 3 プロトコルとしてIP 以外のプロトコルを使う場合には TAP(=Ethernet ネットワークデバイス) を使う必要があります。&br; 実際には、ほとんどの OS の場合この2つのドライバは一緒に配布されており、TUN、TAP デバイスとも に利用可能です。しかし、Solaris 用の TUN/TAP ドライバには「TUN」ドライバ、つまり Point-To-Point ネットワークデバイスのドライバしか含まれておりません。&br; Solaris 用の TUN ドライバの最終更新日(2000/06/20)を見る限り、今後 Solaris 用の TAP ドライバ がリリースされる可能性は残念ながら少なそうです・・(やはり Solaris というところでしょうか) そこで、この Solaris 用 TUN ドライバを改造し、TAP ドライバに変更してみました。 **OpenVPN 側の変更 [#q20bb3fa] 現在のところ(Version 2.0.7) OpenVPN 側も Solaris 用の TAP デバイス(/dev/tap)を処理するルーチン が存在せず、そのままでは TAP ドライバを作ったとしても OpenVPN の設定ファイルで「dev tap」などと してもエラーになってしまいます。Solaris 用の TAP ドライバが存在しないので、当然といえば当然かもしれませんが・・。 そこで、OpenVPN 側のコードも併せて変更、追加を行い、Solaris 上でも「dev tap」が利用できるように しました。 *ソースコードとダウンロード [#y33ac555] ''Solaris 用 TAP(および TUN) ドライバソースファイル''&br; [[tuntap.tar:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap.tar]] |>|CENTER:tar ファイルに含まれるファイル|h |[[Makefile.in:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/Makefile.in]]|| |[[configure:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/configure]]|| |[[configure.in:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/configure.in]]|| |[[if_tun.h:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/if_tun.h]]|| |[[install-sh:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/install-sh]]|| |[[tap.conf:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/tap.conf]]|| |[[tun.conf:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/tun.conf]]|| |[[tun.c:http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/tun.c]]|| '''本コードは http://vtun.sourceforge.net/tun/ の TUN/TAP ドライバのコードを元にしており、本コードの配布は GPL に準じます。''' ''Solaris 用 TAP デバイス対応のための OpenVPN の差分ファイル'' |[[tun.c:http://www.whiteboard.ne.jp/~admin2/tuntap/source/openvpn/tun.c]]|| '''本コードは http://openvpn.net の tun.c のコードを元にしており、本コードの配布は GPL に準じます。''' *コンパイル&インストール [#fca41256] **Solaris 用 TAP(および TUN) ドライバ [#k7cab5ad] コンパイルには gcc を使います。上記の [[tuntap.tar:http://www.whiteboard.ne.jp/~admin2/tuntap/source/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 のコンパイル [#x4990a4d] 特別な操作はありません。[[OpenVPN のダウンロードページ:http://openvpn.net/download.html]] より OpenVPN 2.0.7 のソースコードをダウンロードしてきて展開し、展開後のディレクトリに上記の [[tun.c:http://www.whiteboard.ne.jp/~admin2/tuntap/source/openvpn/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 のソースコード群と一緒にコンパイルするとエラーになってしまうかもしれません。''