Linux/Tunnel: Unterschied zwischen den Versionen

Aus Foxwiki
 
(78 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Virtuelle Schnittstellen: Tunnels ==
'''Linux/Tunnel''' - Linux Tunnelschnitstellen
Linux hat viele Arten von Tunneln unterstützt, aber neue Benutzer können durch die Unterschiede verwirrt sein und nicht wissen, welche für einen bestimmten Anwendungsfall am besten geeignet ist
* In diesem Artikel gebe ich eine kurze Einführung in die häufig verwendeten Tunnelschnittstellen im Linux-Kernel.
* Es gibt keine Code-Analyse, nur eine kurze Einführung in die Schnittstellen und ihre Verwendung unter Linux
* Jeder mit einem Netzwerkhintergrund könnte an diesen Informationen interessiert sein
* Eine Liste der Tunnelschnittstellen sowie Hilfe zur spezifischen Tunnelkonfiguration kann mit dem Befehl iproute2 <code>ip link help</code> abgerufen werden.


Nach der Lektüre dieses Artikels wissen Sie, was diese Schnittstellen sind, welche Unterschiede es zwischen ihnen gibt, wann sie verwendet werden und wie man sie erstellt
== Beschreibung ==
=== Virtuelle Schnittstellen ===
; Linux unterstützt viele Arten von Tunneln
Einführung in die häufig verwendeten Tunnelschnittstellen im Linux-Kernel
* was Schnittstellen sind
* welche Unterschiede es gibt
* wann sie verwendet werden
* wie man sie erstellt
* welche für einen bestimmten Anwendungsfall geeignet ist


== IPIP-Tunnel ==
Eine Liste der Tunnelschnittstellen sowie Hilfe zur spezifischen Tunnelkonfiguration kann mit dem Befehl iproute2 <code>ip link help</code> abgerufen werden
IPIP-Tunnel ist, wie der Name schon sagt, ein IP-over-IP-Tunnel, definiert in RFC 2003
* Der IPIP-Tunnel-Header sieht wie folgt aus


[[File:ipip.png|600px]]
=== Überblick ===
{| class="wikitable"
!Tunnel/Link Typ
!Äußerer Header
!Encapsulate Header
!Innerer Header
|-
|ipip
|IPv4
|Keine
|IPv4
|-
|sit
|IPv4
|Keine
|IPv4/IPv6
|-
|ip6tnl
|IPv6
|Keine
|IPv4/IPv6
|-
|vti
|IPv4
|IPsec
|IPv4
|-
|vti6
|IPv6
|IPsec
|IPv6
|-
|gre
|IPv4
|GRE
|IPv4/IPv6
|-
|gretap
|IPv4
|GRE
|Ether + IPv4/IPv6
|-
|ip6gre
|IPv6
|GRE
|IPv4/IPv6
|-
|ip6gretap
|IPv6
|GRE
|Ether + IPv4/IPv6
|-
|fou
|IPv4/IPv6
|UDP
|IPv4/IPv6/GRE
|-
|gue
|IPv4/IPv6
|UDP + GUE
|IPv4/IPv6/GRE
|-
|geneve
|IPv4/IPv6
|UDP + Geneve
|Ether + IPv4/IPv6
|-
|erspan
|IPv4
|GRE + ERSPAN
|IPv4/IPv6
|-
|ip6erspan
|IPv6
|GRE + ERSPAN
|IPv4/IPv6
|}


; Hinweis
: Konfigurationen in diesem Artikel sind flüchtig
:* Gehen bei einen Server-Neustart verloren
:* Soll die Konfiguration nach einem Neustarts erhalten bleiben, können Netzwerkkonfigurationsdämonen wie [[NetworkManager]] oder distributionsspezifische Mechanismen verwendet werden


Er wird typischerweise verwendet, um zwei interne IPv4-Subnetze über das öffentliche IPv4-Internet zu verbinden.
== Anwendung ==
=== IPIP-Tunnel ===
IPIP-Tunnel ist ein IP-over-IP-Tunnel ([[RFC 2003]])
 
; Tunnelheader
[[File:ipip.png|500px]]
 
Er wird typischerweise verwendet, um zwei interne IPv4-Subnetze über das öffentliche IPv4-Internet zu verbinden
* Er hat den geringsten Overhead, kann aber nur IPv4-Unicast-Verkehr übertragen
* Er hat den geringsten Overhead, kann aber nur IPv4-Unicast-Verkehr übertragen
* Das bedeutet, dass Sie '''nicht''' Multicast über IPIP-Tunnel senden können.
* Das bedeutet, dass Sie '''nicht''' Multicast über IPIP-Tunnel senden können


IPIP-Tunnel unterstützt sowohl IP über IP als auch MPLS über IP
IPIP-Tunnel unterstützt sowohl IP über IP als auch MPLS über IP


'''Hinweis''': Wenn das <code>ipip</code>-Modul geladen wird oder ein IPIP-Gerät zum ersten Mal erstellt wird, erstellt der Linux-Kernel ein <code>tunl0</code>-Standardgerät in jedem Namensraum mit den Attributen <code>local=any</code> und <code>remote=any</code>
; Hinweis
* Wenn der Kernel IPIP-Protokollpakete empfängt, leitet er sie an <code>tunl0</code> als Ausweichgerät weiter, wenn er kein anderes Gerät finden kann, dessen local/remote-Attribute besser zur Quell- oder Zieladresse passen
: Wenn das <code>ipip</code>-Modul geladen wird oder ein IPIP-Gerät zum ersten Mal erstellt wird, erstellt der Linux-Kernel ein <code>tunl0</code>-Standardgerät in jedem Namensraum mit den Attributen <code>local=any</code> und <code>remote=any</code>
:* Wenn der Kernel IPIP-Protokollpakete empfängt, leitet er sie an <code>tunl0</code> als Ausweichgerät weiter, wenn er kein anderes Gerät finden kann, dessen local/remote-Attribute besser zur Quell- oder Zieladresse passen


So erstellen Sie einen IPIP-Tunnel:
; Erstellung eines IPIP-Tunnels
Auf Server A:
Auf Server A
  # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link set ipip0 up
  # ip link set ipip0 up
  # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
  # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
Add a remote internal subnet route if the endpoints don't belong to the same subnet
 
Hinzufügen einer entfernten internen Subnetz-Route, wenn die Endpunkte nicht zum selben Subnetz gehören
  # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
  # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0


Auf Server B:
Auf Server B
  # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link set ipip0 up
  # ip link set ipip0 up
Zeile 38: Zeile 128:
  # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
  # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0


'''Hinweis:''' Bitte ersetzen Sie <code>LOCAL_IPv4_ADDR</code>, <code>REMOTE_IPv4_ADDR</code>, <code>INTERNAL_IPV4_ADDR</code>, <code>REMOTE_INTERNAL_SUBNET</code> durch die Adressen, die Ihrer Testumgebung entsprechen
; Hinweis
* Dasselbe gilt für die folgenden Beispielkonfigurationen
: Bitte ersetzen Sie <code>LOCAL_IPv4_ADDR</code>, <code>REMOTE_IPv4_ADDR</code>, <code>INTERNAL_IPV4_ADDR</code>, <code>REMOTE_INTERNAL_SUBNET</code> durch die Adressen, die Ihrer Testumgebung entsprechen
:* Dasselbe gilt für die folgenden Beispielkonfigurationen


== SIT-Tunnel ==
=== SIT-Tunnel ===
SIT steht für Simple Internet Transition
SIT steht für Simple Internet Transition
* Das Hauptzweck besteht darin, isolierte IPv6-Netze, die sich im globalen IPv4-Internet befinden, miteinander zu verbinden.
* Das Hauptzweck besteht darin, isolierte IPv6-Netze, die sich im globalen IPv4-Internet befinden, miteinander zu verbinden
 
[[File:sit.png|600px]]


Ursprünglich hatte es nur einen IPv6-über-IPv4-Tunneling-Modus
Ursprünglich hatte es nur einen IPv6-über-IPv4-Tunneling-Modus
* Nach jahrelanger Entwicklung wurden jedoch verschiedene Modi unterstützt, wie <code>ipip</code> (gleichbedeutend mit IPIP-Tunnel), <code>ip6ip</code>, <code>mplsip</code>, und <code>any</code>
* Nach jahrelanger Entwicklung wurden jedoch verschiedene Modi unterstützt, wie <code>ipip</code> (gleichbedeutend mit IPIP-Tunnel), <code>ip6ip</code>, <code>mplsip</code>, und <code>any</code>
* Der Modus <code>any</code> wird verwendet, um sowohl IP- als auch IPv6-Verkehr zu akzeptieren, was sich bei einigen Einsätzen als nützlich erweisen kann.
* Der Modus <code>any</code> wird verwendet, um sowohl IP- als auch IPv6-Verkehr zu akzeptieren, was sich bei einigen Einsätzen als nützlich erweisen kann
* Der SIT-Tunnel unterstützt auch ISATA, und hier ist ein Anwendungsbeispiel
* Der SIT-Tunnel unterstützt auch ISATA, und hier ist ein Anwendungsbeispiel


Der SIT-Tunnel-Header sieht wie folgt aus:
; Tunnelheader
[[File:sit.png|500px]]


Wenn das <code>sit</code>-Modul geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen <code>sit0</code>
Wenn das <code>sit</code>-Modul geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen <code>sit0</code>


So erstellen Sie einen SIT-Tunnel:
; Erstellung eines SIT-Tunnels
Auf Server A:
Auf Server A
  # ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any
  # ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any
  # ip link set sit1 up
  # ip link set sit1 up
Zeile 64: Zeile 154:
Führen Sie dann die gleichen Schritte auf der entfernten Seite durch
Führen Sie dann die gleichen Schritte auf der entfernten Seite durch


== ip6tnl Tunnel ==
=== ip6tnl Tunnel ===
ip6tnl is an IPv4/IPv6 over IPv6 tunnel interface, which looks like an IPv6 version of the SIT tunnel
ip6tnl ist eine IPv4/IPv6 over IPv6-Tunnelschnittstelle, die wie eine IPv6-Version des SIT-Tunnels aussieht
* The tunnel header looks like:


[[File:ip6tnl.png|600px]]
; Tunnelheader
[[File:ip6tnl.png|500px]]


ip6tnl supports modes <code>ip6ip6</code>, <code>ipip6</code>, <code>any</code>.  Mode <code>ipip6</code> is IPv4 over IPv6, and mode <code>ip6ip6</code> is IPv6 over IPv6, and mode <code>any</code> supports both IPv4/IPv6 over IPv6
ip6tnl unterstützt die Modi <code>ip6ip6</code>, <code>ipip6</code>, <code>any</code>. Modus <code>ipip6</code> ist IPv4 über IPv6, und Modus <code>ip6ip6</code> ist IPv6 über IPv6, und Modus <code>any</code> unterstützt sowohl IPv4/IPv6 über IPv6


When the <code>ip6tnl</code> module is loaded, the Linux kernel will create a default device, named <code>ip6tnl0</code>
Wenn das <code>ip6tnl</code>-Modul geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen <code>ip6tnl0</code>


Here is how to create an ip6tnl tunnel:
; Erstellung eines ip6tnl-Tunnels
  # ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any
  # ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any


== VTI and VTI6 ==
=== VTI und VTI6 ===
Virtual Tunnel Interface (VTI) on Linux is similar to Cisco's VTI and Juniper's implementation of secure tunnel (st.xx)
Virtual Tunnel Interface (VTI) unter Linux ist ähnlich wie Ciscos VTI und Junipers Implementierung von Secure Tunnel (st.xx)


This particular tunneling driver implements IP encapsulations, which can be used with xfrm to give the notion of a secure tunnel and then use kernel routing on top
Dieser spezielle Tunneltreiber implementiert IP-Kapselungen, die mit xfrm verwendet werden können, um den Eindruck eines sicheren Tunnels zu erwecken und dann Kernel-Routing zu verwenden


In general, VTI tunnels operate in almost the same way as ipip or sit tunnels, except that they add a fwmark and IPsec encapsulation/decapsulation
Im Allgemeinen funktionieren VTI-Tunnel fast genauso wie ipip- oder sit-Tunnel, mit dem Unterschied, dass sie ein fwmark und IPsec-Kapselung/Dekapselung hinzufügen


VTI6 is the IPv6 equivalent of VTI
VTI6 ist das IPv6-Äquivalent von VTI


Here is how to create a VTI tunnel:
; Erstellung eines VTI-Tunnels
  # ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link set vti1 up
  # ip link set vti1 up
Zeile 95: Zeile 185:
  # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
  # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
  # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
  # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
You can also configure IPsec via libreswan or strongSwan


== GRE and GRETAP ==
Sie können IPsec auch über libreswan oder strongSwan konfigurieren
Generic Routing Encapsulation, also known as GRE, is defined in <nowiki>RFC 2784</nowiki>


GRE tunneling adds an additional GRE header between the inside and outside IP headers
=== GRE und GRETAP ===
* In theory, GRE could encapsulate any Layer 3 protocol with a valid Ethernet type, unlike IPIP, which can only encapsulate IP
Generic Routing Encapsulation, auch bekannt als GRE, ist definiert in <nowiki>RFC 2784</nowiki>
* The GRE header looks like:


GRE-Tunneling fügt einen zusätzlichen GRE-Header zwischen den inneren und äußeren IP-Header ein
* Theoretisch kann GRE jedes Layer-3-Protokoll mit einem gültigen Ethernet-Typ einkapseln, im Gegensatz zu IPIP, das nur IP einkapseln kann
; Tunnelheader
[[File:gre.png|600px]]
[[File:gre.png|600px]]


Note that you can transport multicast traffic and IPv6 through a GRE tunnel
Beachten Sie, dass Sie Multicast-Verkehr und IPv6 durch einen GRE-Tunnel transportieren können


When the <code>gre</code> module is loaded, the Linux kernel will create a default device, named <code>gre0</code>
Wenn das Modul <code>gre</code> geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen <code>gre0</code>


Here is how to create a GRE tunnel:
; Erstellung eines GRE-Tunnels
  # ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY
  # ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY
While GRE tunnels operate at OSI Layer 3, GRETAP works at OSI Layer 2, which means there is an Ethernet header in the inner header
Während GRE-Tunnel auf OSI-Schicht 3 arbeiten, arbeitet GRETAP auf OSI-Schicht 2, was bedeutet, dass ein Ethernet-Header im inneren Header vorhanden ist


[[File:gretap.png|600px]]
[[Datei:gretap.png|700px]]


Here is how to create a GRETAP tunnel:
; Erstellung eines GRETAP-Tunnels
  # ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
  # ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR


== IP6GRE and IP6GRETAP ==
=== IP6GRE und IP6GRETAP ===
IP6GRE is the IPv6 equivalent of GRE, which allows us to encapsulate any Layer 3 protocol over IPv6
IP6GRE ist das IPv6-Äquivalent von GRE, das es uns ermöglicht, jedes Schicht-3-Protokoll über IPv6 zu kapseln
* The tunnel header looks like:


[[File:gre6.png|600px]]
; Tunnelheader
[[File:gre6.png|700px]]


IP6GRETAP, just like GRETAP, has an Ethernet header in the inner header:
IP6GRETAP hat, genau wie GRETAP, einen Ethernet-Header im inneren Header:


[[File:gre6tap.png|600px]]
[[File:gre6tap.png|700px]]


Here is how to create a GRE tunnel:
; Erstellung eines GRE-Tunnels
  # ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
  # ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
  # ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
  # ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR


== FOU ==
=== FOU ===
Tunneling can happen at multiple levels in the networking stack
Tunneling kann auf mehreren Ebenen des Netzwerkstapels stattfinden
* IPIP, SIT, GRE tunnels are at the IP level, while FOU (foo over UDP) is UDP-level tunneling
* IPIP-, SIT- und GRE-Tunnel sind auf der IP-Ebene angesiedelt, während FOU (foo over UDP) ein Tunneling auf UDP-Ebene ist


There are some advantages of using UDP tunneling as UDP works with existing HW infrastructure, like RSS in NICs, ECMP in switches, and checksum offload
Es gibt einige Vorteile bei der Verwendung von UDP-Tunneln, da UDP mit der bestehenden HW-Infrastruktur zusammenarbeitet, wie RSS in NICs, ECMP in Switches und Prüfsummen-Offload
* The developer's patch set shows significant performance increases for the SIT and IPIP protocols
* Das Patch-Set des Entwicklers zeigt erhebliche Leistungssteigerungen für die Protokolle SIT und IPIP


Currently, the FOU tunnel supports encapsulation protocol based on IPIP, SIT, GRE
Derzeit unterstützt der FOU-Tunnel Encapsulation-Protokolle, die auf IPIP, SIT und GRE basieren
* An example FOU header looks like:


; Tunnelheader
[[File:fou.png|600px]]
[[File:fou.png|600px]]


Here is how to create a FOU tunnel:
; Erstellung eines FOU-Tunnels
  # ip fou add port 5555 ipproto 4
  # ip fou add port 5555 ipproto 4
  # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555
  # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555
The first command configured a FOU receive port for IPIP bound to 5555; for GRE, you need to set <code>ipproto 47</code>
* The second command set up a new IPIP virtual interface (tun1) configured for FOU encapsulation, with dest port 5555


'''Note''': FOU is not supported in Red Hat Enterprise Linux
Der erste Befehl konfiguriert einen FOU-Empfangsport für IPIP, der an 5555 gebunden ist; für GRE müssen Sie <code>ipproto 47</code> einstellen
* Der zweite Befehl richtet eine neue virtuelle IPIP-Schnittstelle (tun1) ein, die für FOU-Kapselung konfiguriert ist, mit dem Zielport 5555


== GUE ==
; '''Hinweis'''
Generic UDP Encapsulation (GUE) is another kind of UDP tunneling
: FOU wird in Red Hat Enterprise Linux nicht unterstützt
* The difference between FOU and GUE is that GUE has its own encapsulation header, which contains the protocol info and other data


Currently, GUE tunnel supports inner IPIP, SIT, GRE encapsulation
=== GUE ===
* An example GUE header looks like:
Generic UDP Encapsulation (GUE) ist eine weitere Art von UDP-Tunneling
* Der Unterschied zwischen FOU und GUE besteht darin, dass GUE einen eigenen Encapsulation Header hat, der die Protokollinformationen und andere Daten enthält


Derzeit unterstützt GUE-Tunnel die innere IPIP-, SIT- und GRE-Kapselung
; Tunnelheader
[[File:gue.png|600px]]
[[File:gue.png|600px]]


Here is how to create a GUE tunnel:
; Erstellung eines GUE-Tunnels
  # ip fou add port 5555 gue
  # ip fou add port 5555 gue
  # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555
  # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555
This will set up a GUE receive port for IPIP bound to 5555, and an IPIP tunnel configured for GUE encapsulation
Dies richtet einen GUE-Empfangs-Port für IPIP ein, der an 5555 gebunden ist, und einen IPIP-Tunnel, der für GUE-Kapselung konfiguriert ist


'''Note''': GUE is not supported in Red Hat Enterprise Linux
; Hinweis
: GUE wird in Red Hat Enterprise Linux nicht unterstützt


== GENEVE ==
=== GENEVE ===
Generic Network Virtualization Encapsulation (GENEVE) supports all of the capabilities of VXLAN, NVGRE, and STT and was designed to overcome their perceived limitations
Generic Network Virtualization Encapsulation (GENEVE) unterstützt alle Funktionen von VXLAN, NVGRE und STT und wurde entwickelt, um deren vermeintliche Einschränkungen zu überwinden.
* Many believe GENEVE could eventually replace these earlier formats entirely
* The tunnel header looks like:


* Viele glauben, dass GENEVE diese früheren Formate irgendwann vollständig ersetzen könnte.
; Tunnelheader
[[File:geneve.png|600px]]
[[File:geneve.png|600px]]


which looks very similar to VXLAN
das VXLAN sehr ähnlich sieht
* The main difference is that the GENEVE header is flexible
* Der Hauptunterschied besteht darin, dass der GENEVE-Header flexibel ist.
* It's very easy to add new features by extending the header with a new Type-Length-Value (TLV) field
* Es ist sehr einfach, neue Funktionen hinzuzufügen, indem man den Header mit einem neuen Type-Length-Value (TLV) Feld erweitert.
* For more details, you can see the latest geneve ietf draft or refer to this What is GENEVE? article
* Weitere Einzelheiten finden Sie im neuesten GENEVE-ietf-Entwurf oder in diesem Artikel Was ist GENEVE?


Open Virtual Network (OVN) uses GENEVE as default encapsulation
Open Virtual Network (OVN) verwendet GENEVE als Standardkapselung
* Here is how to create a GENEVE tunnel:
 
; Erstellung eines GENEVE-Tunnels
  # ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR
  # ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR


== ERSPAN and IP6ERSPAN ==
=== ERSPAN und IP6ERSPAN ===
Encapsulated Remote Switched Port Analyzer (ERSPAN) uses GRE encapsulation to extend the basic port mirroring capability from Layer 2 to Layer 3, which allows the mirrored traffic to be sent through a routable IP network
Encapsulated Remote Switched Port Analyzer (ERSPAN) verwendet GRE-Kapselung, um die grundlegende Port-Spiegelungsfunktion von Layer 2 auf Layer 3 zu erweitern, wodurch der gespiegelte Verkehr durch ein routingfähiges IP-Netzwerk gesendet werden kann
* The ERSPAN header looks like:


[[File:erspan.png|600px]]
; Tunnelheader
[[Datei:erspan.png|700px]]


The ERSPAN tunnel allows a Linux host to act as an ERSPAN traffic source and send the ERSPAN mirrored traffic to either a remote host or to an ERSPAN destination, which receives and parses the ERSPAN packets generated from Cisco or other ERSPAN-capable switches
Der ERSPAN-Tunnel ermöglicht es einem Linux-Host, als ERSPAN-Verkehrsquelle zu fungieren und den gespiegelten ERSPAN-Verkehr entweder an einen entfernten Host oder an ein ERSPAN-Ziel zu senden, das die von Cisco- oder anderen ERSPAN-fähigen Switches generierten ERSPAN-Pakete empfängt und analysiert
* This setup could be used to analyze, diagnose, and detect malicious traffic
* Diese Einrichtung kann zur Analyse, Diagnose und Erkennung von bösartigem Datenverkehr verwendet werden


Linux currently supports most features of two ERSPAN versions: v1 (type II) and v2 (type III)
Linux unterstützt derzeit die meisten Funktionen von zwei ERSPAN-Versionen: v1 (Typ II) und v2 (Typ III)


Here is how to create an ERSPAN tunnel:
; Erstellung eines ERSPAN-Tunnels
  # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX
  # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX
  or
  oder
  # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID
  # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID


  Add tc filter to monitor traffic
  tc-Filter zur Überwachung des Datenverkehrs hinzufügen
  # tc qdisc add dev MONITOR_DEV handle ffff: ingress
  # tc qdisc add dev MONITOR_DEV handle ffff: ingress
  # tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1
  # tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1


== Summary ==
== Konfiguration ==
Here is a summary of all the tunnels we introduced
=== Dateien ===
{| class="wikitable"
<noinclude>
!Tunnel/Link Type
!Outer Header
!Encapsulate Header
!Inner Header
|-
|ipip
|IPv4
|None
|IPv4
|-
|sit
|IPv4
|None
|IPv4/IPv6
|-
|ip6tnl
|IPv6
|None
|IPv4/IPv6
|-
|vti
|IPv4
|IPsec
|IPv4
|-
|vti6
|IPv6
|IPsec
|IPv6
|-
|gre
|IPv4
|GRE
|IPv4/IPv6
|-
|gretap
|IPv4
|GRE
|Ether + IPv4/IPv6
|-
|ip6gre
|IPv6
|GRE
|IPv4/IPv6
|-
|ip6gretap
|IPv6
|GRE
|Ether + IPv4/IPv6
|-
|fou
|IPv4/IPv6
|UDP
|IPv4/IPv6/GRE
|-
|gue
|IPv4/IPv6
|UDP + GUE
|IPv4/IPv6/GRE
|-
|geneve
|IPv4/IPv6
|UDP + Geneve
|Ether + IPv4/IPv6
|-
|erspan
|IPv4
|GRE + ERSPAN
|IPv4/IPv6
|-
|ip6erspan
|IPv6
|GRE + ERSPAN
|IPv4/IPv6
|}


'''Note''': All configurations in this tutorial are volatile and won’t survive a server reboot
== Anhang ==
* If you want to make the configuration persistent across reboots, consider using a networking configuration daemon, such as NetworkManager, or distribution-specific mechanisms
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
----
ip link help


If you want to learn more, read this article: Introduction to Linux interfaces for virtual networking
==== Dokumentation ====
===== Man-Page =====
===== Info-Pages =====
==== Links ====
===== Projekt =====
===== Weblinks =====
# https://developers.redhat.com/blog/2019/05/17/an-introduction-to-linux-virtual-interfaces-tunnels
# https://developers.redhat.com/blog/2019/05/17/an-introduction-to-linux-virtual-interfaces-tunnels
# https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking
[[Kategorie:Linux/Netzwerk]]
</noinclude>

Aktuelle Version vom 24. November 2024, 10:57 Uhr

Linux/Tunnel - Linux Tunnelschnitstellen

Beschreibung

Virtuelle Schnittstellen

Linux unterstützt viele Arten von Tunneln

Einführung in die häufig verwendeten Tunnelschnittstellen im Linux-Kernel

  • was Schnittstellen sind
  • welche Unterschiede es gibt
  • wann sie verwendet werden
  • wie man sie erstellt
  • welche für einen bestimmten Anwendungsfall geeignet ist

Eine Liste der Tunnelschnittstellen sowie Hilfe zur spezifischen Tunnelkonfiguration kann mit dem Befehl iproute2 ip link help abgerufen werden

Überblick

Tunnel/Link Typ Äußerer Header Encapsulate Header Innerer Header
ipip IPv4 Keine IPv4
sit IPv4 Keine IPv4/IPv6
ip6tnl IPv6 Keine IPv4/IPv6
vti IPv4 IPsec IPv4
vti6 IPv6 IPsec IPv6
gre IPv4 GRE IPv4/IPv6
gretap IPv4 GRE Ether + IPv4/IPv6
ip6gre IPv6 GRE IPv4/IPv6
ip6gretap IPv6 GRE Ether + IPv4/IPv6
fou IPv4/IPv6 UDP IPv4/IPv6/GRE
gue IPv4/IPv6 UDP + GUE IPv4/IPv6/GRE
geneve IPv4/IPv6 UDP + Geneve Ether + IPv4/IPv6
erspan IPv4 GRE + ERSPAN IPv4/IPv6
ip6erspan IPv6 GRE + ERSPAN IPv4/IPv6
Hinweis
Konfigurationen in diesem Artikel sind flüchtig
  • Gehen bei einen Server-Neustart verloren
  • Soll die Konfiguration nach einem Neustarts erhalten bleiben, können Netzwerkkonfigurationsdämonen wie NetworkManager oder distributionsspezifische Mechanismen verwendet werden

Anwendung

IPIP-Tunnel

IPIP-Tunnel ist ein IP-over-IP-Tunnel (RFC 2003)

Tunnelheader

Er wird typischerweise verwendet, um zwei interne IPv4-Subnetze über das öffentliche IPv4-Internet zu verbinden

  • Er hat den geringsten Overhead, kann aber nur IPv4-Unicast-Verkehr übertragen
  • Das bedeutet, dass Sie nicht Multicast über IPIP-Tunnel senden können

IPIP-Tunnel unterstützt sowohl IP über IP als auch MPLS über IP

Hinweis
Wenn das ipip-Modul geladen wird oder ein IPIP-Gerät zum ersten Mal erstellt wird, erstellt der Linux-Kernel ein tunl0-Standardgerät in jedem Namensraum mit den Attributen local=any und remote=any
  • Wenn der Kernel IPIP-Protokollpakete empfängt, leitet er sie an tunl0 als Ausweichgerät weiter, wenn er kein anderes Gerät finden kann, dessen local/remote-Attribute besser zur Quell- oder Zieladresse passen
Erstellung eines IPIP-Tunnels

Auf Server A

# ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
# ip link set ipip0 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0

Hinzufügen einer entfernten internen Subnetz-Route, wenn die Endpunkte nicht zum selben Subnetz gehören

# ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0

Auf Server B

# ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
# ip link set ipip0 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
# ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
Hinweis
Bitte ersetzen Sie LOCAL_IPv4_ADDR, REMOTE_IPv4_ADDR, INTERNAL_IPV4_ADDR, REMOTE_INTERNAL_SUBNET durch die Adressen, die Ihrer Testumgebung entsprechen
  • Dasselbe gilt für die folgenden Beispielkonfigurationen

SIT-Tunnel

SIT steht für Simple Internet Transition

  • Das Hauptzweck besteht darin, isolierte IPv6-Netze, die sich im globalen IPv4-Internet befinden, miteinander zu verbinden

Ursprünglich hatte es nur einen IPv6-über-IPv4-Tunneling-Modus

  • Nach jahrelanger Entwicklung wurden jedoch verschiedene Modi unterstützt, wie ipip (gleichbedeutend mit IPIP-Tunnel), ip6ip, mplsip, und any
  • Der Modus any wird verwendet, um sowohl IP- als auch IPv6-Verkehr zu akzeptieren, was sich bei einigen Einsätzen als nützlich erweisen kann
  • Der SIT-Tunnel unterstützt auch ISATA, und hier ist ein Anwendungsbeispiel
Tunnelheader

Wenn das sit-Modul geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen sit0

Erstellung eines SIT-Tunnels

Auf Server A

# ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any
# ip link set sit1 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev sit1

Führen Sie dann die gleichen Schritte auf der entfernten Seite durch

ip6tnl Tunnel

ip6tnl ist eine IPv4/IPv6 over IPv6-Tunnelschnittstelle, die wie eine IPv6-Version des SIT-Tunnels aussieht

Tunnelheader

ip6tnl unterstützt die Modi ip6ip6, ipip6, any. Modus ipip6 ist IPv4 über IPv6, und Modus ip6ip6 ist IPv6 über IPv6, und Modus any unterstützt sowohl IPv4/IPv6 über IPv6

Wenn das ip6tnl-Modul geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen ip6tnl0

Erstellung eines ip6tnl-Tunnels
# ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any

VTI und VTI6

Virtual Tunnel Interface (VTI) unter Linux ist ähnlich wie Ciscos VTI und Junipers Implementierung von Secure Tunnel (st.xx)

Dieser spezielle Tunneltreiber implementiert IP-Kapselungen, die mit xfrm verwendet werden können, um den Eindruck eines sicheren Tunnels zu erwecken und dann Kernel-Routing zu verwenden

Im Allgemeinen funktionieren VTI-Tunnel fast genauso wie ipip- oder sit-Tunnel, mit dem Unterschied, dass sie ein fwmark und IPsec-Kapselung/Dekapselung hinzufügen

VTI6 ist das IPv6-Äquivalent von VTI

Erstellung eines VTI-Tunnels
# ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
# ip link set vti1 up
# ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1
# ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel
# ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel
# ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
# ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY

Sie können IPsec auch über libreswan oder strongSwan konfigurieren

GRE und GRETAP

Generic Routing Encapsulation, auch bekannt als GRE, ist definiert in RFC 2784

GRE-Tunneling fügt einen zusätzlichen GRE-Header zwischen den inneren und äußeren IP-Header ein

  • Theoretisch kann GRE jedes Layer-3-Protokoll mit einem gültigen Ethernet-Typ einkapseln, im Gegensatz zu IPIP, das nur IP einkapseln kann
Tunnelheader

Beachten Sie, dass Sie Multicast-Verkehr und IPv6 durch einen GRE-Tunnel transportieren können

Wenn das Modul gre geladen wird, erstellt der Linux-Kernel ein Standardgerät mit dem Namen gre0

Erstellung eines GRE-Tunnels
# ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY

Während GRE-Tunnel auf OSI-Schicht 3 arbeiten, arbeitet GRETAP auf OSI-Schicht 2, was bedeutet, dass ein Ethernet-Header im inneren Header vorhanden ist

Erstellung eines GRETAP-Tunnels
# ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

IP6GRE und IP6GRETAP

IP6GRE ist das IPv6-Äquivalent von GRE, das es uns ermöglicht, jedes Schicht-3-Protokoll über IPv6 zu kapseln

Tunnelheader

IP6GRETAP hat, genau wie GRETAP, einen Ethernet-Header im inneren Header:

Erstellung eines GRE-Tunnels
# ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
# ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR

FOU

Tunneling kann auf mehreren Ebenen des Netzwerkstapels stattfinden

  • IPIP-, SIT- und GRE-Tunnel sind auf der IP-Ebene angesiedelt, während FOU (foo over UDP) ein Tunneling auf UDP-Ebene ist

Es gibt einige Vorteile bei der Verwendung von UDP-Tunneln, da UDP mit der bestehenden HW-Infrastruktur zusammenarbeitet, wie RSS in NICs, ECMP in Switches und Prüfsummen-Offload

  • Das Patch-Set des Entwicklers zeigt erhebliche Leistungssteigerungen für die Protokolle SIT und IPIP

Derzeit unterstützt der FOU-Tunnel Encapsulation-Protokolle, die auf IPIP, SIT und GRE basieren

Tunnelheader

Erstellung eines FOU-Tunnels
# ip fou add port 5555 ipproto 4
# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555

Der erste Befehl konfiguriert einen FOU-Empfangsport für IPIP, der an 5555 gebunden ist; für GRE müssen Sie ipproto 47 einstellen

  • Der zweite Befehl richtet eine neue virtuelle IPIP-Schnittstelle (tun1) ein, die für FOU-Kapselung konfiguriert ist, mit dem Zielport 5555
Hinweis
FOU wird in Red Hat Enterprise Linux nicht unterstützt

GUE

Generic UDP Encapsulation (GUE) ist eine weitere Art von UDP-Tunneling

  • Der Unterschied zwischen FOU und GUE besteht darin, dass GUE einen eigenen Encapsulation Header hat, der die Protokollinformationen und andere Daten enthält

Derzeit unterstützt GUE-Tunnel die innere IPIP-, SIT- und GRE-Kapselung

Tunnelheader

Erstellung eines GUE-Tunnels
# ip fou add port 5555 gue
# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555

Dies richtet einen GUE-Empfangs-Port für IPIP ein, der an 5555 gebunden ist, und einen IPIP-Tunnel, der für GUE-Kapselung konfiguriert ist

Hinweis
GUE wird in Red Hat Enterprise Linux nicht unterstützt

GENEVE

Generic Network Virtualization Encapsulation (GENEVE) unterstützt alle Funktionen von VXLAN, NVGRE und STT und wurde entwickelt, um deren vermeintliche Einschränkungen zu überwinden.

  • Viele glauben, dass GENEVE diese früheren Formate irgendwann vollständig ersetzen könnte.
Tunnelheader

das VXLAN sehr ähnlich sieht

  • Der Hauptunterschied besteht darin, dass der GENEVE-Header flexibel ist.
  • Es ist sehr einfach, neue Funktionen hinzuzufügen, indem man den Header mit einem neuen Type-Length-Value (TLV) Feld erweitert.
  • Weitere Einzelheiten finden Sie im neuesten GENEVE-ietf-Entwurf oder in diesem Artikel Was ist GENEVE?

Open Virtual Network (OVN) verwendet GENEVE als Standardkapselung

Erstellung eines GENEVE-Tunnels
# ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR

ERSPAN und IP6ERSPAN

Encapsulated Remote Switched Port Analyzer (ERSPAN) verwendet GRE-Kapselung, um die grundlegende Port-Spiegelungsfunktion von Layer 2 auf Layer 3 zu erweitern, wodurch der gespiegelte Verkehr durch ein routingfähiges IP-Netzwerk gesendet werden kann

Tunnelheader

Der ERSPAN-Tunnel ermöglicht es einem Linux-Host, als ERSPAN-Verkehrsquelle zu fungieren und den gespiegelten ERSPAN-Verkehr entweder an einen entfernten Host oder an ein ERSPAN-Ziel zu senden, das die von Cisco- oder anderen ERSPAN-fähigen Switches generierten ERSPAN-Pakete empfängt und analysiert

  • Diese Einrichtung kann zur Analyse, Diagnose und Erkennung von bösartigem Datenverkehr verwendet werden

Linux unterstützt derzeit die meisten Funktionen von zwei ERSPAN-Versionen: v1 (Typ II) und v2 (Typ III)

Erstellung eines ERSPAN-Tunnels
# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX
oder
# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID
tc-Filter zur Überwachung des Datenverkehrs hinzufügen
# tc qdisc add dev MONITOR_DEV handle ffff: ingress
# tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1

Konfiguration

Dateien

Anhang

Siehe auch


ip link help

Dokumentation

Man-Page
Info-Pages

Links

Projekt
Weblinks
  1. https://developers.redhat.com/blog/2019/05/17/an-introduction-to-linux-virtual-interfaces-tunnels
  2. https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking