Zwei IPv6-Tunnel von unterschiedlichen Anbietern auf demselben Host

Zwei IPv6-Tunnel von unterschiedlichen Anbietern auf demselben Host

Meine Frage bezieht sich aufDasFrage, aber mit kleinem Unterschied:

Ich habe einen Ubuntu-VPS mit einer einzigen IPv4 auf der Hauptschnittstelle. Ich möchte auf dieser Maschine zwei separate IPv6-Tunnel von zwei verschiedenen Anbietern mit unterschiedlichen Endpunktadressen haben. Wenn ich einen davon einzeln ausprobiere, ist alles in Ordnung. Aber wenn ich den zweiten Tunnel hinzufüge, funktioniert der erste immer noch, aber der zweite kann nicht von außen angepingt werden. Er kann jedoch sich selbst und das Gateway anpingen.

Ich füge diese Zeile zu meinem hinzu /etc/network/interfaces:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1

Weiß jemand, wo das Problem liegt oder wie ich das Problem weiter beheben kann?

Antwort1

Ein paar Bemerkungen

Für andere Netzwerkkonfigurationstools als ifupdownist v4tunneles wirklich eine Schicht 3SITZENTunnel, der je nach Werkzeug mit dem Äquivalent von ip tunnel add FOO mode sit ...oder von erstellt werden kann ip link add name FOO type sit ....

Layer-3-Schnittstellen haben keine Layer-2-Adresse (keine Ethernet-MAC-Adresse) und müssen daher die Adresse der darunterliegenden Layer-2-Schnittstelle nicht auflösen: ARP (IPv4) und NDP (IPv6) finden bei Layer-3-Schnittstellen nicht statt. Aus demselben Grund gibt es auch kein aufzulösendes Gateway: Ein Gateway wird für seine Gateway-Eigenschaft nicht benötigt, aber die Syntax kann es trotzdem ermöglichen, die zu verwendende Schnittstelle zu erraten, wenn ein Routing-Tabelleneintrag erstellt wird, ohne die Schnittstelle anzugeben, und das wird normalerweise getan, einschließlich derTunnelbroker eigene Konfigurationsbeispiele. Letztendlich sind die Verwendung einer /64-Netzmaske und eines Gateways für das Setup des OP nirgends erforderlich. Diese Antwort wird sich jedoch trotzdem an diese Einstellungen halten, sodass es für einen Leser einfacher wird, sie an einen Layer-2-Schnittstellentunnel anzupassen, bei dem alle diese Einstellungen dann obligatorisch werden. Ebenso sbtb-ipv6sind normalerweise nur Einstellungen für die nicht standardmäßige Schnittstelle (hier) erforderlich, aber ich stelle trotzdem ein Setup für die beiden Schnittstellen bereit. Der einzige verbleibende Unterschied besteht darin, welche Schnittstelle die Standardroute in der Hauptroutingtabelle erhält.

Multihoming und Policy-Routing

Es handelt sich hier um eineMultihoming-System mit mehreren Adressenjeder mit seinem eigenen Pfad zum (IPv6) Internet. Upstream-Router implementieren mit SicherheitStrikte Reverse Path Forwarding(SRPF) zum Schutz vor Spoofing: Jede Quelladresse muss ihren dedizierten Pfad durchlaufen. Beim einfachen Routing wird nur eine Standardroute verwendet (die zuerst angezeigte). Es ist möglich, eine zweite Standardroute mit längerer Metrik hinzuzufügen, diese wird jedoch nie ausgewählt, bis die Route mit der kürzeren Metrik verschwindet.

Um dies zu überwinden, kann man verwendenRichtlinienrouting. Dadurch kann das System andere Routingtabellen (mit anderen Routen gefüllt) und Routingregeln auswählen, die diese Routingtabellen mit zusätzlichen Selektoren auswählen, anstatt nur das Ziel zur Suche der Route zu verwenden. Hier ist die Quelladresse (und in einigen Fällen auch die ausgehende Schnittstelle, wenn diese Schnittstelle mitSO_BINDTODEVICE).

Das Ziel besteht also darin, mehrere alternative Routingtabellen mit einer Teilansicht der Routen zu erstellen, die auf Einträgen der Hauptroutingtabelle basieren: Jede Routingtabelle berücksichtigt, dass nur ein Pfad zum Internet existiert, und verfügt über eine eigene Standardroute. Anschließend wählt eine Routingregel basierend auf der Quelladresse die entsprechende Routingtabelle für ausgehende Pakete aus. Im Fall des OP ist für eingehende Pakete nichts Besonderes erforderlich, da die lokale Routingtabelle diesen Fall bereits behandelt.

Implementierung

Zuerst interfacessollten die Einstellungen angepasst werden, indem man einen anderenmetrischin jedem, sonst sbtb-ipv6schlägt die Einrichtung wahrscheinlich fehl, weil es nicht zwei Standardrouten mit derselben Metrik geben kann.

So funktioniert es dann manuell: Fügen Sie zwei Routing-Tabellen mit (beliebigen) Werten hinzu: 2000 für HE und 2001 für SBTB und kopieren Sie nur die zugehörigen Routen in jede Tabelle. Die Metrik spielt hier keine Rolle, da kein möglicher Konflikt besteht.

ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6             table 2000
ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6   table 2000

ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6           table 2001
ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001

Und wählen Sie die entsprechende Route basierend auf der Quelladresse mit Routing-Regeln aus (und geben Sie ausdrücklich eine feste Priorität an und geben Sie an, dass es sich um ein lokal initiiertes Paket handelt mit iif lo):

ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001

Wenn an die Schnittstelle (z. B. ping -I sbtb-ipv6 ...) statt „einfach“ an die Adresse der Schnittstelle ( ping -I 2a09:xxx:xxx:xxxx::2) gebunden wird, verwenden Sie für korrekte Ergebnisse auch dies (wirklich nützlich für Layer-2-Fälle, in denen keine zweite Standardroute in der Hauptroutingtabelle existiert, im Fall des OP mit Layer-3-Schnittstellen nicht wirklich erforderlich):

ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001

Die entgegengesetzte Richtung (eingehender Datenverkehr, auch Ingress genannt) wird localbeim Hinzufügen von Adressen bereits ordnungsgemäß in der Routing-Tabelle behandelt. Daher muss für Ingress nichts Besonderes getan werden.

Endgültige Konfiguration

Oben genanntes sollte zuerst manuell versucht werden, mit einem Backup-Remote-Konsolenzugriff (obwohl IPv4 nicht betroffen ist, sollte der IPv4-Zugriff ausreichen). Dann kann es in die interfacesKonfigurationsdatei integriert werden, indem up/ down-Befehle verwendet werden, wo immer ifupdowndie Funktion nicht unterstützt wird (z. B.: das gesamte Policy-Routing). Achten Sie darauf, vorherige manuelle Tests zu entfernen, da sonst einige Befehle im Schnittstellen-Setup mit Fehlern wie kollidieren RTNETLINK answers: File existsund die Schnittstellenkonfiguration fehlschlägt.

UPDATE: Dazu gehört auch das Senden von drei Pings an das Remote-Ende des SBTB-Tunnels, da es aus den Kommentaren hervorgeht, dass dieser Tunnel Datenverkehr vom Server sehen muss, bevor er Datenverkehr zum Server akzeptieren kann. Wenn die SBTB-Peer-Adresse (getunnelt) nicht ausreicht, um die Annahme von Datenverkehr zum Server auszulösen, ersetzen Sie sie durch eine „bekannte“ IPv6-Adresse. Dasselbe könnte auf der HE-Schnittstelle hinzugefügt werden, aber das scheint nicht erforderlich zu sein.

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1
        metric 1000
        up   ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
        up   ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
        up   ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
        up   ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
        down ip -6 rule del pref 20001
        down ip -6 rule del pref 20000

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1
        metric 1001
        up   ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
        up   ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
        up   ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
        up   ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
        up ping -q -c3 -I sbtb-ipv6 2a09:xxx:xxx:xxxx::1
        down ip -6 rule del pref 20011
        down ip -6 rule del pref 20010

Wie benutzt man?

Nun kann man eine oder beide Schnittstellen aktivieren. Es wird immer richtig funktionieren, wobei Priorität gegeben wird, he-ipv6wenn beide aktiv sind. Um die sbtb-ipv6Schnittstelle zu verwenden, wenn beide aktiv sind, sollte man sich an ihre Adresse oder an die Schnittstelle selbst binden. Hier sind Beispiele, um die Route anzuzeigen, die der Kernel voraussichtlich verwenden wird:

# ip route get to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 src 2001:xxx:xxx:xxxx::2 metric 1000 pref medium

# ip route get from 2001:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2001:xxx:xxx:xxxx::2 via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif he-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get from 2a09:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2a09:xxx:xxx:xxxx::2 via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif sbtb-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

Verschiedene Befehle, Daemons oder Tools erfordern verschiedene Optionen zum Binden an eine andere Quelladresse oder ein anderes Gerät. Z. B.: ping -I, traceroute -i, curl --interface, ssh -b/ ssh -B, usw.

Dies kann durch Vergleichen des Ergebnisses eines dieser Befehle überprüft werden:

curl -6 https://ifconfig.co
curl -6 --interface 2001:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface he-ipv6 https://ifconfig.co

gegenüber dem Ergebnis eines dieser:

curl -6 --interface 2a09:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface sbtb-ipv6 https://ifconfig.co

verwandte Informationen