httpapi - funktioniert nur aus dem internen Netz, nicht per Portforwarding

Begonnen von Eckat, 10 Dezember 2024, 14:49:43

Vorheriges Thema - Nächstes Thema

Eckat

Moin zusammen,

ich habe ein httpapi device erstellt.

Damit möchte ich in einem Dummy-device einen Status setzen, ob mein Handy mit dem Auto-Bluetooth verbunden ist.
Der Aufruf klappt über die interne URL: http://192.168.2.10:8087/api/set?device=verbunden&action=1 zuverlässig.

Ich habe in der FritzBox einen DynDNS Dienst eingerichtet und ein Portforwarding auf den Raspberry Pi 4, auf dem fhem läuft, eingestellt 8087 -> 8087.
Der Aufruf über http://dyndnsadresse:8087/api/set?device=verbunden&action=1 funktioniert nicht.

Die Firewall auf dem RPi 4 habe ich mit folgendem Befehl geöffnet und danach reloaded:
firewall-cmd --permanent --zone=public --add-port=8087/tcp
Die Rückmeldung wenn ich das per curl aufrufe (von einem externen Server oder intern ist egal):
Recv failure: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt
Schaue ich mit mit "tcptrack -d -r20 -i eth0" die Verbindungen an, sieht das für die abgelehnte Verbindung wie folgt aus:
88.111.222.77:61725   192.168.2.101:8087    RESET        17s    0 B/s
Mein aktueller Verständnisstand ist:
  • Anfrage intern funktioniert: httpapi und URL an sich OK
  • Portweiterleitung auf der FritBox funktioniert auch, da sonst keine Verbindung auf dem RPi ankommen würde
  • Firewall müsste richtig sein, denn ohne die Freigabe von 8087 funktioniert es auch intern nicht

Hoffe mir kann jemand helfen. Wahrscheinlich sehe ich nur den Wald vor lauter Bäumen nicht.
Aber ich hab mich jetzt schon ein paar Abende damit rumgeschlagen und weiß auch nicht mehr weiter, wie ich das Problem noch eingrenzen soll.

Danke und Gruß
Carsten

Otto123

Hallo Carsten,

ich zitiere mal die Doku von FHEMWEB
Zitatallowfrom
Regexp der erlaubten IP-Adressen oder Hostnamen. Wenn dieses Attribut gesetzt wurde, werden ausschließlich Verbindungen von diesen Adressen akzeptiert.
Achtung: falls allowfrom nicht gesetzt ist, und keine gütige allowed Instanz definiert ist, und die Gegenstelle eine nicht lokale Adresse hat, dann wird die Verbindung abgewiesen. Folgende Adressen werden als local betrachtet:
IPV4: 127/8, 10/8, 192.168/16, 172.16/10, 169.254/16
IPV6: ::1, fe80/10
Das sollte genau Dein Problem sein.
Du musst eine allowed Instanz definieren https://fhem.de/commandref_DE.html#allowed

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

passibe

Und bitte später im Produktiveinsatz nicht HTTP benutzen und mindestens basic auth oder irgendeinen Token nutzen (hab httpapi noch nie verwendet, keine Ahnung, was da alles unterstützt wird) ...

Eckat

Zitat von: Otto123 am 10 Dezember 2024, 15:30:43Hallo Carsten,

ich zitiere mal die Doku von FHEMWEB
[...]

Das sollte genau Dein Problem sein.
Du musst eine allowed Instanz definieren https://fhem.de/commandref_DE.html#allowed

Gruß Otto

Das klingt sehr danach! Vielen Dank, werde ich nachher testen.
Vielleicht bin ich auch zu dumm zum suchen, aber ich hab bei meinen Recherchen und Suchen keinen Hinweis auf FHEMWEB und allowedfrom gesehen. Evtl. könnte man das als Tipp mit in die CommandRef von httpapi aufnehmen.

Zitat von: passibe am 10 Dezember 2024, 16:16:14Und bitte später im Produktiveinsatz nicht HTTP benutzen und mindestens basic auth oder irgendeinen Token nutzen (hab httpapi noch nie verwendet, keine Ahnung, was da alles unterstützt wird) ...
Danke für den Hinweis. Ja daran habe ich gedacht und mir ist das auch bewusst.
Allerdings ist das Risiko auch überschaubar, es ist ja nur der Port 8087 von außen erreichbar und ich gebe im httpapi auch nur zwei dummy devices frei.


Danke und Gruß
Carsten

Wernieman

Oder Du setzt wenigstens ein reverse-Proxy (nginx, apache) davor ....
- 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

Eckat

Wie ich geschrieben habe, ich habe das auf dem Schirm. Danke  :)
Aber das richte ich ein, nachdem ich das funktional fertig habe  ;)

Otto123

Zitat von: Eckat am 10 Dezember 2024, 19:41:44Allerdings ist das Risiko auch überschaubar, es ist ja nur der Port 8087 von außen erreichbar und ich gebe im httpapi auch nur zwei dummy devices frei.
Nein das Risiko ist sehr hoch! Es dauert wahrscheinlich nur Sekunden bis einer Deinen freien Port findet und FHEMWEB übernehmen würde. Man kann von FHEMWEB ins System und wenn der User fhem erhöhte Rechte haben sollte ... Aber auch ohne ist FHEMWEB keine darauf getestete sichere Anwendung die man ohne Anmeldung ins Internet stellen könnte.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

Eckat

OK, OK ... ich verspreche es vor Freigabe nach Außen abzusichern!  :D

Aber noch ist es nicht soweit.
Ich hatte schon eine allowed Instanz, diese habe ich abgeändert, aber auch eine neue Instanz erstellt.

Wenn ich es richtig sehe, kann man beim allowed beim Attribut validFor "nur" FHEMWEB, telnet usw. angeben?
Zur Auswahl steht mein httpapi device nicht und ein manuelles Eintragen funktioniert nicht.

Folgendes ist aktuell eingerichtet:
define web_secure FHEMWEB 8183 global
attr web_secure HTTPS 1
define allowedWEB allowed
attr allowedWEB allowedCommands get,set
attr allowedWEB allowedDevices verbunden,httpapi
attr allowedWEB basicAuth {"$user:$password" eq "test:test"}
attr allowedWEB basicAuthMsg Bitte das Passwort eingeben
attr allowedWEB validFor web_secure
define httpapi HTTPAPI
attr httpapi devicesCtrl mobil_connect

Die Basic-Auth funktioniert, aber mit der URL
https://192.168.20.10:8183/api/set?device=verbunden&action=1
mit einem 302 nach /fhem umgeleitet.

Gibt es noch Tipps?

Danke und Gruß
Carsten

Otto123

Hallo Carsten,

sorry ich dachte es setzt alles auf FHEMWEB auf, da lag ich offenbar schief.
Da habe ich Dich in die falsche Richtung geleitet.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

passibe

Dann ist es vielleicht wirklich einfacher einen reverse proxy davor zu hängen.
Damit erübrigt sich das Problem, weil dann aus Sicht von FHEM der Zugriff nur vom lokalen Netz kommt (bzw. sogar nur vom loopback-interface, sodass du HTTPAPI auch auf local stellen könntest).

Der reverse proxy kann dann direkt auch TLS-termination machen und basic auth zur Verfügung stellen (noch sicherer wäre mit mTLS oder einem VPN zu arbeiten, aber basic auth tut es schon auch).

satprofi

Zitat von: Eckat am 10 Dezember 2024, 19:41:44und ich gebe im httpapi auch nur zwei dummy devices frei.


Danke und Gruß
Carsten

hallo.
wie machst du das? ich habe nur eines per attr freigebeben, aber kann alle steuern
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,Zigbee,Shelly,
Tasmota,LD382A,Telegram

betateilchen

Zitat von: satprofi am 30 Juli 2026, 17:08:52ich habe nur eines per attr freigebeben, aber kann alle steuern

was hast Du wie und wo freigegeben?

Wenn ich im HTTPAPI device das Attribut devicesCtrl mit Gerätenamen befülle, kann ich genau die angegebenen devices per api steuern.

defmod fhemapi HTTPAPI
attr fhemapi devicesCtrl az_Ventilator

Damit kann ich ausschließlich den Ventilator im Arbeitszimmer steuern.

/api/set?device=az_Ventilator&action=toggle
Beim Versuch, ein anderes device zu schalten, passiert einfach nichts.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

komisch, das funktioniert bei mir eben nicht. muss da nochwas attributiert werden ? ebenso disable 1 lässt steuerung noch zu.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,Zigbee,Shelly,
Tasmota,LD382A,Telegram

betateilchen

Kannst Du nicht irgendwann mal vollständige Informationen liefern, damit man Dir besser helfen kann?

Z.B.

  • ein vollständiges list Deines HTTPAPI devices
  • die URL, mit der Du dann den Befehl zur Ausführung aufrufst

Dass ein HTTPAPI, das auf disabled steht, immer noch Befehle ausführt, glaube ich erstmal nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

hallo.
list
nternals:
   AuthenticationDeniedBy allowed_Web
   CFGFN     
   CONNECTS   382
   DEF        fhem01012007 8087 global
   FD         117
   FUUID      6a6b58b1-f33f-3579-f73a-8c5b8c3d7f7132ad
   GLOBAL     global
   INFIX      fhem01012007
   NAME       httpapi
   NR         961
   PORT       8087
   STATE      initialized
   TYPE       HTTPAPI
   eventCount 1
   READINGS:
     2026-07-30 15:59:13   state           initialized
Attributes:
   devicesCtrl test3
   disable    1
   room       System

url zum setzen
http://192.168.0.52:8087/fhem01012007/set?device=test3&action=456
und das list vom dummy
Internals:
   FUUID      683fe72d-f33f-3579-5e0a-594f890416622f84
   FVERSION   98_dummy.pm:0.256060/2022-02-01
   NAME       test3
   NR         811
   STATE      567
   TYPE       dummy
   eventCount 380
   READINGS:
     2026-07-30 19:49:38   state           456
Attributes:
   group      test
   room       dummy
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,Zigbee,Shelly,
Tasmota,LD382A,Telegram