FHEM Forum

FHEM - Hardware => Server - Linux => Thema gestartet von: Volker Kettenbach am 17 September 2020, 11:32:08

Titel: FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: Volker Kettenbach am 17 September 2020, 11:32:08
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.
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: ch.eick am 17 September 2020, 12:27:24
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
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: Volker Kettenbach am 28 Oktober 2020, 10:25:17
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
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: ch.eick am 28 Oktober 2020, 11:50:51
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
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: Volker Kettenbach am 30 Oktober 2020, 08:04:41
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

Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: krueuw am 03 Januar 2022, 20:32:05
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
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: kjmEjfu am 04 Januar 2022, 07:51:12
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?
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag 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:
Deine Frage deutet aber wohl auch an, dass das funktionieren könnte. Probiere es heute mal aus.
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: ch.eick am 04 Januar 2022, 14:06:48
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
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: kjmEjfu am 04 Januar 2022, 14:09:02
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.
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: Wernieman am 04 Januar 2022, 14:13:25
Sorry Dein letzter Beitrag ist praktisch nicht lesbar (jedenfalls für mich). Kannst Du Gucken, ob Quota-Zeichen schlecht gesetzt sind?
Titel: Antw:FHEM in Docker mit IP-Adresse aus dem Host-Subnetz - nötig für Multicastempfang
Beitrag von: krueuw am 04 Januar 2022, 17:43:26
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 (https://wiki.fhem.de/wiki/S7_Beispielkonfiguration#Multicast-Empfang_mit_Docker) eingefügt.