5.3. GRE-Tunneling

GRE ist ein Tunneling-Protokoll, ursprünglich von Cisco entwickelt, es kann ein paar Dinge mehr, als IP-in-IP-Tunneling. Zum Beispiel kannst du durch einen GRE-Tunnel auch Multicast-Datenverkehr und IPv6 transportiert.

In Linux benötigst du die ip_gre.o -Module.

5.3.1. IPv4 Tunneling

Zuerst ein IPv4-Tunnel:

Angenommen, du hast 3-Netzwerke: Interne Netzwerke A und B, und C Zwischennetz (oder sagen wir, Internet).

Wir haben also Netzwerk A:

network 10.0.1.0
netmask 255.255.255.0
router  10.0.1.1
Der Router hat Adresse 172.16.17.18 an Netzwerk C. Nennen wir das Netzwerk neta (ok, fast original)

und Netzwerk B:

network 10.0.2.0
netmask 255.255.255.0
router  10.0.2.1
Der Router hat Adresse 172.19.20.21 an Netzwerk C. Nennen wir das Netzwerk netb (nicht original)

Soweit es Netzwerk C betrifft, gehen wir davon aus, dass es jedes Paket von A nach B und umgekehrt weitergibt. Wie und warum ist uns egal.

Am Router von Netzwerk A mache folgendes:

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

Reden wir ein wenig darüber. In Zeile 1, fügen wir einen Tunnel-Device hinzu und nennen es netb (das ist offensichtlich, denn wir wollen dort hin). Ausserdem sagen wir, es ist das GRE-Protokoll (mode gre) zu verwenden, die Remote-Adresse ist 172.19.20.21 (der Router am anderen Ende), unsere Tunneling-Pakete sollten von 172.16.17.18 stammen (wenn dein Router an Netzwerk C mehrere IP-Adressen hat, dann entscheide welche davon man für das Tunneling verwendet wird) und das TTL-Feld des Pakets wird auf 255 (ttl 255) gesetzt.

Die zweite Zeile benutzt das Device.

In der dritten Zeile geben wir der neu geboren Schnittstelle netb die Adresse 10.0.1.1. Für kleinere Netzwerke ist das in Ordnung, aber wenn du eine Bergbauexpedition beginnst (viele Tunnel), solltest du vielleicht einem anderen IP-Bereich für die Tunnelschnittstellen verwenden (in diesem Beispiel kannst du 10.0.3.0 benutzen).

In der vierten Zeile setzen wir die Route für Netzwerk B. Achte auf die unterschiedliche Schreibweise für die Netzmaske. Falls Du mit dieser Schreibweise nicht vertraut bist, so funktioniert es: Du schreibst die Netzmaske in binärer Form und zählst die Einsen. Wenn du nicht weist wie, dann merke dir, dass 255.0.0.0 ist /8, 255.255.0.0 ist /16 und 255.255.255.0 ist /24. Ach ja und 255.255.254.0 ist /23, falls du dich wunderst.

Aber genug davon, lass und jetzt an den Router von Netzwerk 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
Und wenn du den Tunnel auf Router A entfernen willst:
ip link set netb down
ip tunnel del netb
Natürlich kannst du netb durch neta für Router B ersetzen.

5.3.2. IPv6 Tunneling

Siehe Abschnitt 6 für eine wenig über IPv6-Adressen.

Nun zum Tunnel.

Nehmen wir an, du hast folgendes IPv6-Netzwerk und die willst dich mit einem 6bone oder einen Freund verbinden.

Network 3ffe:406:5:1:5:a:2:1/96
Deine IPv4-Adresse ist 172.16.17.18, und der 6bone-Router hat die IPv4-Adresse 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 

Schauen wir es uns genauer an. In der ersten Zeile erstellen wir ein Tunnel-Device mit dem Namen sixbone. Wir geben ihm den Modus sit (das ist IPv6-in-IPv4-Tunneling) und sagten whin er geht (remote) und von wo er kommt (local). Die TTL setzen wir auf Maximum, 255. Anschließend aktivieren wir das Device (up). Danach fügten wir unsere eigene Netzwerkadresse hinzu und erstellen für 3ffe::/15 (das sind alle auf 6bone) eine Route durch den Tunnel.

GRE-Tunnel sind derzeit die bevorzugte Art des Tunnelbaus. Es ist ein Standard, der auch weit außerhalb der Linux-Gemeinschaft angenommen wird und daher ist es eine gute Sache.