OpenWrt: Workaround für Timing-Problem bei WAN6-Interface (IPv6-Adressbereich)
Am Wochenende habe ich auf meinem OpenWrt-Router (Fritz!Box 4040 mit Version 21.02.1) IPv6 aktiviert. Dabei ist mir eine Art »Timing-Problem« aufgefallen, was in meinem Netzwerk-Setup eintritt:
Vor dem OpenWrt-Router habe ich eine Fritz!Box, die die eigentliche Internetverbindung herstellt. Wenn beide Geräte gleichzeitig hochfahren bzw. Strom bekommen, hat das mit der IP6-Adressvergabe allerdings nicht funktioniert.
Das Problem: Das WAN6-Interface des OpenWrt-Routers ist schon hochgefahren, bevor die davor liegende Fritz!Box einen IPv6-Adressbereich vom Provider zugewiesen bekommen hat. Als Folge bekommt das WAN6-Interface kein IPv6-Netzbereich (IPv6-PD) von der Fritz!Box zugewiesen. Klappt das nicht direkt beim Hochfahren des WAN6-Interfaces, unternimmt OpenWrt offenbar keinen neuen Versuch, um ein IPv6-Netzbereich (IPv6-PD) bei der Fritz!Box anzufragen. Starten also beide Geräte gleichzeitig sieht das WAN6-Interface wie folgt aus:
Protocol: DHCPv6 client Uptime: 0h 0m 50s MAC: F0:B0:14:B6:A7:05 RX: 38.85 MB (31737 Pkts.) TX: 1.63 MB (12333 Pkts.) IPv6: fd00::f2b0:14ff:efe5:e501/64 IPv6: 2a02:8071:3ec3:9100:f4c0:14df:fef5:e701/64
Es fehlt also der IPv6-PD-Netzbereich. Klickt man im Interface auf Restart beim WAN6-Interface, wird das IPv6-Netz von der Fritz!Box an den nachgelagerten OpenWrt-Router korrekt weitergegeben:
Protocol: DHCPv6 client Uptime: 0h 2m 50s MAC: F0:B0:14:B6:A7:05 RX: 38.85 MB (31737 Pkts.) TX: 1.63 MB (12333 Pkts.) IPv6: fd00::f2b0:14ff:efe5:e501/64 IPv6: 2a02:8071:3ec3:9100:f4c0:14df:fef5:e701/64 IPv6-PD: 2a02:8071:3ec3:9100::/62
Erst wenn dieser IPv6-Netzbereich /62
bekannt ist, kann der OpenWrt-Router IPv6-Adressen an die weiteren Interfaces wie LAN oder WIFI delegieren bzw. diese dann an die dahinterliegenden Clients.
Dieses »Timing-Problem« habe ich dann wie folgt gelöst:
- Zunächst wird das WAN6-Interface bearbeitet und bei
Bring up on boot
das Häkchen entfernt - Anschließend wird über die Kommandozeile direkt auf dem Router die Datei
/etc/rc.local
bearbeitet
# Start wan-interfaces after 2 minutes sleep 120 /sbin/ifup wan /sbin/ifup wan6
Nachdem der OpenWrt-Router hochgefahren ist und alle System-Inits abgeschlossen sind, wartet der Router zwei Minuten (sleep 120), bevor das WAN6-Inteface (bzw. alle WAN-Interfaces) gestartet wird (ifup wan6). Das löst das Timing-Problem in meinem Setup. Das WAN6-Interface fragt also nicht direkt nach dem Start nach dem IPv6-Adressbereich, sondern erst nach zwei Minuten. So hat die davorgelagerte Fritz!Box genug Zeit, vom Provider einen IPv6-Adressbereich zugewiesen zu bekommen.
Eventuell lässt sich das auch eleganter lösen. Ich bin mir auch nicht wirklich sicher, ob hier eventuell ein Bug in OpenWrt vorliegt, da das WAN6-Interface keinen erneuten Versuch unternimmt, ein IPv6-Netzbereich anzufragen.
Was passiert aber nun in diesem Fall?:
- Die Fritz!Box startet neu (wegen Absturz oder manuell initiiert) oder führt aufgrund von Netzproblemen ein Reconnect zum Provider durch
- Der OpenWrt-Router bleibt derweil an
In diesem Fall wird der IPv6-Adressbreich am WAN6-Interface leider nicht aktualisiert. Aber mittels einem Hotplug-Skript lässt sich das ebenfalls fixen.
Unter
/etc/hotplug.d/iface/99-ipv6_fix_prefix_delegation
wird ein neues Skript mit dem Inhalt angelegt:
__INTERFACE__="wan6" if [ "$INTERFACE" = "$__INTERFACE__" -a "$IFUPDATE_ADDRESSES" = "1" ]; then /sbin/ifup wan6 sleep 3 /sbin/ifup lan /sbin/ifup wlan fi
Sobald sich die IP-Adresse des WAN6-Interfaces seit dem letzten ifupdate-Event ändert, werden die Befehle getriggert. Das WAN6-Interface wird neu gestartet und so der neue IPv6-Adressbereich bei der Fritz!Box abgefragt. Zur Sicherheit werden dann auch noch die beiden Interfaces (LAN/WLAN) neu gestartet, damit diese ebenfalls eine Aktualisierung durchführen bzw. diese an die Clients weitergeben. Hinweis: Damit das Hotplug-Skript funktioniert, muss Force link
beim WAN6-Interface deaktiviert sein, ansonsten werden keine Hotplug-Skripte getriggert.