WAN Failover für Ubiguiti Unifi mit Raspberry Pi
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
Nun konfigurieren wir bei Network
ein zweites Wan Interface. Klick auf Create New Network
Dieses konfigurieren wir wie folgt:
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.
Das Ergebnis sieht dann so aus:
Nun prüfen wir noch unter Details --> WAN2 ob wir auch eine IP vom Raspberry Pi bekommen haben:
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:
- Speedtest unter https://www.speedtest.net (hier wird auch die öffentliche IP Adresse angezeigt)
- https://www.wieistmeineip.de spuckt ebenfalls die aktuelle öffentliche IP aus
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:
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
- https://blog.sachathomet.ch/de/2017/04/17/how-to-get-back-online-in-minutes-with-ubiquiti-unifi-gear-and-some-gadgets/
- https://community.ui.com/questions/USG-3P-WAN2-configuration-missing-on-Controller-software-5-8-23/a594ea0c-2470-43eb-b5d9-eca6070ecfd3
- https://www.diyhobi.com/share-iphones-internet-home-network-lan-using-raspberry-pi/