EN JA
TUN(4)
TUN(4) FreeBSD Kernel Interfaces Manual TUN(4)

名称

tunトンネルソフトウェアネットワークデバイス

書式

device tun

解説

tun インタフェースは pty(4) のネットワークインタフェース類事物のように大まかに記述することができるソフトウェアループバックメカニズムです。すなわち、 tunpty(4) ドライバが端末にすることをネットワークインタフェースに行ないます。

pty(4) ドライバに似た、 tun ドライバは次の 2 つのインタフェースを提供します: ( tun の場合でイーサネットネットワークインタフェースまたは pty(4) のための端末) をシミュレートしている普通の機能に似たインタフェース、とキャラクタスペシャルデバイス“制御”インタフェースです。

ネットワークインタフェースはオープンされた各制御デバイスあたり 1 つの、“ tun0”, “ tun1”, などと名前が付けられます。これらのネットワークインタフェースは、 if_tun.ko モジュールがアンロードされるか、または ifconfig(8) コマンドで削除されるまで、存続します。

tun デバイスは、インタフェースクローニングを使用して作成されます。これは、“ifconfig tun N create”コマンドを使用して行われます。これは、 tun デバイスを作成するのに好ましい方法です。同じメソッドによってインタフェースを取り除くことができます。これのためには、“ifconfig tun N destroy”コマンドを使用します。

sysctl(8) 変数 net.link.tun.devfs_cloning が 0 でないなら、 tun インタフェースは、特別の制御デバイス /dev/tun でオープンすることができます。このデバイスがオープンされるとき、 tun は最も未使用の tun デバイス (どれかを決定するために devname(3) を使用) のためにハンドルを返します。

古い devfs クローニングの機能性を無効にすると、 ppp(8)ssh(1) のような、 tun を使用する既存のアプリケーションはブレーク (break) するかもしれません。したがって、追って通知があるまで有効にされることをデフォルトとします。

if_tun.ko がネットワークインタフェースが存続するのと同じように (上記参照) アンロードされるまで、制御デバイスは (一度オープンに成功すれば) 存続します。

各インタフェースは、 SIOCAIFADDR のような通常のネットワークインタフェース ioctl(2) をサポートします。したがって、他のインタフェースのように ifconfig(8) で使用することができます。ブート時では、それらは POINTOPOINT インタフェースですが、これを変更することができます。下記の制御デバイスの説明を参照してください。システムが、ネットワークインタフェースでパケットを送信するのを選択するとき、パケットは制御デバイス (そこで“入力”として現れます) から読み込むことができます。パケットを制御デバイスに書き込むと、まるで (実在しない) ハードウェアがちょうどそれを受信されかのように、ネットワークインタフェースで入力パケットが生成されます。

トンネルデバイス、 ( /dev/tunN) は、排他的にオープンされます (それが既にオープンされているなら、それをオープンすることはできません)。インタフェースが“レディ” (準備ができていない) でないと (制御デバイスがオープンされていて、インタフェースのアドレスが設定されていることを意味します)、 read(2) 呼び出しはエラー ( EHOSTDOWN) を返します。

インタフェースがいったんレディ (準備ができるよう) になると、それが利用可能であるなら、 read(2) はパケットを返します。そうでなければ、非ブロッキング入出力が有効になったどうかによって、ブロックするか EWOULDBLOCK が返されるかのいずれかです。パケットが read(2) に渡されたバッファの中で許されるより長いなら、余分なデータは黙って落とされます。

TUNSLMODE ioctl が設定されたなら、制御デバイスから読み込まれたパケットはネットワークインタフェース出力ルーチン、 tunoutput() に提示されるように宛先 (終点) アドレスと共に先頭に追加されます。宛先 (終点) アドレスは struct sockaddr 形式にあります。先頭に追加するアドレスの実際の長さはメンバ sa_len にあります。 TUNSIFHEAD ioctl が設定されたなら、パケットは 4 バイトのアドレスファイミリと共にネットワークバイト順で先頭に追加されます。 TUNSLMODETUNSIFHEAD は互いに排他的です。どんな場合でも、パケットデータは直ちに続きます。

write(2) 呼び出しは疑似インタフェースで“受信”されるパケットを渡します。 TUNSIFHEAD ioctl が設定されたなら、アドレスファミリは先頭に追加しなければなりません。そうでなければ、パケットはタイプ AF_INET であると想定されます。各 write(2) 呼び出しはちょうど 1 つのパケットを供給します。パケットの長さは write(2) (任意の供給されたアドレスファミリを引いて) のために提供されたデータの量から取られます。書き込みはブロックされません。パケットが一時的な理由 (例えば、利用可能なバッファ空間がない) で受け取られなかったなら、黙ってそれは落とされます。理由が一時的でない (例えば、パケットが大きすぎる) なら、エラーが返されます。

< net/if_tun.h> で定義された、次の ioctl(2) 呼び出しがサポートされます:

TUNSDEBUG
引数は int へのポインタであるべきです。これはその値に内部のデバッグ変数を設定します。どちらかといえば、この変数の制御はここでは文書化されません。ソースコードを参照してください。
TUNGDEBUG
引数は int へのポインタであるべきです。これは内部のデバッグ変数の値をそれに格納します。
TUNSIFINFO
引数は、 struct tuninfo へのポインタであるべきで、MTU、タイプ、およびトンネルデバイスのボーレート(通信速度) を設定を可能にします。 struct tuninfo< net/if_tun.h> で宣言されます。

この ioctl の使用はスーパユーザに制限されます。

TUNGIFINFO
引数は、 struct tuninfo へのポインタであるべきで、ここでは現在の MTU、タイプ、およびボーレート(通信速度) が格納されます。
TUNSIFMODE
引数は int へのポインタであるべきです。その値は、 IFF_POINTOPOINTIFF_BROADCAST のどちらかでなければならなく、マルチキャストサポートが必要であるなら、値に IFF_MULTICAST を論理和 (OR) するべきです。対応する“ tun N”インタフェースのタイプは供給されたタイプに設定されます。値が上記の範囲の外にあるなら、 EINVAL エラーが返されます。その時に、インタフェースは停止 (down) していなければなりません。それが動作 (up) しているなら、 EBUSY エラーが返されます。
TUNSLMODE
引数は int へのポインタであるべきです。 0 でない値は“multi-af”モードをオフに“リンクレイヤ (link-layer)”モードをオンにして、トンネルデバイスから読み込まれたパケットをネットワーク宛先 (終点) アドレス (上記参照) の先頭に追加します。
TUNSIFPID
トンネルデバイスを所有している pid を現在のプロセスの pid に設定します。
TUNSIFHEAD
引数は int へのポインタであるべきです。 0 でない値は“リンクレイヤ (link-layer)”モードをオフにし、“multi-af”モードを有効にし、あらゆるパケットは 4 バイトのアドレスファミリで先行されます。
TUNGIFHEAD
引数は int へのポインタであるべきです。デバイスが“multi-af”モードであるなら、ioctl は値を 1 に設定し、そうでなければ、0 を設定します。
FIONBIO
引数の int の値が 0 か 0 でないかに従って、読み込みの非ブロッキング入出力をオフかオンに切り替えます。 (書き込みは常に非ブロッキングです。)
FIOASYNC
引数の int の値が 0 か 0 でないかに従って、 (すなわち、データが読み込み利用可能であるときに SIGIO を生成する) 読み込みのための非同期入出力をオフかオンに切り替えます。
FIONREAD
任意のパケットが読み込み用のキューに入れられるなら、最初のパケットのサイズを引数 int に格納します。さもなければ、0 を格納します。
TIOCSPGRP
非同期入出力が有効にされるとき、 SIGIO シグナルを受け取るプロセスグループを引数 int 値に設定します。
TIOCGPGRP
SIGIO シグナルのためのプロセスグループ値を引数 int 値に取り出します。

制御デバイスは読み込みのための select(2) もサポートします。書き込みは常に非ブロッキングなので、いつも成功して、書き込みのための選択 (select) は無意味です。

データデバイスが最後にクローズした時、デフォルトで、インタフェースは (あたかも ifconfig tunN down のように) 停止されます。キューに入っているすべてのパケットは捨てられます。データデバイスがオープンされていない時にインタフェースが動作しているなら、出力パケットはそれらを蓄積させないで常に捨てられます。

作者

このマニュアルページは、もともと NetBSD から取得されました。
February 4, 2007 FreeBSD