TUN(4) | FreeBSD Kernel Interfaces Manual | TUN(4) |
名称
tun — トンネルソフトウェアネットワークデバイス書式
device tun解説
tun インタフェースは pty(4) のネットワークインタフェース類事物のように大まかに記述することができるソフトウェアループバックメカニズムです。すなわち、 tun は pty(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) を使用) のためにハンドルを返します。
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 バイトのアドレスファイミリと共にネットワークバイト順で先頭に追加されます。 TUNSLMODE と TUNSIFHEAD は互いに排他的です。どんな場合でも、パケットデータは直ちに続きます。
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_POINTOPOINT か
IFF_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 |