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

名称

greネットワークデバイスのカプセル化

書式

このドライバをカーネルにコンパイルするためには、次の行をカーネル設定ファイルに置きます:

device gre

もう一つの方法として、ブート時にモジュールとしてドライバをロードするためには、次の行を loader.conf(5) に置きます:

if_gre_load="YES"

解説

gre ネットワークインタフェース疑似デバイスはデータグラムを IP にカプセル化します。それらのカプセル化されたデータグラムは宛先ホストに発送され、そこではカプセル化が解除されてそれらの最終的な宛先に発送されます。“トンネル”は 1 つのホップとして内側のデータグラムに現れます。

gre インタフェースは、 ifconfig(8)createdestroy サブコマンドで動的に作成されて破壊されます。

このドライバは現在次の操作モードをサポートします:

GRE カプセル化 (IP プロトコル番号 47)
カプセル化されたデータグラムは外側のデータグラムと GRE ヘッダが先頭に追加されます。 GRE ヘッダは、カプセル化されたデータグラムのタイプを指定して、その結果、例えば、AppleTalk のように IP 以外の他のプロトコルをトンネル化することを許します。また、GRE モードは Cisco ルータのデフォルトのトンネルモードです。また、これは gre インタフェースのデフォルトの操作モードです。 GRE モードの一部として、 gre は Cisco WCCP プロトコルのバージョン 1 とバージョン 2 の両方をサポートします。 WCCP バージョンを区別する信頼できる方法がないので、手動で link2 フラグを使用することで設定するべきです。 link2 フラグが設定されていないなら (デフォルト)、WCCP バージョン 1 が選択されます。
MOBILE カプセル化 (IP プロトコル番号 55)
データグラムは IP にカプセル化されますが、短いカプセル化です。オリジナルの IP ヘッダは変更され、変更はそのような変更されたヘッダと元のペイロードの間に挿入されます。訳注: ペイロードはパケットのヘッダ部を除いたデータの本体。 gif(4) のように、 IP-in-IP カプセル化のためだけです。

gre インタフェースはつぎのような多くの ioctl(2) をサポートします:

GRESADDRS
ローカルのトンネルの終わりの IP アドレスを設定します。これは gre インタフェースのための ifconfig(8) によって発信元 (始点) アドレスを設定するか表示します。
GRESADDRD
リモートのトンネルの終わりの IP アドレスを設定します。これは gre インタフェースのための ifconfig(8) によって宛先 (終点) アドレスを設定するか表示します。
GREGADDRS
ローカルのトンネルの終わりのために設定される IP アドレスを問い合わせます。これはカプセル化ヘッダがローカルアドレスとして伝わるアドレスです (すなわち、トンネルの始点の実際のアドレスです)。
GREGADDRD
リモートのトンネルの終わりのために設定される IP アドレスを問い合わせます。これは送信されるカプセル化されたパケットが送られるアドレスです (すなわち、リモートのトンネルの終点の実際ののアドレスです)。
GRESPROTO
指定された IP プロトコル値に操作モードを設定します。プロトコルは ( struct ifreq) -> ifr_flags 中のインタフェースとして渡されます。また、操作モードは次のように

link0
IPPROTO_GRE
-link0
IPPROTO_MOBILE

ifconfig(8) へ与えることができます。

link1 フラグはカプセル化を選択するために使用されるのではなく、リーモトのトンネルの終点のための内部のルート検索を変更するために使用されます。下記の バグ セクションを参照してください。

GREGPROTO
操作モードを問い合わせます。
GRESKEY
発信パケットに使用される GRE キーを設定します。 0 の値は、キーオプションを無効にします。
GREGKEY
発信パケットに現在使用されている GRE キーを取得します。 0 は、発信キーがないことを意味します。

トンネルの終点の IP アドレスは例えば、AppleTalk がカプセル化される時のように必要がないものを除いて、 (まるで IP がカプセル化されたかのような) インタフェースのための ifconfig(8) で定義されるものと同じであるかもしれないことに注意してください。

使用例

設定例:

ホスト X-- ホスト A  --------------トンネル-------- Cisco D------ホスト E 
            \                                          | 
             \                                        / 
              +------ホスト B--------ホスト C--------+

ホスト A ( FreeBSD):

route add default B 
ifconfig greN create 
ifconfig greN A D netmask 0xffffffff linkX up 
ifconfig greN tunnel A D 
route add E D

ホスト D (Cisco):

Interface TunnelX 
 ip unnumbered D   ! e.g. address from Ethernet interface 
 tunnel source D   ! e.g. address from Ethernet interface 
 tunnel destination A 
ip route C <some interface and mask> 
ip route A mask C 
ip route X mask tunnelX

または

ホスト D ( FreeBSD):

route add default C 
ifconfig greN create 
ifconfig greN D A 
ifconfig greN tunnel D A

すべてがうまく行くなら、利用者は、パケットが流れを調べるべきです ;-)

(ホスト D (Cisco) から) トンネルを越えてホスト A に到達したいなら、利用者は次のように例えば、イーサネットインタフェースのためのホスト A に別名を持たなければなりません:

ifconfig <etherif> alias Y

そして cisco では

ip route Y mask tunnelX

同様な設定はインターネットの上に 2 つのプライベートネットワーク (例えば、 192.168 サブネット) の間のリンクを作成するの使用できます:

192.168.1.* --- ルータ A  ------トンネル------- ルータ B --- 192.168.2.* 
                   \                              / 
                    \                            / 
                     +----- インターネット -----+

ルータ A が (外部の) IP アドレス A と内部のアドレス 192.168.1.1 があることを仮定すれば、一方、ルータ B は外部のアドレス B と内部のアドレス 192.168.2.1 があります。次のコマンドはトンネルを設定します:

ルータ A:

ifconfig greN create 
ifconfig greN 192.168.1.1 192.168.2.1 link1 
ifconfig greN tunnel A B 
route add -net 192.168.2 -netmask 255.255.255.0 192.168.2.1

ルータ B:

ifconfig greN create 
ifconfig greN 192.168.2.1 192.168.1.1 link1 
ifconfig greN tunnel B A 
route add -net 192.168.1 -netmask 255.255.255.0 192.168.1.1

これは link1 フラグ (下記の バグ セクションで議論するように) が設定できる (たぶん設定すべき) ところで安全な状況であることに注意してください、

gre インタフェースの MTU は、Cisco ルータによって使用される値を合わせるためにデフォルトで 1476 に設定されます。 grekey が設定されているなら、これは 1472 に下げられます。 2 つのトンネルの終点の間のリンクに依存して、これは最適値でないかもしれません。 ifconfig(8) によって調整することができます。

正しい操作のために、 gre デバイスはトンネル上のものに比べると特定されない宛先へのルートを必要とします。 (基本的に、これがループとなるであろう、トンネル上で実行されないカプセル化を解除するホストへのルートがあることが必要です。) アドレスがあいまいであるなら、 gre IP アドレスを設定するための ifconfig(8) 呼び出しの前に ifconfig tunnel ステップをすることは、トンネルの外側でルートを見つける助けとなります。

実際にインタフェースを“up”とマークするように ifconfig(8) に伝えるためには、コマンドラインの最後にキーワード up を与えなければなりません。

net.inet.ip.forwarding sysctl(8) 変数を 0 以外に設定することによってカーネルはデータグラムを転送するように設定しなければなりません。

関連項目

gif(4), inet(4), ip(4), netintro(4), protocols(5), ifconfig(8), sysctl(8)

GRE カプセル化の解説は RFC1701 と RFC1702 で見つけることができます。

モバイルカプセル化の解説は RFC2004 で見つけることができます。

作者

Heiko W.Rupp <hwr@pilhuhn.de>

バグ

if_gre.c 中の compute_route() コードはループを防ぐための直接トンネルを越えるものに比べて特定のルートでない検索を引き起こす IP アドレスの最後のビットを切り替えます。これはたぶん最も良い解決策ではありません。

上記に説明されたアドレスの改変を避けるためには、 ifconfig(8) コマンドラインで link1 フラグをオンにします。これは、GRE パケットの宛先と ifconfig のリモートホストが同じ IP アドレスでなく、また GRE 宛先が gre インタフェース自体を越えてルートを決めないことを意味します。

現在の実装は、発信パケットにだけキーを使用します。異なったキーがある、またはキーがない着信パケットは、まるで、このインタフェースに属しているかのように扱われます。

RFC1701 は、完全にサポートされていませんが、すべてのサポートされない機能は、RFC2784 で非推奨となりました。

June 20, 2008 FreeBSD