5.3. GRE トンネリング

GRE は元々 Cisco によって開発されたトンネリングプロトコルで、 IP-in-IP トンネリングよりはもうちょっと高機能です。 例えばマルチキャストトラフィックや IPv6 も、GRE トンネルを通して転送できます。

Linux では、ip_gre.o モジュールが必要です。

5.3.1. IPv4 トンネリング

まず先に IPv4 のトンネリングから行きましょう。

いま 3 つのネットワークがあるとしましょう。 内部ネットワーク A と B、そしてその中間にあるネットワーク C (あるいはインターネット) です。

ネットワーク A は:
network 10.0.1.0
netmask 255.255.255.0
router  10.0.1.1
このルータのネットワーク C 側のアドレスは 172.16.17.18 です。 このネットワークを neta と呼びましょう (ええ、独創的な名前でないのはわかってます)。

そしてネットワーク B は:
network 10.0.2.0
netmask 255.255.255.0
router  10.0.2.1
このルータのネットワーク C 側のアドレスは 172.19.20.21 です。 このネットワークを netb と呼びましょう (これも独創的ではありませんな)。

ネットワーク C は、 A から B へのパケット (およびその逆) はすべて通すとします。 ここではその方法・理由に関しては気にしないことにします。

ネットワーク A のルータで、次を実行します。

ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255
ip link set netb up
ip addr add 10.0.1.1 dev netb
ip route add 10.0.2.0/24 dev netb

この内容について少々説明しましょう。1 行目ではトンネルデバイスを追加し、 それを netb と呼ぶことにしました (理由は明らかでしょうが、 行き先の名前だからです)。さらにここでは、 GRE プロトコルを用いること (mode gre)、 リモートアドレスは 172.19.20.21 であること (他端のルータ)、 トンネリングパケットの発信元は 172.16.17.18 であること (これによってルータにはネットワーク C の複数の IP アドレスを与えることができ、 そのうちのどれをトンネルに用いるかを決定できます)、 そしてパケットの TTL フィールドを 255 にすること (ttl 255)、 などを指定しています。

2 行目ではデバイスを有効にしています。

3 行目では、新たに生まれたインターフェース netb に、 アドレス 10.0.1.1 を与えています。 小さいネットワークならこれで OK ですが、 いまから鉱山探検 (たくさんのトンネル掘り) をはじめようとしている場合は、 トンネリングインターフェースには別の領域の IP アドレスを与えるほうが良いかもしれません (この例なら 10.0.3.0 が使えます)。

4 行目では、ネットワーク B への経路を設定しています。 ネットワークの指定が異なっていることに注意してください。 この書式に慣れていない人に、簡単な原理を説明します: ネットワークを 2 進形式で書き、1 の数を数えてください。 やり方がわからなければ、255.0.0.0 が /8、 255.255.0.0 が /16、255.255.255.0 が /24 であると暗記しましょう。 あ、それから 255.255.254.0 は /23 です。念のため。

ここはこれで十分でしょう。ではネットワーク B のルータに行きましょう。
ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
ip link set neta up
ip addr add 10.0.2.1 dev neta
ip route add 10.0.1.0/24 dev neta
そしてトンネルを削除したくなったら、ルータ A で:
ip link set netb down
ip tunnel del netb
もちろんルータ B では netb を neta に置き換えてください。

5.3.2. IPv6 トンネリング

IPv6 アドレスに関する説明は Section 6 を見てください。

ではトンネルについて:

次のような IPv6 ネットワークがあるとします。 そしてこれを 6bone や友達のネットワークに接続したいとしましょう。

Network 3ffe:406:5:1:5:a:2:1/96
IPv4 アドレスは 172.16.17.18 で、6bone ルータの IPv4 アドレスは 172.22.23.24 とします。

ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255
ip link set sixbone up
ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone
ip route add 3ffe::/15 dev sixbone 

説明しましょう。1 行目では、 sixbone という名前のトンネルデバイスを生成しています。 これには mode sit (IPv6 を IPv4 にトンネリングする) を与え、 行き先 (remote) と発信元 (local) を指定しています。 TTL は最大の 255 にしています。 次に、このデバイスをアクティブにしています (up)。 その後、我々のネットワークのアドレスを追加し、 3ffe::/15 (現在のところ 6bone の全体) への経路をこのトンネルにしています。

GRE トンネルは現在のところ好んで用いられているトンネリング形式です。 これは Linux コミュニティ以外でも広く採用されている標準で、 よって良いものであると言えます。