Wireguard: Peer-IP-Check

Wer Wireguard mit Peers benutzt, deren IP-Adresse sich ändert (z.B. weil sie an einem privaten DSL-Anschluss sind), muss regelmäßig die IP-Adresse überprüfen.

Wireguard selbst macht nur beim Starten der Schnittstelle eine DNS-Auflösung um die aktuelle IP-Adresse des Peers zu bekommen. Wenn sich aber z.B. die Adresse des Servers ändert, schlägt die Verbindung irgendwann fehl.

Zum Glück lässt sich dies mit einem kleinen Script, welches z.B. alle 10 Minuten ausgeführt wird, abfangen. Ein Ansatz ist das Script in der Ubuntu-Dokumentation zu Wireguard, welches aber auf meinem Debian-Client nicht ohne weiteres funktionierte (und mir auch etwas kompliziert vorkam).

#!/bin/bash
# Status von der Schnittstelle überprüfen
# wg0-client: Name der Schnittstelle, die geprüft werden soll
# meinpeer.dyndns.net: der Name des Peers, dessen IP geprüft werden soll
        
cip=$(wg show wg0-client endpoints | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") 	
echo "$cip"
digIP=$(dig +short meinpeer.dyndns.net) # Die Adresse des Peers muss angepasst werden
   echo "$digIP"
     if [ "$digIP" != "$cip" ]
       then
          echo "Daten sind anders"
          /usr/sbin/service wg-quick@wg0-client restart
            
        else 
	  echo "Daten sind gleich"
	  #nichts zu tun
	 fi

Die wesentlichen Elemente des Scripts oben: in Zeile 6 wird mittels der wireguard-tools und grep die aktuelle IP-Adresse, die die Schnittstelle verwendet ermittelt. In Zeile 8 wird geprüft, welche IP-Adresse der Peer aktuell hat. Weichen diese beiden Werte voneinander ab, wird die Wireguard-Schnittstelle in Zeile 13 neu gestartet – dann erfolgt auch die Auflösung der IP-Adresse erneut und die Verbindung steht wieder.

Der Restart der Wireguard-Schnittstelle in Zeile 13 muss ggf. angepasst werden, abhängig davon wie die Schnittstelle in eurem Setup tatsächlich heißt.

Es gibt natürlich noch andere Ansätze, die IP-Auflösung durchzuführen, aber für mein Setup ist dies ein sehr einfacher Weg. Ein Nachteil: sollten mehrere Peers vorhanden sein, klappt dieser Ansatz nicht so einfach – dann müsste man erst einmal den richtigen Peer per Regex ermitteln, um dann dort die entsprechenden Daten auszulesen.

Nötig ist dieses Script für das Aufrechterhalten der Verbindung in meinem FreeNAS-Replications-Setup, welches jetzt mit Wireguard funktioniert.

Ergänzung: IP-Check mit mehreren Peers

Wer in seiner Wireguard-Config mehrere Peers eintragen hat (z.B. eine statische Verbindung und einmal die Einwahl über ein Smartphone für ein VPN), will unter Umständen nur für einen Peer den hier beschriebenen IP-Check machen. Der einfachste Weg ist dabei, zusätzlich auf einen bestimmten Peer zu prüfen. Ausgehend von folgender Peer-Konfiguration (deren Werte keinem echten Peer entsprechen):

[Peer]
PublicKey = mhzqblUOAzxVhOypkidxLnxp5rfYD7uRtvyj0sOi4GE=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = meinpeer.dyndns.net:51820

Muss die erste Zeile im Check-Script entsprechend angepasst werden:

cip=$(wg show wg0-client endpoints | grep -E "mhzqblUO" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") 	

Komplett sieht es dann so aus:

#!/bin/bash
# Status von der Schnittstelle überprüfen
# wg0-client: Name der Schnittstelle, die geprüft werden soll
# meinpeer.dyndns.net: der Name des Peers, dessen IP geprüft werden soll
        
cip=$(wg show wg0-client endpoints | grep -E "mhzqblUO" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") 	
echo "$cip"
digIP=$(dig +short meinpeer.dyndns.net) # Die Adresse des Peers muss angepasst werden
   echo "$digIP"
     if [ "$digIP" != "$cip" ]
       then
          echo "Daten sind anders"
          /usr/sbin/service wg-quick@wg0-client restart
            
        else 
	  echo "Daten sind gleich"
	  #nichts zu tun
	 fi

Wichtig ist, dass das Check-Script in der Variante mit bestimmten Peers nicht funktionieren wird, wenn ihr den entsprechenden Wert nicht gegen den aus eurem Setup ersetzt. In meinem Setup lasse ich es alle 5min laufen, bisher hat es seinen Zweck soweit erfüllt. Da ein reiner abgleich der IP-Adresse stattfindet, sollte es auch in einem IPv6-Setup funktionieren – da ich jedoch noch einen klassischen Telekom-Anschluss mit IPv4 verwende, habe ich mich mit der Thematik nicht näher auseinander gesetzt. Falls jemand der Leser damit erfahrung hat (auch was DynDNS und IPv6 an der Fritzbox angeht) kann er gerne etwas in den Kommentaren hinterlassen!