WAN Failover für Ubiguiti Unifi mit Raspberry Pi

Aus Laub-Home Wiki

+ +

Ziel dieses HowTos ist es ein WAN Failover mit dem Raspberry Pi zu bauen, welcher dann an das Ubiguity Unifi Security Gateway (USG) angeschlossen wird. Bei einem Ausfall der Haupt Internet Leitung springt das Security Gateway dann auf den Raspberry Pi um und Routet den Internetverkehr über diesen. Der Pi Selbst wird in meinem Fall durch ein iPhone im Hotspot Modus mit 4G online gehen. Man könnte hier aber auch einen anderen 4G Hotspot oder vielleicht sogar das WLAN des Nachbarn oder ein anderes verfügbares öffentliches WLAN nutzen.

Das Ziel ist es ausfallsicher online zu sein und das der Failover automatisch passiert.

Der Aufbau soll in jedem Fall wie folgt aussehen:

iPhone 4G Hotspot --> RaspberryPI WLAN Interface --> Raspberry Pi Routing, Firewall und Nat --> Raspberry Pi LAN Interface --> USG VOIP/WAN2 Interface --> USG Failover <-- WAN1 <--Haupt Internet Leitung


Vorbereitung

Als erstes nehmen wir den Raspberry Pi und installieren Raspbian Light (hier Debian Buster). Dies geschieht mittels balenaEtcher, welches für alle Operating Systeme verfügbar ist und das vorher heruntergeladenen Raspbian Image auf eine MicroSD Karte bringt. Im Anschluss daran, müssen wir den SSH Zugang verfügbar machen. Dies geschieht in dem man auf der /boot Partition der Micro SD Karte einfach eine Datei Namens ssh anlegt. Nun einfach den Pi mit der SD Karte bestücken und starten. Jetzt können wir uns via SSH auf den Pi verbinden (unter Windows mittels Putty, Mac und Linux mit dem ssh command.)

ssh pi@raspberrypi

Der Standard Benutzer ist pi, das Passwort raspberry. Der Raspberry Pi hat standardmäßig den Namen raspberrypi, wenn euer Router, bzw. DHCP Server eine DNS Auflösung anbietet, solltet ihr mittels diesem Namen den Pi erreichen, ansonsten am besten im Router Menü nachschauen, welche IP er bekommen hat. Im Worst Case könnt ihr auch einfach einen Monitor und Tastatur an den Pi anschließen und mit dem folgenden Befehl die IP Adresse des Pi herausbekommen:

ip addr show eth0

Ausführlichere Informationen zur Installation von Raspbian auf dem Pi findet ihr hier:


Nachdem wir nun auf dem Pi via SSH sind, schalten wir als erstes den Root User frei und ändern das Standard Passwort von pi:

Als erstes sollten wir das pi Passwort ändern:

passwd

dann noch das Root Passwort festlegen:

sudo passwd

Zuguter Letzt müssen wir dem Root User noch erlauben via SSH auf das System zugreifen zu dürfen: Dafür der Datei /etc/ssh/sshd_config, welche wir am besten so aufrufen:

sudo nano /etc/ssh/sshd_config

hier die folgende Zeile einfügen:

PermitRootLogin yes

dann den Dienst Neustarten:

sudo systemctl restart ssh

nun am besten mit einer neuen SSH Verbindung den Root Account Zugang testen:

ssh root@raspberrypi

Nun installieren wir noch alle Updates:

apt update && apt dist-upgrade -y
rpi-update

Konfiguration Raspberry Pi als Router

Als erstes Konfigurieren wir ein paar Dinge am Raspberry Pi. Dafür starten wir das Konfigurationstool des Raspberry:

raspi-config

Die Frage ob wir das mit dem pi User starten wollen, bestätigen wir einfach mit OK. Dann Konfigurieren wir hier folgende Dinge:

Network Options --> Hostname (hier bitte euren FQDN eintragen, habe bei mir: wan2-pi.dmz.laub.loc genommen)

Localisation Options --> Change Timezone (hier eure Timezone auswählen Bei mir Europe/Berlin)

Localisation Options --> Change Wi-fi Country (euer Land auswählen)

Nun konfigurieren wir noch die IP Adresse in der /etc/hosts, damit der eigene Server auch richtig aufgelöst wird:

/etc/hosts

#127.0.1.1      wan2-pi.dmz.laub.loc
192.168.101.1   wan2-pi.dmz.laub.loc wan2-pi

nun können wir richtig loslegen.

Avahi deinstallieren

Raspbian bringt Standardmäßig den Avahi Daemon mit, damit man sich auch ohne DHCP Server im Netz mit dem Raspberry Pi via Netzwerk verbinden kann. Diesen werden wir hier nun deinstallieren.

Deinstallation vom avahi Daemon:

apt -y --auto-remove purge avahi-daemon

DNSMASQ - DHCP und DNS Server

Zunächst installieren wir uns das dnsmasq Paket, welches dafür sorgt, das ein kleiner DHCP und DNS Server auf dem Pi installiert ist um dem WAN Interface automatisch eine IP zuzuweisen, oder gar einem ganzen Netzwerk, falls man das Konstrukt direkt ohne Unifi verwenden möchte. Der Raspberry würde dann als kleiner Router im Heimnetz funktionieren.

apt install dnsmasq

nun konfigurieren wir diesen:

mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

und editieren diese dann:

/etc/dnsmasq.conf

domain-needed
bogus-priv
interface=eth0
bind-interfaces
expand-hosts
domain=dmz.domain.loc
dhcp-range=192.168.101.100,192.168.101.250,12h

# diese Zeilen waren schon da und sollten nicht angepasst werden.
dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:*
dhcp-reply-delay=tag:client_is_a_pi,2

Die Domain sollte hier die selbe sein, wie im FQDN vorhin festgelegt. Bei mir dmz.laub.loc

Netzwerkinterface ETH0 und WLAN0 konfigurieren

nun konfigurieren wir die beiden Interface eth0 und wlan0:

/etc/network/interfaces.d/eth0

auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 192.168.101.1
    netmask 255.255.255.0
    network 192.168.101.0
    broadcast 192.168.101.255

/etc/network/interfaces.d/wlan0

auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

nun legen wir die WLAN Konfigurationsdatei an, dafür benötigen wir die SSID und das PSK Passwort. Um das Passwort nicht im Klartext in der Konfigurationsdatei zu haben, benutzen wir das kleine Programm wpa_passphrase, welches uns auch gleich die richtige Konfiguration liefert:

wpa_passphrase "MySSID" "MyWiFiPassword"

Ausgabe wie folgt:

network={
	ssid="MySSID"
	#psk="MyWiFiPassword"
	psk=f1a2554f1f250efe79f1c7dd1bc0e1384962b4612cd65438759463df1f727f9b
}

Nun konfigurieren wir das Ganze in der wpa_supplicant.conf und kopieren die Ausgabe von Oben einfach unten ran:

/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="MySSID"
	psk=f1a2554f1f250efe79f1c7dd1bc0e1384962b4612cd65438759463df1f727f9b
}

Die Zeile mit dem Klartext Passwort lassen wir dabei am besten weg.

Internet Freigabe konfigurieren

Zuerst gestatten wir, das die IP Pakete von WLAN0 auch nach ETH0 und zurück wandern dürfen. Dazu legen wir die folgende Datei an:

/etc/sysctl.d/10-ipforward.conf

net.ipv4.ip_forward=1

Nun brauchen wir noch ein paar Firewall Regeln, die uns erlauben, die Internet Verbindung von WLAN0 zu nutzen. Dazu erstellen wir einfach ein kleines Script:

/etc/ipv4firewall.sh

#!/bin/bash
OUTINTERFACE=wlan0

iptables -t nat -A POSTROUTING -o $OUTINTERFACE -j MASQUERADE
iptables -A FORWARD -i $OUTINTERFACE -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o $OUTINTERFACE -j ACCEPT

diesem geben wir die execute Rechte:

chmod +x /etc/ip4firewall.sh

Damit diese beim start des Raspberry gestartet wird, hängen wir sie einfach an die rc.local /etc/rc.local

...

/etc/ip4firewall.sh

# letzte Zeile der Datei
exit 0

vor exit 0 einfügen!

So, nun ist alles bereit zur Aktivierung, also fahren wir den Raspberry nun herunter und verkabeln alles richtig. Solltet ihr euer iPhone als Hotspot verwenden wollen, dann müsst ihr nun den Hotspot aktivieren

iPhone Hotspot aktivieren

Am iPhone geht ihr einfach unter "Einstellungen" App und dort taucht dann der Punkt "Persönlicher Hotspot" auf, diesen anwählen und den Switch auf "on" stellen. Vergebt dann noch ein gutes Passwort. Das war es auch schon. Hier noch ein paar Screens:

Aufbau und Verkabelung

nach dem wir nun den Raspberry konfiguriert haben, der WLAN Hostspot offen ist und läuft. Verbinden wir den Raspberry Pi mit dem VOIP/WAN2 Interface des Unifi Security Gateways. Dann starten wir den Pi und Prüfen nach ein paar Minuten ob das iPhone ein verbundenes Gerät anzeigt, der Blaue Balken oben am Display zeigt dies an:


Das nächste was wir überprüfen ist, ob beim Raspberry Pi und bei der USG die connect LED am LAN Port an ist. Ist dies auch der Fall konfigurieren wir nun Unifi um den Raspberry als Failover Internetzugang zu nutzen.

Konfiguration Unifi Security Gateway Failover WAN

Das Unifi Security Gateway wird über den Unifi Controller konfiguriert. Also nutz euren Webbrowser und verbindet euch zum Unifi Controller. Dann gehen wir zu den Einstellungen. Als erstes stellen wir bei der Site sicher, dass der Haken bei Enable connectivity monitor and wireless uplink

Haken setzen bei: Enable connectivity monitor and wireless uplink

Nun konfigurieren wir bei Network ein zweites Wan Interface. Klick auf Create New Network

Klick auf: Create New Network

Dieses konfigurieren wir wie folgt:

Failover WAN wie im Screenshot konfigurieren

Hier könnte man auch an stelle von Failover Mode einen Loadbalancing Modus fahren, da ich hier aber nur einen Failover möchte, bleibe ich bei dieser Einstellung.

Nun öffnen wir die Konfiguration der USG und aktivieren das eth2, bzw, das VOIP/WAN2 Interface.

WAN2 Konfiguration der USG

Das Ergebnis sieht dann so aus:

USG Interface Übersicht

Nun prüfen wir noch unter Details --> WAN2 ob wir auch eine IP vom Raspberry Pi bekommen haben:

WAN2 Netzwerkkonfiguration

Nun ist alles konfiguriert und bereit für einen ersten Test.

WAN Failover Test

Zum Überprüfen, ob das Konstrukt funktioniert bin ich wie folgt vorgegangen. Als erstes habe ich die bestehende Internet Verbindung geprüft. Also den IST Zustand getestet:

Nun habe ich mich auf den RaspberryPi via SSH und dessen fester IP Adresse (192.168.101.1) verbunden

ssh root@192.168.101.1

und habe das kleine Tool nload nachinstalliert um bei meinem Test zu prüfen ob Traffic über das wlan0 Interface geht:

apt install nload -y
nload wlan0

Ausgabe sieht dann in etwa so aus, sollte selbsterklärend sein. Wichtig für später ist was hinter Curr: passiert.

Device wlan0 [172.20.10.3] (1/1):
================================================================
Incoming:
                                            Curr: 0.00 Bit/s
                                            Avg: 56.00 Bit/s
                                            Min: 0.00 Bit/s
                                            Max: 664.00 Bit/s
                                            Ttl: 20.86 MByte
Outgoing:
                                            Curr: 960.00 Bit/s
                                            Avg: 1008.00 Bit/s
                                            Min: 0.00 Bit/s
                                            Max: 1.88 kBit/s
                                            Ttl: 4.86 MByte

Um zu prüfen wie viele Paketverluste der Failover bringt, habe ich parallel in einem Terminal einen dauerping auf die 1.1.1.1 laufen lassen

ping 1.1.1.1

Nun ist alles bereit für den eigentlichen Test, also ziehen wir nun das Netzwerkkabel der USG aus WAN1 und schauen was passiert.

Als erstes sollte man einen Ping Verlust von ca. 3-5 Pings sehen. Beim Reload von https://www.wieistmeineip.de sollte eine neue IP Angezeigt werden und der Speedtest sollte ein anderes Ergebnis liefern als noch zuvor. Während man surft sollte man beim nload wlan0 Ausschläge sehen und hinter Curr: eine erhöhte Zahl.

Ist der Test erfolgreich, kann man wieder das LAN Kabel in WAN1 stecken. Unter Betracht des Ping Befehls und Nload sollte man nun nochmals sehen, das sich etwas tut. Sieht man die Paket Verluste und das bei Nload kein Traffic mehr ist, kann man das Ganze wieder mit https://www.wieistmeineip.de verifizieren und sollte wieder die Ursprungs IP Adresse sehen.

Im Unifi Controller werden nun unter ALERTS die Wechsel der Internetverbindung angezeigt:

Failover Alerts

Die Unifi Handy App schickt einem sogar Push Notifications, beim Failover.

Weitere Bandbreiten Meßtools findet ihr hier:

DHCP Client Hack USG

Bei mir kam es bei einem Reboot des Raspberry Pi dazu, dass sich die USG keine IP Adresse danach mehr gezogen hat. Ich habe hier lange romprobiert und herausgefunden, das es eine Lösung ist, den dnsmasq Service verzögert zu starten. Dazu habe ich als erstes den Autostart deaktiviert:

systemctl disable dnsmasq.service

Den Start habe ich dann verzögert in die rc.local eingetragen: /etc/rc.local

...

sleep 60 && systemctl start dnsmasq.service

# letzte Zeile der Datei
exit 0 

Auch hier bitte wieder vor exit 0 eintragen!

iPhone USB Tethering anstelle WLAN Hotspot

Man kann das iPhone auch direkt via USB an den Raspberry Pi anschließen. Dies hat den Vorteil, das man so, dass iPhone auch direkt am Pi mit Strom versorgt und das der Stromverbrauch geringer ist, da nicht ständig eine WLAN Verbindung aufrechterhalten werden muss.

Um dies nutzen zu können muss als erstes ein Paket nachinstalliert werden:

apt install libimobiledevice6 -y

Ist dieses installiert, deaktivieren wir die Konfiguration unseres wlan0 Adapters. Ich habe hier einfach alle Zeilen auskommentiert, man kann die Datei auch einfach löschen. Vorher fahren wir das Interface aber Manuel runter:

ifdown wlan0

nun die Konfiguration anpassen. /etc/network/interfaces.d/wlan0

#auto wlan0
#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Jetzt stellen wir noch das OUTINTERFACE in unserer Firewall Datei auf eth1 um, dies wird das iPhone USB Tethering Interface sein. /etc/ip4firewall.sh

#!/bin/bash
OUTINTERFACE=eth1
#OUTINTERFACE=wlan0

iptables -t nat -A POSTROUTING -o $OUTINTERFACE -j MASQUERADE
iptables -A FORWARD -i $OUTINTERFACE -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o $OUTINTERFACE -j ACCEPT

Nun können wir das iPhone mit einem Original Apple USB Kabel an den USB Port des Raspberry Pi anschließen. Der Hotspot Modus muss dennoch aktiviert sein! Auf dem iPhone muss man nun das Vertrauen zum Raspberry Pi herstellen. Hier sollten einige Meldungen dazu kommen. Hat alles funktioniert, sollte ein Blick in die Netzwerk Konfiguration in etwa so aussehen:

ip a

hier sollte nun ein neues Interface eth1 mit einer IP Adresse zu sehen sein.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:8c:7c:fe brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.1/24 brd 192.168.101.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe8c:7cfe/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b8:27:eb:d9:29:ab brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 4a:43:7c:d6:ea:4a brd ff:ff:ff:ff:ff:ff
    inet 172.20.10.4/28 brd 172.20.10.15 scope global dynamic noprefixroute eth1
       valid_lft 84849sec preferred_lft 74157sec
    inet6 fe80::e82b:a58d:4b94:8158/64 scope link 
       valid_lft forever preferred_lft forever

Um nun alles zu aktivieren, startet den PI einfach einmal durch.

reboot

Dann am besten nochmal den Failover Test ausführen.

Quellen