UDM Pro: Workaround für dynamische IPv6 Prefixe

Diese Anleitung bezieht sich auf eine alte Version (1.x) von Unifi OS. Die Schritte und Vorgehensweisen zur Einrichtung des IPv6-Workarounds unterscheidet sich bei UnifiOS 3.x.  Ein angepasstes Script mit einer Installationsanleitung habe ich als udm-ipv6 auf GitHub veröffentlicht.

Ich nutze die UDM-Pro hinter einer AVM FRITZ!Box, die über die Deutsche Glasfaser (DG) mit dem Internet verbunden ist. Die FRITZ!Box ist dabei so konfiguriert, dass sie die IPv6-Präfix von der DG an die UDM-Pro weiterleitet (siehe auch IPv6 hinter einer FRITZ!Box einrichten).

Das funktioniert bei der initialen Vergabe des IPv6-Präfix durch die DG problemlos. Leider vergibt die DG lediglich dynamische IPv6-Präfix, so dass sich das sich die zugeordneten IPv6-Adressen an der FRITZ!Box von Zeit zu Zeit ändert. Die geänderten Adressbereiche werden zwar an die UDM-Pro weitergeleitet und werden auch an die jeweiligen Interfaces der UDM-Pro gebunden aber nicht an die Systeme in den unterschiedlichen Netzwerksegmenten weitergeleitet. Daher funktioniert für die Clients in den Netzwerken hinter der UDM-Pro die IPv6-Zugang nur bis zum nächsten Präfix-Wechsel durch die DG.

Was mit einem OpenWRT-Router problemlos klappt, kriegt Ubiquiti mit der UDM-Pro also scheinbar nicht hin. Daher muss mal wieder ein Workaround her, damit dynamisches IPv6 mit der UDM-Pro zumindest halbwegs funktioniert.

Im folgenden gehe ich davon aus, dass auf der UDM-Pro das  On-Boot-Script wie im Beitrag UDM Pro 1.x: NAT auf dem WAN Interface deaktivierenbeschrieben installiert ist und die IPv6-Konfiguration wie im Artikel UDM Pro 1.x: IPv6 hinter einer FRITZ!Box einrichten beschrieben vorgenommen wurde und grundsätzlich funktionier.

01| Das Prinzip

Damit die neuen IPv6-Adressen korrekt an die Systeme vergeben werden, muss per Script regelmäßig geprüft werden, ob die IPv6-Verbindung noch besteht. Können die die definierten Referenzsysteme von der UDM-PRo per IPv6  nicht mehr erreicht werden muss das WAN Interface entsprechend einmal neu initialisiert werden. Dazu fahre ich das Interface einmal kurz herunter und direkt wieder hoch. Dadurch wird die neue  Adresse von der FRITZ!Box übernommen und an die Clients übertragen. Sicher keine elegante Lösung, vor allem weil das zu Verbindungsabbrüchen bei bestehenden IPv6 Verbindungen kommen kann. Sollte jemand also eine bessere Lösung kennen - immer her damit. 

02| Cron einrichten

Dank On-Boot-Script können auf der UDM-Pro mit einer Firmware-Version 1.x beim Systemstart beliebige Änderungen an der Konfiguration der UDM-Pro auf Betriebssystem-Ebene vorgenommen werden.

Da die IPv6-Verbindung nach einem Neustart der UDM-Pro in der Regel funktioniert, muss die IPv6-Konnektivität nicht direkt nach dem Booten geprüft werden. Daher habe ich mich dafür entschieden über ein entsprechendes  On-Boot-Script einen cronjob einzurichten, der alle 2 Minuten die Scripte im Verzeichnis /mnt/data/cron-user ausführt. Dazu wird im Verzeichnis /mnt/data/on_boot.d die Datei 99-setup-cron.sh angelegt und mit chmod +x /mnt/data/on_boot.d/99-setup-cron.shausführbar gemacht:

#!/bin/sh

######################################################################################
#
# Description:
# ------------
#	Script creates a cron job that will execute all files located in directory
#	/mnt/data/cron-user/ every 2 minutes. This is e.g. used to ensure that
#	firewall rules or IPv6 configuration is renrewed when necessary.
#
######################################################################################

######################################################################################
#
# Configuration
#

# ULA prefix to be used
crondir="/mnt/data/cron-user/"

#
# No further changes should be necessary beyond this line.
#
######################################################################################

# set scriptname
me=$(basename $0)


# Check if script runs directly after boot. If so, wait 10 seconds to ensure all is up and running.
uptimeMinutes=`cat /proc/uptime | awk '{print $1}'`
if [ ${uptimeMinutes::-3} -lt 300 ]
	then
		logger "$me: Script running after (re)boot."
		sleep 10
	else
		logger "$me: Script startet via Cron-Job." 
fi


if ! ls /mnt/data/cron-user/exec-dir.sh > /dev/null 2>&1; then
    cat <<EOF > /mnt/data/cron-user/exec-dir.sh
#!/bin/sh
logger "exec-dir.sh: Executing script."
cd \$1
for i in [0-9]*; do 
    ./\$i; 
done
EOF
    chmod +x /mnt/data/cron-user/exec-dir.sh
    logger "$me: exec-dir.sh created." 
fi

# Check if cron job exists
if ls /etc/cron.d/cron-user > /dev/null 2>&1;         then
    logger "$me: Cron-Job found. Nothing to do."
else
    echo "*/2 * * * * /mnt/data/cron-user/exec-dir.sh $crondir" > /etc/cron.d/cron-user
    logger "$me: Cron job created." 
    /etc/init.d/crond restart
fi

Anschließend muss das Verzeichnis /mnt/data/cron-user angelegt und die exec-dir.sh erzeugt und ausführbar gemacht werden (chmod +x /mnt/data/cron-user/exec-dir.sh):

# cat exec-dir.sh 
#!/bin/sh
logger "exec-dir.sh: Executing script."
cd $1
for i in [0-9]*; do 
    ./$i; 
done

Damit wird jetzt bei jedem Neustart der UDM-Pro sichergestellt, dass ein Cron-Job eingerichtet ist, der alle 2 Minuten  die Scripte im Verzeichnis /mnt/data/cron-user auführt, die mit einer Zahl beginnen.

03| WAN-Interface bei Bedarf neu starten

Im Verzeichnis/mnt/data/cron-user wird nun das Script 09-dyn-ipv6-fix.sh  angelegt und anschließend mit chmod +x 09-dyn-ipv6-fix.sh ausführbar gemacht:

#!/bin/sh

# set scriptname
me=$(basename $0)

wan_if="eth8 eth9"

# If IPv6 connection is available nothing to do 
if ( ping -6 -c 1 facebook.de || ping -6 -c 1 google.de || 
     ping -6 -c 1 microsoft.com || ping -6 -c 1 apple.com ); then 
    logger "$me: IPv6 working as expected. Nothing to do."
else    
    logger "$me: IPv6 connection lost."
    for w in $wan_if; do
        if ip -6 addr show dev $w | grep inet6; then
            logger "$me: Resetting interface $w."
            ifconfig $w down; ifconfig $w up
        fi
    done
fi

Die Test-Hosts in der If-Anweisung können dabei natürlich beliebig abgeändert werden. 

Wenn alles eingerichtet ist, muss nur noch sichergestellt werden, dass der Cron-Job korrekt eingerichtet ist. Dazu kann am besten das Script /mnt/data/on_boot.d/99-setup-cron.sh manuell aufgerufen werden.

Wenn alles funktioniert hat sollte jetzt folgender Eintrag in der Datei  /etc/cron.d/cron-user folgender Eintrag zu finden sein:

*/2 * * * * /mnt/data/cron-user/exec-dir.sh /mnt/data/cron-user/

Wenn jetzt noch das Kommando /mnt/data/cron-user/exec-dir.sh /mnt/data/cron-user/ fehlerfrei ausgeführt wird, sollte alles korrekt eingerichtet werden und die IPv6 Verbindung spätestens 2 Minuten nach der Vergabe einer neuen IPv6-Adresse wieder hergestellt werden.

Mit UnifiOS 1.10.0 und mit Unifi Network in der Version 6.2.26 funktioniert IPv6-Prefix-Delegation aufgrund der vordefinierten Firewall-Regeln aktuell nur für Corporate-Netzwerke. Für Guest-Netzwerke  wird dem Interface der UDM Pro zwar eine IPv6-Adresse zugeordnet, es werden aber keine Adressen an die Clients weitergeleitet.

 

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page