Delegated IPv6 Präfix wird sehr zeitverzögert aktualisiert

Started by Kju, February 08, 2022, 07:38:46 PM

Previous topic - Next topic
Hallo zusammen,

ich bin noch sehr neu bei OPNsense und teste gerade dessen IPv6 Fähigkeiten für den Heimgebrauch, da mir die kaputte Implementierung bei Mikrotik (zumindest bei dynamischen Präfixen) auf den Senkel geht. Ich hoffe mit OPNsense eine Alternative gefunden zu haben. :)

Leider habe ich aber auch mit OPNsense ein Problem, zu dem ich hier hoffentlich eine Lösung finde. Vielleicht habe ich auch einfach nur irgendwo einen Haken vergessen.

Zu meinem Testaufbau:
- Aktuelle Version OPNsense 22.1
- VM mit zwei virtuellen Interfaces, 1x WAN (VLAN 10 als Access Port), 1x LAN (VLAN aware)
- VM hängt hinter einer Fritzbox, welches die Einwahl macht und IPv6 Präfixe per DHCP6 verteilt
- WAN Interface erhält eine IPv6 Adresse sowie ein delegated prefix /60
- VLAN100 auf LAN-Interface erstellt, konfiguriert als "Track Interface" und sendet Router Advertisements

Das funktioniert alles hervorragend. Meine Geräte in VLAN 100 bekommen eine IPv6 Adresse und IPv6 Traffic funktioniert wunderbar. Nun kommt aber das Aber:
Sobald sich mein vom ISP zugeteiltes IPv6 Präfix ändert, erhält das WAN-Interface innerhalb weniger Sekunden eine neue IPv6 Adresse. Die alte Adresse wird als Deprecated markiert. Leider holt sich OPNsense im Anschluss kein neues Präfix per DHCPv6 (verifiziert via packet capture), sondern erst nach einigen Stunden, wahrscheinlich wenn der Lease ausläuft? Nach der täglichen Zwangstrennung (ja, einige ISPs machen das noch  ::) ) dauerte es die letzten Tage 1,5 Stunden, bis OPNsense sich ein neues gültiges Präfix geholt hat. In der Zeit ist IPv6 kaputt, da mir die IPs vom ISP nicht mehr zugeteilt sind. Sobald OPNsense ein neues Präfix erhalten hat, wird das Netz auf VLAN100 aktualisiert und den Clients mitgeteilt, dass die alte Adresse deprecated ist und diese sich eine neue IPv6 aus dem aktuellen Netz zuweisen dürfen (der Part, der bei Mikrotik nicht anständig funktioniert).

Nun ist die Frage: Wie überrede ich OPNsense dazu, per DHCP6 nach einem neuen Präfix zu fragen, sobald das WAN-Interface eine neue IPv6 erhalten hat? Hab ich eine Einstellung dafür vergessen? Zumindest in meinem Fall bedeutet eine neue WAN-IPv6 auch ein neues IPv6-Präfix. Händisch kann ich das forcieren, indem ich im WAN-Interface bei DHCP auf "reload" klicke.

Ich würde mich freuen, wenn mir jemand bei diesem Problem weiter helfen könnte. :)

Viele Grüße

Am besten nicht auf die Zwankstrennung warten, sondern unter "System -> Settings -> Cron" ein festen Zeitpunkt für die Zwangstrennung eintragen.

Dann mache die Firewall ein aktives Reload auf die Schnittstelle WAN und fordert "schnell" ein Prefix an.

Trotzdem ist mir aufgefallen, dass es einige Zeit dauern kann, bis das Interface, welches mit TRACK INTERFACE ein ipv6-Bereich zugewiesen bekommen, tatsächlich erhält.

Jap, dauert bei mir auch manchmal ein paar Minuten bis LAN und co ihr v6 wieder haben.
i am not an expert... just trying to help...

Danke für euren Input.

Ein Cronjob würde es auf jeden Fall besser machen, aber so richtig gefallen tut es mir immer noch nicht. In der Fritzbox ist eine Zeit für die Zwangstrennung eingetragen (ansonsten wird diese vom ISP nicht immer zur selben Zeit gemacht) und kurz darauf könnte ich per Cronjob natürlich das Interface Reloaden. Dann sollte der IPv6-Ausfall minimal sein. Probleme hab ich jedoch, wenn die Fritzbox rebootet wird, z.B. durch ein Update oder aus anderem Gründen die Verbindung zu anderen Zeiten unterbrochen wird.

Bei mir läuft >40% meines Traffic über v6, weshalb mir die Sache schon recht wichtig ist.

Der Cronjob brachte mich aber auf eine andere Idee:
Ich habe mir ein kleines Shell-Skript geschrieben, welches schaut, ob sich die öffentliche IPv6 auf dem WAN-Interface geändert hat. Wenn dem so ist, wird das Interface neu gestartet. Das ganze läuft als Cron 1x die Minute. In meinen Tests haben meine Clients so immer innerhalb einer Minute eine neue v6 Adresse bekommen.

Statt dem Restart wäre nur ein neues Präfix anfordern natürlich noch besser, aber leider habe ich bisher nicht herausgefunden, wie das über die Shell geht. Ich hatte jetzt auch keine Lust mehr, in den PHP-Skripten zu stöbern. :)

Hier nun einmal mein erste Version von dem Skript:
#!/bin/sh

INT="em0"
FILE="/tmp/oldWanIp"

if [ -f "$FILE" ]; then
    oldIP=`cat "$FILE"`
else
    oldIP=""
fi

newIP=`ifconfig "$INT" | grep -v deprecated | awk '/inet6 2001/{print $2}'`

echo "Old IP: $oldIP"
echo "New IP: $newIP"

if [ "$oldIP" != "$newIP" ]; then
    echo "reload WAN interface"
    /usr/local/sbin/configctl interface linkup stop "$INT"
    /usr/local/sbin/configctl interface reconfigure "$INT"
    /usr/local/sbin/configctl interface linkup start "$INT"
    echo "$newIP" > "$FILE"
fi


Gestern hatte ich noch probiert, ein Legacy Plugin zu schreiben. Ich habe auf das newwan-Event gelauscht. Aber scheinbar wird das Event nicht getriggert, wenn sich das WAN Interface über SLAAC eine neue IPv6 zugewiesen hat. Außerdem habe ich in den PHP-Skripten gesehen, dass wenn "Request only an IPv6 prefix" aktiviert ist, das Event auch nur getriggert wird, wenn sich das Präfix ändert. Also so ein bisschen Henne Ei Problem. :)

Weitere Verbesserungsvorschläge werden gerne entgegen genommen, aber ich hoffe, dass sich meine IPv6 Probleme damit nun endlich weitestgehend erledigt haben. Besser als übers Mikrotik scheint es jetzt schon definitiv zu sein. Kann also gut sein, dass ich mir demnächst eine SFP+-Netzwerkkarte für meinen Server besorgen muss.  ;D ::)

Nicht persönlich nehmen, aber so ein Gefrickel soll die Zukunft des Internets sein? IPv6 gehört verboten...
kind regards
chemlud
____
"The price of reliability is the pursuit of the utmost simplicity."
C.A.R. Hoare

felix eichhorns premium katzenfutter mit der extraportion energie

A router is not a switch - A router is not a switch - A router is not a switch - A rou....

Hi  :D

1. Du hast IPv4 falsch geschrieben. Diese ganzen Krücken und Hacks die wir tagtäglich nutzen müssen, gehören tatsächlich verboten. Und von den Kosten von IPv4 Adressen will ich gar nicht erst anfangen. Viele meiner Dienste im Internet lasse ich schon auf IPv6 Only laufen. :D
2. Habe ich ein Problem gefixt, was die meisten OPNsense-Nutzer wahrscheinlich gar nicht wirklich wahrnehmen, da sie entweder:
- Kein IPv6 konfiguriert haben
- Einen anständigen ISP haben der keine Zwangstrennungen macht und die Leasetime der Präfixe mehrere Tage beträgt (da muss ich Telekom positiv hervorheben) oder gar feste IPs haben
- Einen ISP haben, der es nicht einmal im Jahre 2022 geschafft hat, IPv6 auszurollen. (Hallo EWE *klick* )
- oder die Trennung i.d.R. Nachts ist und sich alles eh nach einer halben Stunde bis Stunde wieder repariert hat und da alle schalfen.

Ich empfinde ein simples Skript jetzt auch nicht als Gefrickel. Auf der Arbeit schreibe ich täglich Skripte um Dinge zu automatisieren, optimieren oder realisieren, die out of the Box nicht möglich sind.
Und man sollte auch nicht vergessen, dass das Problem nur durch die zwischengeschaltete Fritzbox kommt. Wenn OPNsense nicht wäre, würde die Fritzbox zuverlässig IPv6 Adressen verteilen (bzw die Clients sich welche per SLAAC zuweisen), auch nach einer Zwangstrennung - einfach da das DHCPv6 entfällt. Wenn die Fritzbox nicht wäre und OPNsense hier alleine stehen würde, wäre das vielleicht ebenfalls so.

PS: Bitte nimm Punkt 1 mit etwas Humor. Es ist meine Meinung und die einiger Netzwerker-Kollegen aus der Firma. :)

Hi Kju,

ich habe exakt das selbe Problem (auch mit ner FB dazwischen) und hatte mir damals auch ein ähnliches script gebaut, was aber irgenwann nicht mehr funktioniert hat (vermutlich wegen configctl) und ich dann keine Lust mehr hatte und wieder v6 deaktivierte. Da ich aber mittlerweile nicht mehr auf v6 verzichten möchte, hatte ich gesucht und den Thread hier gefunden. Fährst du dein Script mit der aktuellsten opnsense Version immer noch so oder hast du was verändert?
Edit: Seems to work :)

Hier noch mein altes Script:

#!/bin/sh
wan_ip="$(ifconfig igb0 | grep inet6 | grep 2003 | grep -v deprecated | awk '{print $2}')"
lan_ip="$(ifconfig igb1 | grep inet6 | grep 2003 | grep -v deprecated | awk '{print $2}')"

#check if tmpfile exists

if [ ! -f "/tmp/v6addr" ]; then ifconfig igb0 | grep inet6 | grep 2003 | grep -v deprecated | awk '{print $2
}' >/tmp/v6addr ; fi

old_ip="$(cat /tmp/v6addr)"

[ -z $old_ip ] && old_ip="-"

if [ $wan_ip != $old_ip ]

then
echo "ip changed!!" >> /tmp/v6addr.log
/usr/local/sbin/configctl interface reconfigure && ifconfig igb0 | grep inet6 | grep 2003 | grep -v deprecated | awk '{print $2}' >/tmp/v6addr && sleep 3 && pkill -9 unbound && pluginctl dns
else
echo "ip did not change" >>/tmp/v6addr.log
exit 0
fi

Quote from: grind on May 08, 2023, 04:13:28 PMEdit: Seems to work :)
Cool, freut mich, dass dir mein Skript weiter geholfen hat. Ich selber nutze es seit ich glaube Oktober nicht mehr, da ich nun wieder bei der Telekom bin und dort alles einfach funktioniert. :)

Moin zusammen,
mit Glück bin ich auf den Beitrag hier gestoßen. Ich habe seit ca. zwei Wochen OPNsense im Einsatz und bin soweit auch mega zufrieden. Leider kommt auch bei mir ein Aber - nämlich IPv6 bzw. die Aktualisierung der Track Interfaces. Hin und wieder kommt es bei mir vor, dass nachts die Leitung einen Reset durch ASSIA oder Wartungsarbeiten bekommt. Dabei ist mir dann aufgefallen, dass meine Geräte auch morgens kein IPv6 mehr haben. Als ISP verwende ich Deutsche Telekom mit einem privaten Tarif.

Wie habt ihr das konfiguriert bei Euch? Ansonsten würde ich gerne das Script bei mir einsetzen, mir fehlt da leider noch die Erfahrung, was wo und wie. Ich würde es zunächst allerdings gerne mal ohne Script versuchen.
Was ich schon probiert habe, die Lease Time im RADVD (unmanaged, also ohne DHCPv6) auf 7260s und die Preferred Time auf 600s zu setzen. MaxInterval ist auf 300s konfiguriert.
Ich habe das Gefühl, das es etwas gebracht hat. Zumindest, wenn ich mal das LAN-Kabel zw. Speedport (Modem) und OPNsense gezogen habe, hatten die Clients spätestens nach 5 Minuten ihren neuen Präfix. Soweit ich weiß, ist es nach RFC auch vorgeschrieben nur Präfixe größer zwei Stunden anzunehmen, ansonsten gilt die alte Laufzeit.
Konfiguriert habe ich PPPoE nach der offiziellen Anleitung, also inkl. "Prevent Release" und "nur einen Präfix anfordern" (also keine WAN-Adresse per DHCPv6 anfordern, da die per SLAAC kommt).

Ich hatte aufgeschnappt, dass es bei pfSense wohl gehen soll, gleichzeitig hatte mir bei einem Testlauf zwischendurch das System insgesamt nicht ganz so zugesagt. OPNsense wirkt für mich irgendwie moderner und gerade hier im deutschen Raum "besser" vertreten. Leider haben sich die Entwickler aus dem offiziellen Issue https://github.com/opnsense/core/issues/6223 zurückgezogen und ich weiß leider nicht, wie wir da helfen können.

Freue mich über Eure Rückmeldung.

Moin zusammen,

ich war mal so frei und hab anhand Eurer Scripts mal einen weiteren Entwurf gemacht, der etwas dynamischer mit den Präfixen umgehen soll und dabei APIPA und ULA ignorieren.
Da ich leider noch nicht weiß, wie ich's auf die OPNsense Hardware mit nem Cron bekomme, kann ich Euch erstmal nur den ungetesten Code geben. Ich hatte mir testweise lokal unter Ubuntu mal ein Textfile mit inet6 etc. erstellt und das anstelle des ifconfig verwendet.

Bei Euren Scripts ist mir aufgefallen, dass einmal ein linkup stop und start dabei ist und beim andere nur ein reconfigure. Ich weiß leider noch nicht ganz, was davon wirklich benötigt wird.

Freu mich über Euer Feedback. Ich nehme gerne auch etwas Hilfe fürs Einrichten vom Cron.  ;) Ich hab in der Oberfläche nur vorgefertige Auswahlmöglichkeiten beim Cron gefunden. Leider weiß ich nicht, wie ich das Script da reinbekomme.

Hier der Code:

#!/bin/sh
#
# checkwanipv6.sh
#
# Script for checking WAN IPv6 changes.
# E.g. Updated prefix after PPPoE reconnect or simply prefix renew

# Interface name like igc1, igb1 etc.
INTERFACE="pppoe0"
FILE="/tmp/wanipv6.old"

# Get current WAN IPv6 address. Ignore APIPA and ULA.
wanipv6=`ifconfig "$INTERFACE" | grep inet6 | grep -v '[[:space:]]fe80:\|[[:space:]]fd31:' | grep -v '\%' | grep -v deprecated | awk '{print $2}'`

# Ensure that wanipv6.old exists. Otherwise create with current WAN IPv6 entry.
if [ ! -f "$FILE" ]; then
    echo "$wanipv6" > "$FILE"
fi

# Get old WAN IPv6 address from file.
wanipv6old=`cat "$FILE"`

echo "Old WAN IPv6: $wanipv6old"
echo "New WAN IPv6: $wanipv6"

if [ "$wanipv6old" != "$wanipv6" ]; then
    echo "WAN IPv6 address has changed. Reload WAN interface."
    /usr/local/sbin/configctl interface linkup stop "$INTERFACE"
    /usr/local/sbin/configctl interface reconfigure "$INTERFACE"
    /usr/local/sbin/configctl interface linkup start "$INTERFACE"
    echo "$wanipv6" > "$FILE"
fi

Beste Grüße

Edit: Ich glaube, ich habe da noch einen Denkfehler drin. Wenn OPNsense selbst die Verbindung via PPPoE aufbaut, habe ich da gerade eine Endlosschleife gebaut? Nach einem reconfigure bekomme ich ja wieder eine neue WAN IP. Habt ihr da noch eine Idee um das zu verhindern?

Moin zusammen,

damit es hier nachvollziehbar und leserlich bleibt, hier nochmal ein neuer Entwurf. Der sollte jetzt die Schleife vermeiden und prüft zusätzlich das LAN-Interface auf Veränderung. Wie findet ihr den neuen Entwurf?

Ich möchte mich an der Stelle auch nochmal für Eure großartige Vorarbeit bedanken. Auf die Idee mit einem Skript bin ich gar nicht gekommen und ich glaube ohne Eure Ansätze wäre es mir auch schwergefallen.

Viele Grüße


#!/bin/sh
#
# checkwanipv6.sh
#
# Script for checking WAN IPv6 changes.
# E.g. Updated prefix after PPPoE reconnect or simply prefix renew.

# Interface name like pppoe0, igc1, igb1 etc.
WAN_INTERFACE="pppoe0"
LAN_INTERFACE="igc0"
WANFILE="/tmp/wanipv6.old"
LANFILE="/tmp/lanipv6.old"

# Get current WAN IPv6 address. Ignore APIPA and ULA.
wanipv6=`ifconfig "$WAN_INTERFACE" | grep inet6 | grep -v '[[:space:]]fe80:\|[[:space:]]fd31:' | grep -v '\%' | grep -v deprecated | awk '{print $2}'`
lanipv6=`ifconfig "$LAN_INTERFACE" | grep inet6 | grep -v '[[:space:]]fe80:\|[[:space:]]fd31:' | grep -v '\%' | grep -v deprecated | awk '{print $2}'`

# Ensure that wanipv6.old exists. Otherwise create with current WAN IPv6 entry.
if [ ! -f "$WANFILE" ]; then
    echo "$wanipv6" > "$WANFILE"
fi

# Ensure that lanipv6.old exists. Otherwise create with current LAN IPv6 entry.
if [ ! -f "$LANFILE" ]; then
    echo "$lanipv6" > "$LANFILE"
fi

# Get old WAN and LAN IPv6 addresses from file.
wanipv6old=`cat "$WANFILE"`
lanipv6old=`cat "$LANFILE"`

echo "Old WAN IPv6: $wanipv6old"
echo "New WAN IPv6: $wanipv6"
echo "Old LAN IPv6: $lanipv6old"
echo "New LAN IPv6: $lanipv6"

# Reload WAN interface as LAN IPv6 address seems to be stuck or empty after WAN IPv6 change.
if [ "$wanipv6old" != "$wanipv6" ] && [ "$lanipv6old" == "$lanipv6" ]; then
    echo "WAN IPv6 address has changed while LAN IPv6 address seems to be stuck. Reload WAN interface."
    /usr/local/sbin/configctl interface linkup stop "$WAN_INTERFACE"
    /usr/local/sbin/configctl interface reconfigure "$WAN_INTERFACE"
    /usr/local/sbin/configctl interface linkup start "$WAN_INTERFACE"
elif [ "$wanipv6old" != "$wanipv6" ] && [ "$lanipv6" == "" ] && [ "$lanipv6old" != "" ]; then
    echo "WAN IPv6 address has changed while LAN IPv6 address seems to be empty. Reload WAN interface."
    /usr/local/sbin/configctl interface linkup stop "$WAN_INTERFACE"
    /usr/local/sbin/configctl interface reconfigure "$WAN_INTERFACE"
    /usr/local/sbin/configctl interface linkup start "$WAN_INTERFACE"
fi

# Save current (empty) IPv6 addresses to file.
echo "$wanipv6" > "$WANFILE"
echo "$lanipv6" > "$LANFILE"


Hey @franco,

vielen Dank für Deine Antwort. Ich wollte Dich tatsächlich nachher auf Github anschreiben und meine Hilfe anbieten. Ich bin bei OPNsense noch nicht so ganz im Thema. Deswegen hatte ich mich erstmal an einem Script versucht. Abseits von IPv6 ist OPNsense die erste Software als Firewall/Router, die mir total zusagt und ich bin einfach begeisert. Ich haben einen riesen Respekt davor, wieviel Arbeit die Entwickler da reininvestieren. Danke für Eure Arbeit!

Muss ich den von dir verlinkten Kommentar per Terminal (ssh) durchführen? Sorry, für die blöde Frage, bin halt noch OPNsense Neuling. Komme eher aus dem C#-Umfeld.

Liebe Grüße und danke!

Hi :)

Ja auf der Console/SSH als root.

IPv6 bekommt schon regelmässig Verbesserungen, aber mehr Hilfe ist immer besser.


Danke
Franco

Hey @franco,

heute habe ich die 23.1.7_3 installiert und wollte gerade den Patch aufspielen. Nun ist mir auf Github allerdings aufgefallen, dass es in einem anderen Issue mit IPv6 auch ein Update mit einem anderen Patch gab.

Welchen Patch zum Testen würdest Du empfehlen?


# opnsense-patch 05c6f2e


vs.


# opnsense-revert -z dhcp6c


Mag nur nichts altes testen, wenn schon neuere Erkenntnisse vorhanden sind.  :) Ich fürchte nur, da meine Leitung die letzten Nächte ohne Reconnect/ASSIA gewesen ist, dass ich aktuell wenig reproduzieren kann. Ach so und soll ich zum Testen "Prevent release" deaktivieren?

Grüße