FreeNAS: ZFS-Replication über Wireguard

Bisher habe ich für den Abgleich meiner zwei FreeNAS-Boxen OpenVPN verwendet. Wireguard ist eine schnelle Alternative, dafür aber etwas komplizierter vom Setup.

Die ZFS-Replication ist ein praktisches Hilfsmittel, um Daten zwischen zwei FreeNAS-Installation synchron zu halten. Sinn des Ganzen ist die Schaffung eines Offsite-Backups, bei dem die Daten auch einen Wohnungsbrand oder Einbruch überstehen würde, ohne auf externe Cloud-Services zurückzugreifen (was zum einen aus Datenschutz-Aspekten schwierig ist und zum anderen auch ein Kostenfaktor wird, sobald es sich um mehrere Terabyte an Daten handelt).

Anders als OpenVPN ist Wireguard noch nicht Bestandteil von FreeNAS. Man muss es also anderweitig installieren. Um das FreeBSD möglichst unangetastet zu lassen, habe ich mich für eine Debian VM entschieden. Der Grundlegende Datenfluss sieht dann folgendermaßen aus.

  1. Ein ZFS-Snapshot wird erstellt
  2. Die Daten werden über eine statische Route an die Wireguard-Verbindung geleitet
  3. Das 2. FreeNAS-System im Zielnetzwerk verarbeitet die Daten

Dank der statischen Route sieht es für das sendende FreeNAS aus, als würde sich das empfangende im selben Netzwerk befinden. Wireguard liefert anders als OpenVPN eine deutlich bessere Auslastung der Schnittstelle (in meinem Fall VDSL mit 250/40 Mbit/s für FreeNAS-Box 1 und VDSL 50/10 Mbit/s für FreeNAS-Box 2. In Senderichtung liegt das Limit also bei 40 Mbit/s – für den Fall, dass ich das Backup benötige und wieder einspielen muss wäre vermutlich ein Datenträger-Versand schneller. Insgesamt sieht der Aufbau aus wie in dieser Darstellung:

Wireguard als Verbindung zwischen zwei Netzwerken

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.