Einführung in virtuelle Linux-Schnittstellen: Tunnel

Linux unterstützt viele Arten von Tunneln. Dies verwirrt Anfänger, die Schwierigkeiten haben, die technologischen Unterschiede zu verstehen und zu verstehen, welcher Tunnel in einer bestimmten Situation besser zu verwenden ist. Das Material, dessen Übersetzung wir heute veröffentlichen, gibt einen kurzen Überblick über die häufig verwendeten Tunneling-Schnittstellen des Linux-Kernels. Wir werden uns nicht eingehend mit diesem Thema befassen, sondern nur die allgemeinen Merkmale von Tunneln und Optionen für ihre Verwendung unter Linux berücksichtigen.



Der Autor dieses Materials ist der Ansicht, dass das, was hier diskutiert wird, für jeden von Interesse sein kann, der etwas mit der Verwaltung von Computernetzwerken zu tun hat. Die Liste der Tunnelschnittstellen sowie Referenzinformationen zu einer bestimmten Konfiguration können mit dem Hilfebefehl iproute2 ip link help abgerufen werden.

Die folgenden häufig verwendeten Schnittstellen werden hier behandelt: IPIP, SIT, ip6tnl, VTI und VTI6, GRE und GRETAP, GRE6 und GRE6TAP, FOU, GUE, GENEVE, ERSPAN und IP6ERSPAN.

Nachdem Sie diesen Artikel gelesen haben, lernen Sie die Funktionen dieser Schnittstellen kennen und die Unterschiede zwischen ihnen herausfinden. Sie lernen, wie Sie sie erstellen und Situationen kennen, in denen sie am besten verwendet werden.

IPIP


Der IPIP-Tunnel ist, wie der Name schon sagt, ein Tunnel, der im IP-over-IP-Modus betrieben wird ( RFC 2003 ). Der IPIP-Tunnelpaket-Header ist wie unten gezeigt.


IPIP-Tunnelpaket-Header

Solche Tunnel werden üblicherweise verwendet, um zwei interne IPv4-Subnetze über ein öffentliches IPv4-Netzwerk (Internet) zu verbinden. Die Verwendung von IPIP führt zu einer minimalen zusätzlichen Belastung des Systems, in einem solchen Tunnel kann jedoch nur eine Einwegdatenübertragung (Unicast) durchgeführt werden. Das heißt, nachdem ein solcher Tunnel gebaut wurde, wird es nicht möglich sein, ihn für die Multicast-Datenübertragung zu verwenden.

IPIP-Tunnel unterstützen die Modi IP over IP und MPLS over IP.

Beachten Sie, dass der Linux-Kernel beim Laden des IPIP-Moduls oder beim erstmaligen Erstellen des tunl0 Geräts in jedem Namespace ein Standardgerät tunl0 mit den Attributen local=any und remote=any . Beim Empfang von IPIP-Paketen leitet der Kernel diese in bestimmten Fällen an tunl0 als Standardgerät um. Dies geschieht, wenn der Kernel kein anderes Gerät finden kann, dessen local/remote Attribute besser mit den Quell- und Zieladressen der Pakete übereinstimmen.

So erstellen Sie einen IPIP-Tunnel:

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 Add a remote internal subnet route if the endpoints don't belong to the same subnet # 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 

Bitte beachten Sie, dass diese Konfiguration bei Verwendung mit realen Daten in Einklang gebracht werden muss. Insbesondere müssen LOCAL_IPv4_ADDR , LOCAL_IPv4_ADDR , REMOTE_IPv4_ADDR und REMOTE_INTERNAL_SUBNET durch die in Ihrer Umgebung verwendeten Adressen ersetzt werden. Gleiches gilt für andere Konfigurationsbeispiele, die wir später betrachten werden.

Setz dich


SIT (Simple Internet Transition) ist eine Tunneling-Technologie, deren Hauptzweck darin besteht, isolierte IPv6-Netzwerke über das Internet mithilfe des IPv4-Protokolls zu verbinden.

Anfänglich konnte die SIT-Technologie nur im Tunnelmodus „IPv6 über IPv4“ funktionieren. Im Laufe der Jahre der Entwicklung hat es jedoch die Unterstützung mehrerer weiterer Modi erhalten. Insbesondere ist es ipip (dasselbe geschah mit dem IPIP-Tunnel), ip6ip , mplsip und any mplsip .

any Modus wird verwendet, um mit IP- und IPv6-Verkehr zu arbeiten, was in einigen Situationen nützlich sein kann. SIT-Tunnel unterstützen auch ISATAP . Hier ist ein Beispiel für die Verwendung dieser Technologie.

Der Header des SIT-Pakets ist wie unten gezeigt.


SIT-Tunnelpaket-Header

Wenn das sit Modul sit0 , erstellt der Linux-Kernel das Standardgerät sit0 .

So erstellen Sie einen SIT-Tunnel (diese Schritte müssen auf den Servern A und B ausgeführt werden):

 # 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 

Ip6tnl


Die ip6tnl-Schnittstelle funktioniert im IPv4 / IPv6-über-IPv6-Modus. Es ähnelt der IPv6-Version des SIT-Tunnels. So sieht der ip6tnl-Paket-Header aus.


Ip6tnl Tunnelpaket-Header

Ip6tnl-Tunnel unterstützen ip6ip6 , ipip6 und any Modi. Der ipip6 Modus ipip6 durch das IPv4-über-IPv6-Schema dargestellt, der ip6ip6 Modus ist IPv6 über IPv6. any Modus unterstützt beide Schemata.

Wenn das ip6tnl Modul ip6tnl wird, erstellt der Linux-Kernel ein Standardgerät namens ip6tnl0 .

So erstellen Sie einen ip6tnl-Tunnel:

 # ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any 

VTI und VTI6


Die Linux VTI-Schnittstelle (Virtual Tunnel Interface) ähnelt der Cisco VTI-Schnittstelle und der Juniper-Implementierung eines sicheren Tunnels (st.xx).

Dieser Tunneltreiber implementiert die IP-Kapselung, die mit xfrm verwendet werden kann, um sichere Tunnel zu erstellen und dann Routing-Tunnel auf Kernel-Ebene über solche Tunnel zu verwenden.

Im Allgemeinen funktionieren VTI-Tunnel ähnlich wie IPIP- oder SIT-Tunnel. Die Ausnahme ist, dass sie fwmark und IPsec-Kapselung / -Entkapselung verwenden.

VTI6 ist das IPv6-Äquivalent von VTI.

So erstellen Sie einen VTI-Tunnel:

 # 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 

Darüber hinaus kann IPsec mit Libreswan oder StrongSwan konfiguriert werden.

GRE und GRETAP


Die GRE-Technologie (Generic Routing Encapsulation) ist in RFC 2784 beschrieben . Beim GRE-Tunneling wird ein zusätzlicher GRE-Header zwischen den Headern der internen und externen IP-Pakete hinzugefügt.

Theoretisch kann GRE Pakete eines beliebigen Layer 3-Protokolls mit einem gültigen Ethernet-Typ kapseln. Dies unterscheidet die GRE-Technologie von der IPIP-Technologie, die nur die Kapselung von IP-Paketen unterstützt. So sieht der Paket-Header bei Verwendung der GRE-Technologie aus.


GRE-Tunnelpaket-Header

Bitte beachten Sie, dass GRE-Tunnel Multicast- und IPv6-Unterstützung ermöglichen.

Beim Laden des gre Moduls erstellt der Linux-Kernel das Standardgerät gre0 .

So erstellen Sie einen GRE-Tunnel:

 # 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, arbeiten GRETAP-Tunnel auf OSI-Schicht 2. Dies bedeutet, dass einer der internen Header der jeweiligen Pakete Ethernet-Header sind.


GRETAP-Tunnelpaket-Header

So erstellen Sie einen GRETAP-Tunnel:

 # ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR 

GRE6 und GRE6TAP


GRE6 ist das IPv6-Äquivalent von GRE. Mit GRE6-Tunneln können Sie jedes Layer 3-Protokoll in IPv6 kapseln. So sieht der GRE6-Paket-Header aus.


GRE6 Tunnel Package Header

In GRE6TAP-Tunneln befinden sich wie in GRETAP-Tunneln Ethernet-Header unter den internen Paket-Headern.


GRE6TAP-Tunnelpaket-Header

So erstellen Sie einen GRE-Tunnel:

 # ip link add name gre1 type gre6 local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR # ip link add name gretap1 type gretap6 local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR 

Fou


Das Tunneln kann auf verschiedenen Ebenen des Netzwerkstapels durchgeführt werden. Auf der IP-Ebene gibt es IPIP-, SIT- und GRE-Tunnel. Und die FOU-Tunnel (sie sind nach dem Schema „foo over UDP“ angeordnet) arbeiten auf UDP-Ebene.

Die Verwendung des UDP-Tunnels gegenüber dem IP-Tunneling bietet einige Vorteile. Tatsache ist, dass das UDP-Protokoll mit der vorhandenen Hardware-Infrastruktur funktioniert.

Dies ist beispielsweise RSS in Netzwerkkarten, ECMP in Switches. Dies sind Technologien zur Berechnung von Prüfsummen ohne Beteiligung eines Zentralprozessors. Das Anwenden des entsprechenden FOU- Patches auf Entwickler zeigt eine signifikante Leistungssteigerung für SIT und IPIP.

Derzeit unterstützen FOU-Tunnel die Protokollkapselung basierend auf IPIP, SIT und GRE. So könnte der Header eines FOU-Pakets aussehen.


FOU Tunnel Paket Header

So erstellen Sie einen FOU-Tunnel:

 # 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 den empfangenden FOU-Port für IPIP, das an 5555 gebunden ist. Um GRE verwenden zu können, müssen Sie ipproto 47 . Der zweite Befehl konfiguriert die neue virtuelle IPIP-Schnittstelle ( tun1 ), die für die FOU-Kapselung ausgelegt ist und deren Zielport 5555 ist.

Bitte beachten Sie, dass FOU-Tunnel unter Red Hat Enterprise Linux nicht unterstützt werden.

Gue


Eine andere Art des UDP-Tunnelns wird durch die GUE-Technologie ( Generic UDP Encapsulation ) eingeführt. Der Unterschied zwischen FOU und GUE besteht darin, dass GUE einen eigenen Header hat, der Protokollinformationen und andere Daten enthält.

GUE-Tunnel unterstützen derzeit die interne Kapselung von IPIP, SIT und GRE. So könnte ein GUE-Paket-Header aussehen.


GUE Tunnel Package Header

So erstellen Sie einen GUE-Tunnel:

 # 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 

Dank dieser Befehle werden ein empfangender GUE-Port für IPIP, der an die Nummer 5555 gebunden ist, und ein IPIP-Tunnel erstellt, der für die GUE-Kapselung konfiguriert ist.

GUE-Tunnel werden unter Red Hat Enterprise Linux nicht unterstützt.

GENF


Die GENEVE-Tunnel (Generic Network Virtualization Encapsulation) unterstützen alle Funktionen von XLAN, NVGRE und STT. Die GENEVE-Technologie wurde entwickelt, um die identifizierten Einschränkungen dieser drei Technologien zu umgehen. Viele glauben, dass diese Technologie diese drei älteren Formate langfristig vollständig ersetzen kann. So sieht der GENEVE-Tunnelpaket-Header aus.


GENEVE Tunnel Package Header

Dieser Header ähnelt dem Header eines VXLAN- Pakets. Der Hauptunterschied zwischen den beiden besteht darin, dass der GENEVE-Header flexibler ist. Es macht es sehr einfach, neue Funktionen zu implementieren, indem Header mithilfe von TLV-Feldern (Type-Length-Value) erweitert werden.

Details zu GENEVE finden Sie hier und hier .

GENEVE wird in der Open Virtual Network (OVN) SDN-Lösung als Standard-Kapselungstool verwendet. So erstellen Sie einen GENEVE-Tunnel:

 # ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR 

ERSPAN und IP6ERSPAN


Die ERSPAN-Technologie (Encapsulated Remote Switched Port Analyzer) verwendet die GRE-Kapselung, um die grundlegenden Funktionen der Portspiegelung von Schicht 2 auf Schicht 3 zu erweitern. Auf diese Weise können Sie gespiegelten Datenverkehr über ein geroutetes IP-Netzwerk weiterleiten. So sieht der ERSPAN-Paket-Header aus.


ERSPAN Tunnel Package Header

Mit ERSPAN-Tunneln können Linux-Hosts als ERSPAN-Verkehrsquelle fungieren und gespiegelten ERSPAN-Verkehr entweder an einen Remote-Host oder an ein ERSPAN-Ziel senden, das ERSPAN-Pakete empfängt und verarbeitet, die von Cisco-Switches oder anderen Geräten, die ERSPAN unterstützen, generiert wurden. Ein ähnliches System kann zur Analyse und Diagnose des Netzwerks verwendet werden, um böswilligen Datenverkehr zu erkennen.

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

So erstellen Sie ERSPAN-Tunnel:

 # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX 

Sie können dies auch tun:

 # 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 

Fügen Sie einen TC-Filter hinzu, um den Datenverkehr zu überwachen:

 # 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 

Zusammenfassung


Wir haben hier einige Tunneltechnologien unter Linux behandelt. Hier ist eine Übersichtstabelle für sie.

Tunnel- / Verbindungstyp
Äußerer Header
Eingekapselter Header
Innerer Header
ipip
IPv4
Keine
IPv4
sitzen
IPv4
Keine
IPv4 / IPv6
ip6tnl
IPv4
Keine
IPv4 / IPv6
vti
IPv4
IPsec
IPv4
vti6
IPv6
IPsec
IPv6
gre
IPv4
GRE
IPv4 / IPv6
gretap
IPv4
GRE
Ether + IPv4 / IPv6
gre6
IPv6
GRE
IPv4 / IPv6
gre6tap
IPv6
GRE
Ether + IPv4 / IPv6
fou
IPv4 / IPv6
UDP
IPv4 / IPv6 / GRE
gue
IPv4 / IPv6
UDP + GUE
IPv4 / IPv6 / GRE
genve
IPv4 / IPv6
UDP + Geneve
Ether + IPv4 / IPv6
erspan
IPv4
GRE + ERSPAN
IPv4 / IPv6
ip6erspan
IPv6
GRE + ERSPAN
IPv4 / IPv6

Bitte beachten Sie, dass alle Tunnel, deren Erstellungsbeispiele hier gezeigt werden, nur bis zum Neustart des Servers vorhanden sind. Wenn Sie einen Tunnel erstellen möchten, der nach dem Neustart wiederhergestellt wird, sollten Sie einen Dämon verwenden, um das Netzwerk wie NetworkManager zu konfigurieren, oder den entsprechenden Mechanismus aus der von Ihnen verwendeten Linux-Distribution verwenden.

Liebe Leser! Welche Linux-Tunnel verwenden Sie?

Source: https://habr.com/ru/post/de457386/


All Articles