FHEM hinter Proxy

Begonnen von Engel, 09 November 2016, 22:06:28

Vorheriges Thema - Nächstes Thema

Engel

Moin liebe FHEM-Community,

ich bin zwar neu hier im Forum, aber mit FHEM seit fast 2 Jahren vertraut.
Nun hat sich mir aber ein bislang unüberwindbares Problem aufgetan:

Wie konfiguriere ich FHEM, so dass das System auch hinter einem (Firmen-)Proxy läuft?
D.h. es soll das Update funktionieren und auch Module wie Weather oder HTTPMOD.
Ich habe schon viel im Forum gelesen und leider nur eine Info über Socket-Kommunikation (HTTPUtils) gefunden. Genau diese blockiert der Proxy.

Derzeit habe ich einen RasPi 3 mit Rasbian Jessi lite und FHEM aufgesetzt.
Zudem habe ich CNTLM aufgesetzt und Aptitude mit den nötigen Proxy-Einstellungen versorgt.

Damit funktionieren UPDATE, WEATHER und HTTPMOD leider nicht :-(

Arbeitet FHEM tatsächlich mit Socket-Kommunikation?
Wo kann ich in FHEM Proxy-Einstellungen vornehmen?

Vielen Dank und Gruß,
Engel

rudolfkoenig

Die meisten Module in FHEM verwenden das FHEM-Eigenen HttpUtils.pm, und der kennt sich (noch) mit Proxy nicht aus.

Ich bin bereit das zu aendern, allerdings bin nicht sicher, ob ich ein Proxy zwecks Testen aufstellen will, deswegen waeren mir Patches lieber. Da ich mich bisher mit Proxies nicht beschaeftigt habe: setzt man dabei einen "normalen" HTTP-Request ab, es geht bloss nicht an dem Adressaten, sondern an den Proxy? Muss man sonst was noch ins Header schreiben?

ZitatArbeitet FHEM tatsächlich mit Socket-Kommunikation?
Ja. Was auch immer mit der Frage gemeint war :)

justme1968

was denn sonst ausser sockets? neben sockets und files gibt es nichts mehr das noch relevant ist oder?

auch http ist ein protokoll das über sockets geht. und sogar IPoAC kommt nicht ohne aus :).



hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

CoolTux

Was ist das denn für ein Proxy der http oder https blockiert?
Ist das ein reiner Mailproxy?
Ich betreibe selber ein Proxy vorm FHEM. Du gibst einfach im Betriebssystem (Linux) an das Du einen Proxy hast und schon werden die entsprechenden Protokolle über den Proxy geleitet.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

ZitatDu gibst einfach im Betriebssystem (Linux) an das Du einen Proxy hast und schon werden die entsprechenden Protokolle über den Proxy geleitet.

D.h. entweder connect(2) oder gethostbyname(3) "luegt"? Kommt mir komisch vor, ich haette eine Unterstuetzung vom Programm erwartet. Laeuft bei dir das FHEM-update uebers Proxy?

CoolTux

Ja, wobei ich da sagen muß, dadurch das das Update eine http Anfrage ist kommt die sowieso zum Proxy und damit durch. Ist ein transparenter Proxy. Nur https oder ftp müssen explizit im profile script mit angegeben werden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux


cat /etc/profile.d/system_proxy.sh



export https_proxy=http://pi-proxy01:3128
export ftp_proxy=http://pi-proxy01:3128
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

ganz so einfach ist das nicht :)

es gibt zwei arten von proxy:
- transparent die greifen auf netzwerk/firewall/... ebene ein und sind (mehr oder weniger) unsichtbar
- 'normale' proxies konfiguriert werden müssen und für die der client unterstützung explizit implementieren muss weil er aktiv
  die verbindung zum proxy statt zum eigentlichen ziel aufbauen muss.
  wie diese konfiguration genau passiert hängt vom client ab.

  im http rfc steht etwas zu proxies.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Engel

Vielen Dank für die Rückckmeldungen  :)

Es ist ein aktiver Proxy, der Zugriffe auf bestimmte Seiten sperrt wie z.B. private Mail oder auch indizierte Seiten.

Die Einstellungen, die CoolTux in die system_proxy.sh geschrieben hat, habe ich schon gesetzt.

Ohne diese Einstellungen funktioniert wget nur mit dem Zusatz "-e use_proxy=yes" und der Angabe des Proxy "-e http_proxy=127.0.0.1:3128".
Hinter "127.0.0.1:3128" verbirgt sich CNTLM. CNTLM "ergänzt" für den eigentlichen Proxy die Credentials (Username und Passwort)

Ein Update in FHEM funktioniert nicht  :(
Resultat: http://fhem.de/fhemupdate/controls_fhem.txt: Can't connect(1) to http://fhem.de:80: IO::Socket::INET: Bad hostname 'fhem.de:80'

Ein wget auf die Datei funktioniert.

TL

#9
Moin!

Zitat von: rudolfkoenig am 10 November 2016, 10:14:49
Die meisten Module in FHEM verwenden das FHEM-Eigenen HttpUtils.pm, und der kennt sich (noch) mit Proxy nicht aus.

Ich bin bereit das zu aendern, allerdings bin nicht sicher, ob ich ein Proxy zwecks Testen aufstellen will, deswegen waeren mir Patches lieber. Da ich mich bisher mit Proxies nicht beschaeftigt habe: setzt man dabei einen "normalen" HTTP-Request ab, es geht bloss nicht an dem Adressaten, sondern an den Proxy? Muss man sonst was noch ins Header schreiben?

Ich habe auch das Problem, dass hinter meinem Proxy (Squid) leider im Bezug auf FHEM einiges nicht funktioniert. Daher wäre es wirklich toll, wenn sich das ändern würde!

Habe daher gerade mal mit dem Wireshark nachgeschaut - es ist genau, wie Du schreibst: Der Header ändert sich nicht, Du musst nur die Pakete an die Adresse und den Port schicken, die z.B. in den Environment-Variablen http_proxy / https_proxy / ftp_proxy hinterlegt sind. Das müsste eigentlich schon alles sein. Falls der proxy eine Authentifizierung mit Username/Passwort verlangt, wird wohl komplizierter, aber das habe ich zumindest nicht eingerichtet. Für die meisten würde das oben beschriebene vermutlich ausreichen.


Edit: Die Env-Variable "no_proxy" müsste wohl auch noch berücksichtigt werden.

Viele Grüße,
   Thomas
Einen Pi, sie zu knechten, sie alle zu finden,
ins FHEM zu treiben und ewig zu binden.

Prof. Dr. Peter Henning

Der bessere Weg ist, vom lokalen Rechner einen SSH-Tunnel auf die Firewall aufzumachen - damit ist der Proxy in der Regel auch umgangen. Mit diesem SSH-Tunnel können beliebige Ports externer Rechner auf den internen Rechner gemappt werden. Nicht nur zum Update von FHEM, sondern auch für andere Zwecke sehr hilfreich.

LG

pah

TL

Moin!

Zitat von: Prof. Dr. Peter Henning am 19 November 2016, 20:35:12
Der bessere Weg ist, vom lokalen Rechner einen SSH-Tunnel auf die Firewall aufzumachen - damit ist der Proxy in der Regel auch umgangen. Mit diesem SSH-Tunnel können beliebige Ports externer Rechner auf den internen Rechner gemappt werden. Nicht nur zum Update von FHEM, sondern auch für andere Zwecke sehr hilfreich.

Könntest Du das bitte für mich einmal genauer ausführen? Meine Netzwerkumgebung sieht grob ungefähr so aus:


   FHEM-
   Update- ______Internet_____Router_____Firewall_____Proxy_____Lokales FHEM
   Server

(Router, Firewall,Proxy und lokales FHEM sind jew. eigenständige Rechner. Mindestens der Proxy-Server macht kein IP-Forwarding von IP-Paketen.)

Wie sollte mir jetzt ein SSH-Tunnel dabei helfen, vom lokalen FHEM aus den FHEM-internen Update-Befehl durch den Proxy zu bringen? Wie müsste der ssh-Befehl dafür genau aussehen?

Viele Grüße,
   Thomas
Einen Pi, sie zu knechten, sie alle zu finden,
ins FHEM zu treiben und ewig zu binden.

Engel

Moin zusammen,

zunächst möchte ich allen FHEM-Entwicklern und -Usern ein frohes neues Jahr wünschen.

Nachdem ich die Arbeit letztes Jahr unterbrechen musste, habe ich mich nun weiter an die Analyse gemacht.

Zunächst habe ich exemplarisch ein wget auf query.yahooapis.com gemacht. Alles in Ordnung, da (wie im Browser auf einem anderen Rechner) HTTP 400 zurück geliefert werden. Ein wget auf fhem.de funktioniert auch ohne Probleme.

Dann habe ich via fhem eine Anfrage an query.yahooapis.com ausgelöst. Der Proxy antwortet auf eine DNS-Anfrage mit einer Antwort (A Record), die einen Authoritative Nameserver als SOA enthält. Ferner wird sofort versucht die Adresse durch Anhängen einer erweiteren Adresse aufzulösen.

Im Log von FHEM stehen die Einträge "gethostbyname query.yahooapis.com failed". Mir ist noch unklar, warum die Methode "gethostbyname" fehl schlägt ...

Leider fehlt mir ein wenig Handwerkszeug zum Debuggen der HttpUtils. Ich bin mit perldebug nicht vertraut und google hat auf die Schnelle nicht weiter helfen können.
Könnte mir jemand eine kurze Erläuterung geben, wie ich im Umfeld von FHEM einzelne Module oder speziell HttpUtils mit gethostbyname debuggen kann?

Vielen Dank für die Unterstützung
Engel

rudolfkoenig

Die einfachste Version ist "attr global verbose 5".
Etwas aufwendiger: an strategischen Stellen in HttpUtils.pm eine
Log 1, "XXX: $XXX";
Zeile einstreuen. Dabei kann man fuer komplexe Datenstrukturen auch
Log 1, "XXX: ".Dumper($XXX);
verwenden, muss man aber einmal oben
use Data::Dumper;
dazupacken.

Achtung: falls man die Variable "attr global dnsServer a.b.c.d" setzt, dann verwendet HttpUtils statt gethostbyname die eigene, nicht blockierende Implementierung.

Engel

So, nun habe ich mich ausführlich mit HttpUtils beschäftigt.
@Rudolf: Vielen Dank für den Support

Inzwischen habe ich eine Version erstellt, die mit und ohne Proxy eingesetzt werden kann. Unterstützt werden http- und https-Anfragen.
Der Proxy wird nur angesprochen, wenn er in der fhem.cfg eingerichtet ist. Zusätzlich wird CNTLM benötigt.

Probleme habe ich noch mit zwei neu eingeführten globalen Variablen (proxyHost & proxyPort): Wo müssen diese eingetragen werden, damit die Warnungen verschwinden?

Ich würde gern meine Weiterentwicklung zurück fließen lassen. Das es sich um eine wichtige Komponente handelt, natürlich nicht ohne Review. Testen konnte ich die Klasse nur eingeschränkt mit meinen Setups mit und ohne Proxy.
Muss ich meine Änderungen nun in ein git einstellen?