Bandbreitenmanagement im Smarthome
Zielgruppe
Smarthome-Administratoren mit mehr Bandbreiten-Bedürfnissen als der Internet-Zugang hergibt. Z.B. Familien auf dem Land mit dünnen DSL-Leitungen, Familien mit Streaming-Abos und dünnen DSL-Leitungen, Betreiber von Servern zu Hause (Minecraft, Cloudlösungen) oder Nutzern von Online/Cloud-Backuplösungen.
Lösungsübersicht
In Abhängigkeit von bestimmten Bedingungen wird die Bandbreite eines lokalen Servers beschränkt.
Ausgangssituation
Vorhanden ist das heimische LAN mit FHEM als Smarthome-Lösung auf Linux-Basis. In diese LAN sind mehrere Streaming-Clienten (Netflix, Amazon Video) vorhanden.
Eine Fritzbox fungiert als Router im Client-IP-Modus. Diese ist einem Speedport Hybrid (DSL + LTE) angeschlossen, der die Bandbreite auf dem Land erst über DSL und bei Bedarf zusätzlich über LTE bereitstellt.
Zwischen der Fritzbox und dem Speedport entsteht eine sehr einfache DMZ. In dieser DMZ laufen diverse Server für die Familie: Nextcloud als Speicher, DNS-Resolver, git-Server und ein Minecraft-Server. Der Nextcloud-Server nutzt rclone, um ein Backup seiner Daten auf Backblaze B2 vorzuhalten. Dabei verschlüsselt rclone "on-the-fly" Datei- und Verzeichnisnamen sowie den Inhalt von Dateien. Der Nextcloud-Server hält gut 3 TB Daten vor - ein Restore im Fehlerfall dauert 2-3 Monate, ein tägliches "Delta-Backup" der geänderten Daten durchaus mehrere Stunden.
-------------\ \ 192.168.255.0/24 ------ DSL 3/1 MBit Netflix \ (Pseudo-DMZ) / Amazon Video ------- LAN --------- FritzBox 7490 ---+----------- Speedport Hybrid ------+ Internet-Anbindung PCs/Surfen / | \ / 192.168.1.0/24 \--- Server ------ LTE 30/20 MBit -------------/ (Minecraft, Nextcloud, DNS, git)
Die DSL+LTE Internetanbindung des Speedport Hybrids ist daher dauerhaft und langfristig überlastet.
In diesem Anwendungsfall ist das LAN auf 192.168.1.0/255.255.255.0 und die "Pseudo-DMZ" auf 192.168.255.0/255.255.255.0 konfiguriert. Für den Speedport Hybrid sind eingehende Portweiterleitungen für die verschiedene Dienste konfiguriert.
Der Server hat die IP 192.168.255.42, der FHEM-Server die 192.168.1.9.
Konfiguration
Auf dem Server 192.168.255.42
Installation von Wondershaper
Das Bandbreiten-Management erfolgt mit dem Tool Wondershaper, daß für Debian/Devuan-Distributionen mit
sudo apt-get install wondershaper
installiert werden kann.
Wondershaper soll von einem normalen User mittels sudo ohne Passwort aufgerufen werden. Mit
visudo
kann die /etc/sudoers konfiguriert werden. Der User hat in diesem Anwendungsfall die Kennung os und für diesen User wird jetzt sudo-Konfiguration erweitert:
# User privilege specification root ALL=(ALL:ALL) ALL os ALL= NOPASSWD: /sbin/wondershaper *
Zusätzlich sollte der User os in die sudo-Gruppe aufgenommen werden. Nach Aus- und Einloggen sollte der User os nun
sudo /sbin/wondershaper eth0 1000 500
ohne Passwortabfrage aufrufen können.
Vorsicht: /sbin/wondershaper ohne Argumente funktioniert immer - d.h. auch ohne sudo oder ohne erfolgreiches sudo.
Bei Wondershaper ist das erste Argument das Netzwerkdevice (hier eth0), das zweite die maximale Downloadgeschwindigkeit in Kilobit/s (hier 1000 = 1MBit/s) und das dritte die maximale Uploadgeschwindigkeit (hier 500 = 0.5 MBit/s).
Vorsicht: bei Devuan ASCII mußte noch /etc/pam.d/sudo geändert werden:
#%PAM-1.0 # Fixing ssh "auth could not identify password for [username]" auth sufficient pam_permit.so @include common-auth @include common-account @include common-session-noninteractive
SSH ohne Passwort
Damit sich der FHEM-Rechner 192.168.1.9 auf dem Server 192.168.255.42 ohne Passwort einloggen kann, um Wondershaper aufzurufen, wird ssh ohne Passwort konfiguriert.
Dazu wird auf dem FHEM-Server als User fhem (dies ist der User, unter dem FHEM als Dienst läuft) ein ssh-Keypaar erzeugt:
ssh-keygen -t ecds
und dieses mittels
ssh-copy-id os@192.168.255.42
auf dem Server in der Pseudo-DMZ kopiert. Dazu ist ein letztes Mal die Eingabe des Passwortes des Users os notwendig.
Auf dem Server 192.168.1.9 als User fhem sollte nun ein
ssh os@192.168.255.42
ohne Passwort funktionieren.
Auf dem FHEM-Server 192.168.1.9
Der User fhem kann nun mittels ssh ohne Passwort auf den Server 192.168.255.42 in der Pseudo-DMZ auf den User os zugreifen und dieser ohne Passwort des Tool Wondershaper nutzen.
Es fehlt ein DOIF oder ein notify, daß nun in Abhängigkeit von verschiedenen Parametern die Bandbreite begrenzt oder wieder freigibt.
In diesem Anwendungsfall gibt es dafür zwei PRESENCE-Objekte (einmal der Fernseher und einmal die Nintendo Switch):
defmod PresTVWintergarten PRESENCE lan-ping 192.168.1.129 attr PresTVWintergarten event-on-change-reading presence attr PresTVWintergarten pingCount 8 attr PresTVWintergarten room R_Wintergarten,SYS_Events
defmod PresNintendoSwitch PRESENCE lan-ping 192.168.1.30 attr PresNintendoSwitch event-on-change-reading presence attr PresNintendoSwitch room R_Wintergarten,SYS_Events
Da für beide Geräte die IP-Adresse verwendet wird, muß der DHCP-Server der Fritz!Box 7490 immer dieselbe IP zuweisen. Dies läßt sich im Konfigurationsmenü für die beiden Geräte konfigurieren.
Ein DOIF steuert nun die Bandbreite des Servers - ist ein Gerät vorhanden, werden 50% der Bandbreite reserviert, sind beide aktiv, wird massiv gedrosselt:
defmod DI_BandwidthManagement DOIF ([$SELF:AllOn])\ ("ssh os@192.168.255.42 sudo /sbin/wondershaper eth0 250 200")\ DOELSEIF ([$SELF:OneOn])\ ("ssh os@192.168.255.42 sudo /sbin/wondershaper eth0 750 500")\ DOELSE\ ("ssh os@192.168.255.42 sudo /sbin/wondershaper eth0 10000 8000") attr DI_BandwidthManagement DOIF_Readings AllOn:([PresTVWintergarten:presence] eq "present" and [PresNintendoSwitch:presence] eq "present"), \ OneOn:([PresTVWintergarten:presence] eq "present" xor [PresNintendoSwitch:presence] eq "present") attr DI_BandwidthManagement room R_Wintergarten,SYS_Events
Dieser Lösung liesse sich noch optimieren, wenn der Server mehrere virtuelle Netzwerkkarten erhält und die Server auf virtuelle Netzwerkkarten konfiguriert werden. In diesem Fall könnte Wondershaper jeden Dienst einzeln begrenzen.
Das DOIF läßt sich leicht für das Zusammenspiel mit einer FRITZ!Box und dem FB_CALLMONITOR erweitern. Bei VOIP-Telephonieanschlüssen kommt es häufig zu einer schlechten Verbindungsqualität, wenn die Leitung massiv ausgelastet ist.
Sei
defmod FB_TelephonyMonitor FB_CALLMONITOR 192.168.1.1 attr FB_TelephonyMonitor room SYS_Network
der Fritz!Box-Callmonitor, kann die Bedingung 1 im DOIF auf
defmod DI_BandwidthManagement DOIF ([$SELF:AllOn] or [FB_TelephonyMonitor:event] ne "disconnect")\ ("ssh os@192.168.255.42 sudo /sbin/wondershaper eth0 250 200")\
geändert werden. Damit wird die Verbindung stark eingeschränkt, wenn ein eingehender oder ausgehender Ruf oder eine Telephonieverbindung besteht.