FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang

Begonnen von Volker Kettenbach, 17 September 2020, 11:32:08

Vorheriges Thema - Nächstes Thema

Volker Kettenbach

Hallo zusammen,

ich bin Entwickler und Maintainer vom 77_SMAEM, einem Stromzähler der seine Daten auf einer IP-Multicastgruppe zur Verfügung stellt.
Betreibt man 77_SMAEM unter Docker, so muss man den Container mit FHEM mit einer IP-Adresse aus dem Subnetz des Docker-Hosts betreiben, da der IP-Multicast bei einem in der Default-Konfiguration betriebenen Docker-Server sonst nicht an den Container weiter gegeben werden kann (obwohl dies seitens Docker vollkommen mißverstädnlich als "bridge" Betrieb bezeichnet wird.)
Da dieser Sachverhalt hin und wieder im Forum das SMAEM (https://forum.fhem.de/index.php/topic,51569.0.html) thematisiert wird, stelle ich an dieser Stelle mal für alle Docker-User vor, wie der Betrieb von Docker für Multicast eingerichtet werden kann.

Für die Nutzung einer IP aus dem Subnetz des Hosts in einem Container ist zunächst auf dem Docker-Host ein Netzwerk vom Typ "macvlan" an zu legen. Dabei müssen die Eckdaten des IP-Netzes angegeben werden:

Mit dem folgenden Code wird ein macvlan-Netz im IP-Subnet 1/24 angelegt, welches die Range 160/27 verwendet (d.h. IPs 160-190) und an eth0 angeschlossen ist:


docker network create -d macvlan -o parent=eth0 --subnet=192.168.1.0/24 --gateway=192.168.1.254 --ip-range=192.168.1.160/27 mymacvlannetwork


Beim Erzeugen des Containers muss nun dieses Netz als Netzwerk und eine IP aus der o.g. Range angegeben werden.
Mit docker-compose sieht das so aus:

version: '3.7'
services:
fhem:
   .......
    networks:
      default:
        ipv4_address: 192.168.1.163

networks:
  default:
    external:
      name: mymacvlannetwork


Danach läuft fhem mit der IP 192.168.1.163 im gleiche  Netz des Hosts (der kann z.B. 192.168.1.2 oder so als IP haben) und alle Ports von FHEM sind auf der IP verfügbar. Ferner empfängt dieser Container auch den Broadcast und Multicast aus dem lokalen Segment und kann folglich für SMAEM verwendet werden.

ch.eick

Hallo Volker,

ich habe auch einen SMA EM in Betrieb und habe es nur so zu laufen bekommen.

version: '3.3'

networks:
  net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.27.0.0/24

volumes:
  portainer_data:

services:

  fhem:
    image: fhem/fhem:latest
    restart: always
    network_mode: host
    privileged: true

snip.....


Wenn das so sein muss, dann hätte ich gerne die anderen Container in einem separaten docker-docker Netzwerk, aber da fehlen mir noch die Kenntnisse :-)

Ich werde das hier gerne mitverfolgen.

Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Volker Kettenbach

Hallo Christian,

Du hast die Variante Host-Network gewählt. Ich war mir damals nicht sicher, ob da Multicast wirklich geht, drum habe ich die Variante macvlan-gewählt. Die hat auch den Vorteil, dass Du Container die die gleichen Ports freigeben durch die Zuordnung zu separaten IPs problemlos gleichzeitig betreiben kannst.

Wenn Du auf dem Host noch mehr Container betrieben willst, kannst Du diese in Network-Mode "bridge" problemlos betreiben. Wenn diese sich direkt "sehen" sollen, dann einfach für alle das gleiche Netz angeben, ansonsten separate.

gruß
VK

ch.eick

Zitat von: Volker Kettenbach am 28 Oktober 2020, 10:25:17
Du hast die Variante Host-Network gewählt. Ich war mir damals nicht sicher, ob da Multicast wirklich geht, drum habe ich die Variante macvlan-gewählt. Die hat auch den Vorteil, dass Du Container die die gleichen Ports freigeben durch die Zuordnung zu separaten IPs problemlos gleichzeitig betreiben kannst.

Wenn Du auf dem Host noch mehr Container betrieben willst, kannst Du diese in Network-Mode "bridge" problemlos betreiben. Wenn diese sich direkt "sehen" sollen, dann einfach für alle das gleiche Netz angeben, ansonsten separate.
Hallo Volker,

ich wollte zuerst auch die elegantere Variante mit macvlan wählen, habe es aber nicht hinbekommen.
Hättest Du da mal eine .yml als Netzwerkbeispiel?

Ich betreibe folgende Services: FHEM, MySQL, nodered, zigbee2mqtt, grafana, portainer
All mit

networks:
  net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.27.0.0/24


Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Volker Kettenbach

Oben steht eigentlich alles was nötig ist.
1. Mit docker network create an der Shell das Netzwerk anlegen. Dabei die IP-Adresse entsprechende denen Deines Netzes anpassen. Der Teilbereich, der für die Container genutzt wird, sollte vom Router nach Möglichkeit nicht per DHCP vergeben werden, damit es zu keinen Kollisionen kommt
2. Die Dockercomposedatei muss das Netz enthalten
3. Der Service muss das Netz verwenden


krueuw

Hallo Volker,
so einfach wie du das schreibst ist es auch für mich nicht   :)

Deine Variante lässt sich so wie du angegeben hast für den (Raspi-)FHEM-Container so betreiben, dass das EM10 und auch das HM20 im Container zu sehen sind - wunderbar. Jedoch konnte ich bisher keine Compose-Syntax ausfindig machen, die das standardmäßige interne Containernetz fhem-network gleichzeitig möglich macht. Hast du da eine Idee, außer die, auch für die interne Verbindung das macvlan zu nutzen? Das würde vermutlich eine Menge Vorteile der Container-Lösung verhindern ..

Uwe

kjmEjfu

Zitat von: krueuw am 03 Januar 2022, 20:32:05
Das würde vermutlich eine Menge Vorteile der Container-Lösung verhindern ..

welche Vorteile wären das denn?
Migriere derzeit zu Home Assistant

krueuw

Grundsätzlich: Je weiter sich docker-compose.yml von der offiziellen Version entfernt, je wahrscheinlicher werden Nebenwirkungen in der Zukunft, vermutlich auch durch eigene Vergesslichkeit ;-) Dass das Docker-Bridge-Netzwerk keinen Multicast weiterleitet bzw. SMA EM10 und EM20 keinen Unicast unterstützt ist ärgerlich, aber nicht zu ändern. Das erfordert auf jeden Fall eine Sonderlocke.
Konkret:

  • manuelle Nacharbeit
  • statische IPs fördern mögliche Adresskonflikte
  • größere Angriffsfläche, weil alle Container direkt erreichbar
  • Namenauflösung der Container funktioniert?, sonst fhem.cfg Änderungen nötig

Deine Frage deutet aber wohl auch an, dass das funktionieren könnte. Probiere es heute mal aus.

ch.eick

Zitat von: krueuw am 04 Januar 2022, 10:10:55
Grundsätzlich: Je weiter sich docker-compose.yml von der offiziellen Version entfernt, je wahrscheinlicher werden Nebenwirkungen in der Zukunft, vermutlich auch durch eigene Vergesslichkeit ;-) Dass das Docker-Bridge-Netzwerk keinen Multicast weiterleitet bzw. SMA EM10 und EM20 keinen Unicast unterstützt ist ärgerlich, aber nicht zu ändern. Das erfordert auf jeden Fall eine Sonderlocke.
Konkret:

  • manuelle Nacharbeit
  • statische IPs fördern mögliche Adresskonflikte
  • größere Angriffsfläche, weil alle Container direkt erreichbar
  • Namenauflösung der Container funktioniert?, sonst fhem.cfg Änderungen nötig
Nach meiner Kenntnis wäre mit "network_mode: host" für den FHEM Service nur dieser vollständig im Host Netz.
Alle anderen Services bedienen sich dem normalen Docker Netzwerk.

Schön wäre natürlich nur für die SMA Geschichte ein eigenes Netzwerk im Docker FHEM Container zu haben und den Rest von FHEM auch im Docker Netzwerk zu verstecken.
Ich denke dadurch wäre FHEM weniger sichtbar und somit nur die freigegebenen Ports angreifbar.

Leider fehlen mir dafür die notwendigen Docker und Netzwerk Kenntnisse um das umzusetzen, was ich vor geraumer Zeit ja schonmal versucht hatte.

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

kjmEjfu

Zitat von: krueuw am 04 Januar 2022, 10:10:55
Grundsätzlich: Je weiter sich docker-compose.yml von der offiziellen Version entfernt, je wahrscheinlicher werden Nebenwirkungen in der Zukunft, vermutlich auch durch eigene Vergesslichkeit ;-)

Warum? Solange deine docker-compose.yml soweit zur "offiziellen" passt, ist doch alles gut.
Letztlich weicht die ja schon, wenn du nur ein USB-Gerät übergibst oder eine der vielen environment variables nutzt oder oder.
Ist aber für den Container doch egal.

Zitat von: krueuw am 04 Januar 2022, 10:10:55
manuelle Nacharbeit

die hat jeder, der irgendwas am Standardcontainer ergänzt. Und sei es nur, dass man irgendwelche Python-Pakete mit installieren lässt.

Zitat von: krueuw am 04 Januar 2022, 10:10:55
statische IPs fördern mögliche Adresskonflikte

jo, aber deshalb kann man den entsprechenden Adressraum auch festlegen und nimmt die auf dem DHCP-Server halt raus. Einmaliger Aufwand :-)

Zitat von: krueuw am 04 Januar 2022, 10:10:55
größere Angriffsfläche, weil alle Container direkt erreichbar

Also ich würde mich nicht darauf verlassen, dass die Nutzung eines Docker-Containers mir automatisch eine erhöhte Sicherheit bringt.
Aber wenn mögliche Angriffspunkte wichtig sind, dann sollte man sich über rootless Docker und Proxies (nginx, traefik, ...) Gedanken machen. Und vielleicht noch Proxmox darunter legen. Da wird der Aufwand aber gleich um einiges höher.

Zitat von: krueuw am 04 Januar 2022, 10:10:55
Namenauflösung der Container funktioniert?, sonst fhem.cfg Änderungen nötig

Funktioniert natürlich.
Im Zweifel übergibst du den DNS Server noch an den Container.
Migriere derzeit zu Home Assistant

Wernieman

Sorry Dein letzter Beitrag ist praktisch nicht lesbar (jedenfalls für mich). Kannst Du Gucken, ob Quota-Zeichen schlecht gesetzt sind?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

krueuw

Ok, habe das ausprobiert und es läuft im Prinzip fast :-) Homebridge kommt offenbar noch nicht klar, habe ich mal auskommentiert, weil ich sie bisher nicht gebraucht habe. Meine docker-compose.yml habe ich in https://wiki.fhem.de/wiki/S7_Beispielkonfiguration#Multicast-Empfang_mit_Docker eingefügt.