FHEMWEB an konkrete IP binden (und nicht an alle)

Begonnen von 1977er, 18 März 2016, 15:35:44

Vorheriges Thema - Nächstes Thema

1977er

Moin.

Nicht erst seit IPv6 kann ein Rechner mehr als eine IP Adresse haben. Ich möchte auf meinem Rechner weg von diesen krummen Portnummern und daher eine (weitere) IP Adresse verwenden, um mich dort an einen Standard Port (80/443) zu binden.

Da TcpServerUtils::TcpServer_Open() in Bezug auf das Binding ja nur ein Wrapper für IO::Socket::INET6 ist, stellt sich mir die Frage, warum via
LocalHost => ($global ? ($global eq "global"? undef:$global) : "127.0.0.1")
hier künstlich auf die zwei Optionen "alle IPs" und "localhost" eingeschränkt wird.

Ich würde diesen Teil gerne aufweiten, um konkrete IPs angeben zu können, an die sich FHEM bindet.

Damit mein Codeschnipsel eine Chance hat, übernommen zu werden, würde ich gerne im Vorfeld fragen, wie es hier mit der Abwärtskompatibilität gehandhabt wird. Lieber häßlich und abwärtskompatibel oder intuitiv und kompatibilitätsbrechend?


define WEB FHEMWEB IPV6:443 global
attr WEB IP fdca:ffee:dead:beaf::1


versus


define WEB FHEMWEB [fdca:ffee:dead:beaf::1]:443


rudolfkoenig

Zitathier künstlich auf die zwei Optionen "alle IPs" und "localhost" eingeschränkt wird.
Ich sehe in dem zitierten Code 2 Fragezeichen.

ZitatLieber häßlich und abwärtskompatibel oder intuitiv und kompatibilitätsbrechend?
Lieber haesslich. Und intuitiv ist meist subjektiv.

1977er

Hallo Rudolf,

danke für die schnelle Antwort.

Zitat von: rudolfkoenig am 18 März 2016, 16:10:05
Ich sehe in dem zitierten Code 2 Fragezeichen.

Ist meine Ist-Analyse inkorrekt? Habe ich etwas übersehen? Kann sich FHEM ggf. bereits sich über andere Wege an eine konkrete IP binden?

Gruß,
Oliver

rudolfkoenig

Ja. Ja. Jein: Du hast die Zeile netterweise direkt zitiert.

plaicy

#4
Hatte das damals eigentlich geklappt? In FHEM/01_FHEMWEB.pm steht folgendes (Zeile 232):
sub
FW_Define($$)
{
  my ($hash, $def) = @_;
  my ($name, $type, $port, $global) = split("[ \t]+", $def);
  return "Usage: define <name> FHEMWEB [IPV6:]<tcp-portnr> [global]"
        if($port !~ m/^(IPV6:)?\d+$/ || ($global && $global ne "global"));


Ich denke, dass das wohl die Zeile ist, die verhindert, dass ich den Hostnamen angeben kann, an den das Webinterface gebunden werden soll. Demnach geht wohl nur nichts oder "global". Hintergrund ist, dass ich jetzt mehrere Adressen auf dem Rechner eingerichtet habe und nicht möchte, dass der Rechner auf allen Interfaces lauscht.

Bei telnet hat es funktioniert. Wenn auch mit dem Umweg über einen anderen Port, weil ich da sonst die Meldung "bereits benutzt" bekomme. Das stimmt natürlich, weil da fhem auch hört, wenn man von global auf eine definierte Adresse umstellt.

PS: Hätte ich lieber ein neues Thema aufmachen sollen?

rudolfkoenig

Habe die Pruefung auf "global" entfernt (analog zu telnet), und das "Feature" im commandref erwaehnt.
D.h. mit "define WEB FHEMWEB 8083 192.168.178.10" ist http://localhost:8083 nicht erreichbar.

plaicy

#6
Danke. Das war ja schnell. Sieht so aus, dass es funktioniert (netstat -tl).

PS: Nutze das, dass dann jetzt fhem nicht mehr in allen Netzen, wo der Rechner eine Schnittstelle hat auch fhem zur Verfügung steht (localhost ist mir egal, ob das zugreifbar ist oder nicht). Dann muss ich nur noch die ganzen anderen offenen Ports von Perl zuordnen. Aber das finde ich sicherlich im Quellcode.

FunkOdyssey

#7
Ich finde diese neue Möglichkeit genial und echt praktisch.

So sieht meine Konfiguration aus:
Internals:
   CONNECTS   1
   CSRFTOKEN 
   DEF        8081 global
   FD         218
   NAME       WEBbridge
   NR         495
   NTFY_ORDER 50-WEBbridge
   PORT       8081
   STATE      Initialized
   TYPE       FHEMWEB
Attributes:
   allowfrom  ^192\.168\.24\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$|^172.*$|127.0.0.1
   csrfToken  none
   hiddenroomRegexp .*


Leider erhalte ich beim Ändern des DEFs (z.B. auf IP 192.168.0.50) permanent Fehlermeldung in folgender Art:
WEBbridge: Can't open server port at 8081: Cannot assign requested address




Fhem selbst läuft in einem anderen Subnet und hat die IP 172.19.0.100. Nur diese wird scheinbar akzeptiert. Alles andere funktioniert bei mir nicht.
define WEBbridge FHEMWEB 8081 IP 172.19.0.100
Nur macht dies ja keinen Sinn, weil es gleichbedeutend mit localhost ist.

rudolfkoenig

Zitatdefine WEBbridge FHEMWEB 8081 IP 172.19.0.100
So war das nicht gemeint. Eher so:
define WEBbridge FHEMWEB 8081 172.19.0.100
Und ich habe keine Probleme beim Aendern, selbst wenn ich das ueber die gleiche Verbindung durchfuehre.


FunkOdyssey

Ja, sorry. Das war ein Tippfehler. Das "IP" stand da natürlich nicht drin. :-)

Wie gesagt: Ich kann nur die eigene IP eingeben. Alles andere schlägt fehl.

Muss die IP im Augenblick des Speicherns erreichbar sein?

rudolfkoenig

ZitatMuss die IP im Augenblick des Speicherns erreichbar sein?
??? Wie, erreichbar?
"konfiguriert auf dem FHEM-Server" ist die richtige Formulierung. Und ja.

FunkOdyssey

Es geht doch darum, eine externe IP anzugeben (wie bspw. die eines Proxy-Servers), die als einzige auf diese FHEM-Instanz zugreifen kann, oder?

Sobald ich dort die IP des Proxys angeben (ist pingbar vom fhem-host), so erscheint die Fehlermeldung.

Ein verbose5-Log gibt es dazu leider nicht.

Erzwinge ich das direkt über die fhem.cfg (Ja, ich weiß - war nur ein Test), so beendet sich FHEM direkt:
WEBbridge: Can't open server port at 8081: Cannot assign requested address. Exiting.

Und ja, das FHEMWEB-Update habe ich geladen. Keine Updates ausstehend. :-)

rudolfkoenig

ZitatEs geht doch darum, eine externe IP anzugeben (wie bspw. die eines Proxy-Servers), die als einzige auf diese FHEM-Instanz zugreifen kann, oder?

Nein. Es geht darum, dass man einen Rechner mit vielen IP-Adressen (bildlich: Netzwerkkarten) hat, und FHEMWEB soll nur auf einem dieser IP-Adressen lauschen, und nicht (wie per global) auf allen.

FunkOdyssey

Ah, das erklärt nun einiges.
Ich dachte, es wäre ein geändertes allowfrom-Verhalten gewesen.