
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 ifupdown
ist v4tunnel
es 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-ipv6
sind 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 interfaces
sollten die Einstellungen angepasst werden, indem man einen anderenmetrischin jedem, sonst sbtb-ipv6
schlä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 local
beim 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 interfaces
Konfigurationsdatei integriert werden, indem up
/ down
-Befehle verwendet werden, wo immer ifupdown
die 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 exists
und 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-ipv6
wenn beide aktiv sind. Um die sbtb-ipv6
Schnittstelle 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