GRE は元々 Cisco によって開発されたトンネリングプロトコルで、 IP-in-IP トンネリングよりはもうちょっと高機能です。 例えばマルチキャストトラフィックや IPv6 も、GRE トンネルを通して転送できます。
Linux では、ip_gre.o モジュールが必要です。
まず先に IPv4 のトンネリングから行きましょう。
いま 3 つのネットワークがあるとしましょう。 内部ネットワーク A と B、そしてその中間にあるネットワーク C (あるいはインターネット) です。
ネットワーク A は:
network 10.0.1.0 netmask 255.255.255.0 router 10.0.1.1 |
そしてネットワーク B は:
network 10.0.2.0 netmask 255.255.255.0 router 10.0.2.1 |
ネットワーク 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 |
ip link set netb down ip tunnel del netb |
IPv6 アドレスに関する説明は Section 6 を見てください。
ではトンネルについて:
次のような IPv6 ネットワークがあるとします。 そしてこれを 6bone や友達のネットワークに接続したいとしましょう。
Network 3ffe:406:5:1:5:a:2:1/96 |
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 コミュニティ以外でも広く採用されている標準で、 よって良いものであると言えます。