Bandbreitenmanagement im Smarthome

Aus FHEMWiki
Version vom 18. März 2020, 19:22 Uhr von Pahenning (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.