
Ich versuche, ein seltsames Routing-Problem zu lösen. Ich habe meinen Router (Turris, mit angepasstem OpenWRT) mit einer Strongswan-Tunneling-IPv6-Verbindung eingerichtet. Das funktioniert für den Router selbst gut, da seine IPv6-Konnektivität einwandfrei funktioniert (über den Tunnel, mein Provider bietet kein natives IPv6 an).
TL;DR: Routen werden nicht wie erwartet ausgewählt, da die allgemeinste Route, ::/0, immer bevorzugt zu werden scheint, obwohl eine /64-Übereinstimmung verfügbar ist.
Als ich jedoch versuchte, dies auf mein Heimnetzwerk auszuweiten, stieß ich auf ein Problem, für das ich die Ursache nicht finden konnte.
Obwohl IPSec funktioniert, erhalte ich eine IPSec0-Schnittstelle und diese Routen:
Kernel IPv6 routing table
Destination Next Hop Flags Metric Ref Use Iface
::/0 :: U 1024 0 2 ipsec0
2a01:490:19:42::/64 :: U 1024 0 0 br-lan
Hier ist 2a01:490:19:42::/64 ein Rang, den ich meinem lokalen Netzwerk zugewiesen habe, 2a01:490:19:42::1 ist die IP-Adresse des Routers in diesem Netzwerk.
Hier sind einige Beobachtungen:
1) Wenn ich von einem Computer in meinem lokalen Netzwerk aus 2a01:490:19:42::1 anpinge, antwortet der Router, sendet die Antwort aber an die ipsec0-Schnittstelle. Ich habe keine Ahnung, warum. Sollte nicht das spezifischere Präfix 2a01:490:19:42::/64 auf br-lan bevorzugt werden? Es scheint die Quell-IP-Adresse 2a01:490:19:42::1 korrekt auszuwählen.
2) Das Gleiche passiert, wenn ich versuche, ein Paket von meinem lokalen Netzwerk an eine andere Site zu senden, beispielsweise ping6 stackexchange.com. Die Pakete gelangen zum Router, werden weitergeleitet, der Server sendet eine Antwort, der Router empfängt sie ... und sendet sie zurück an die ipsec0-Schnittstelle.
3) Es gibt keine Xfrm-Richtlinien. ip xfrm pol
gibt nichts zurück. Aber Strongswan läuft und ich hatte den Eindruck, dass Strongswan immer einige Richtlinien erstellt. In meinem vorherigen Setup musste ich einige hinzufügen, um die Weiterleitung von Paketen in den Tunnel zu ermöglichen, aber ich bin etwas verwirrt, dass die Richtlinienliste leer ist.
Also gut, was ist falsch? Warum wird die allgemeinste Route, ::/0, für meine IPv6-Pakete bevorzugt?
Danke!
Antwort1
Das Problem bestand darin, dass IPSec seine Regeln in eine andere Routing-Tabelle (Tabelle 220
) einfügte und eine Richtlinie erstellte, um den Datenverkehr dorthin zu leiten:
root@turris:/etc/config# ip rule list
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
Die Tabelle 220
enthielt jedoch nur die Standardroute in den IPSec-Tunnel und nicht ins lokale Netzwerk:
root@turris:/etc/config# ip -6 r show table 220
default dev ipsec0 proto static src 2a01:490:19:42::1 metric 1024
Dies führte zwangsläufig dazu, dass alle Pakete in den Tunnel weitergeleitet wurden.
Netzwerke für den Router selbst funktionierten nur, weil sie akzeptiert und nicht geroutet wurden.
Ich habe das behoben, indem ich strongswan angewiesen habe, Routing-Regeln stattdessen in die Haupttabelle einzufügen, indem ich charon.routing_table = 254
(die ID von main, wie in zu sehen /etc/iproute2/rt_tables
) gesetzt habe. Mein strongswan.conf
sieht jetzt so aus:
charon {
# load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
routing_table = 254 # main
}