NEWS
reverse proxy mit mehreren iqontrol instanzen und auth
-
hi,
ich habe eine anforderung, die mich gerade selbst überfordert.kurz: ich habe iqontrol im einsatz, remote über reverse proxy verfügbar gemacht und mit authentifizierung geschützt. nun brauche ich eine 2. iqontrol instanz für mein kind, damit er seine sachen schalten darf. aber er darf keinen zugriff auf meine iqontrol instanz bekommen.
problem: die andere iqontrol-instanz wird nur mit einem parameter in der url ausgewählt.langform: über meinen reverse proxy komme ich von außen auf meine iqontrol instanz (und auch auf iobroker-admin, über separate subdomains). klappt wuderbar. ich melde mich per basic authentication am reverse proxy an und komme auf meine iqontrol-instanz, mit der anderen subdomain auf meinen iobroker-admin.
warum authentifizierung am nginx? hier habe ich die möglichkeit, mehrere benutzer zu hinterlegen und pro subdomain unterschiedliche authentifizierungen hinterlegen kann. nachteil: gehe ich direkt auf die iobroker instanz -> keine authentifizierung. daher ist zumindest die admin-instanz noch zusätzlich gesichert.
iqontrol läuft aber über eine web-instanz.
muss ich jetzt für jede iqontrol-instanz eine separate web-instanz installieren? ist das nicht ressourcenverschwendung?am saubersten wäre natürlich, wenn man den zugriff auf eine instanz über benutzer in iobroker verwalten könnte. das scheint es aber nicht zu geben.
hat jemand eine idee, wie man das umsetzen kann?
oder hat einer interesse, mit mir einen sauberen plan zu schmieden, wie man das vernünftig umsetzen kann? ich bräuchte später noch weitere iqontrol instanzen, jeweils für unterschiedliche anwender in der familie...gruß,
andre -
@astrakid sagte in reverse proxy mit mehreren iqontrol instanzen und auth:
ist das nicht ressourcenverschwendung?
naja, ich habe sowieso immer 2 Instanzen am laufen. Ob nun eine Instanz 2 Clients bedient oder 2 Instanzen 2 Clients ist vermutlich von der CPU her gleich.
Meine viel genutzte Hauptinstanz verbraucht ca 290MByte, die Neben-Instanz etwa 130MByte.
Verschwendung wäre es nur wenn es für nichts genutzt wird ...
Ob das viel ist hängt davon wieviel dein System hat ...
Wenn in deinem System eh noch ein paar Gigabyte RAM frei sind - was soll es, hast du vorher eh nicht genutzt. -
@bananajoe ram wäre das, wovon ich am meisten zur verfügung habe. also wäre das der einzige weg? eigene web- und iqontrol-instanz und über den rev-proxy entsprechend auf die instanz verteilen?
ok, werde ich mal testen. -
@astrakid sagte in reverse proxy mit mehreren iqontrol instanzen und auth:
also wäre das der einzige weg? eigene web- und iqontrol-instanz und über den rev-proxy entsprechend auf die instanz verteilen?
keine Ahnung, bestimmt nicht.
Ich mache persönlich auch ganz viel mit Reverse Proxy - aber mit Apache (in HAproxy arbeite ich mich gerade ein). Dein Problem ist ja aber das du Änderungen an der URL verhindern willst.Wobei das auch vermutlich per URL-Rewrite ginge - also wenn einer
.../view2/...
eintippt der daraus automatisch wieder.../view1...
macht. Nur in cooler bitte, also immer umschreiben wenn es nicht.../view1/...
ist.Oder du wertest aus welches Clientgerät sich mit der View verbindet und reagierst entsprechend auf ioBroker-Seite. Wobei diese Auswertung am einfachsten über mehrere Web-Instanzen geht ...
-
@astrakid
Ich bin in iqcontrol nun nicht so ganz firm
Wenn ich richtig verstanden hab ist die berechtigungsunterscheidung über ein Parameter in der url gesetzt?
Durch ein url rewrite kannst du ja alles so ummodeln wie du willst um dann den Request zum backend abzusetzen
https://www.nginx.com/blog/creating-nginx-rewrite-rules/ -
@oliverio ja korrket. es ist noch nicht mal eine berechtigungsunterscheidung, sondern nur der einsprungspunkt auf die andere instanz. berechtigung würde ich übe rden reverse proxy machen können.
über die web-instanzen klappt das ganze gar nicht, da ich die iqontrol-instanz nicht an die web-instanz binden kann. ich habe nur im admin-modul die option, für den reverse proxy einträge anzulegen und an die web-instanz zu binden. ist das der richtige weg? -
ich hab es nu mal per rewrite funktioniet, kriege es aber nicht hin, weil:
iqontrol wird nur über /iqontrol/ aufgerufen, danach wird automatisch immer die erste instanz geöffnet.
rufe ich die zweite instanz über den namespace auf /iqontrol/index.html?namespace=iqontrol.2 klappt es.
aber ich kann nicht sicherstellen, dass namespace=iqontrol.2 verwendet wird.hab es banal folgendermaßen versucht zu lösen:
location / { if ($request_uri !~* /(namespace=iqontrol.2)) { return 302 https://my.domain.de/iqontrol/index.html?namespace=iqontrol.2; }
landet aber in einer endlosschleife.
jetzt habe ich festgestellt, das iqontrol bzw der webadapter erst auf /login/ umleitet. aber selbst das landet in einer endlosschleife. hab auch einen block für /login/ erstellt, damit der nicht umgeleitet wird, will abr nicht.meine nginx-config:
server { listen 443 ssl http2; # 'ssl' parameter tells NGINX to decrypt the traffic server_name my.domain.de; access_log /var/log/nginx/iod-access.log ; error_log /var/log/nginx/iod-error.log notice; proxy_ssl_verify off; proxy_ssl_server_name on; proxy_set_header Host $http_host; proxy_set_header X_FORWARDED_PROTO https; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; location /login/ { proxy_pass https://10.1.1.2:8082/; } location / { rewrite_log on; proxy_pass https://10.1.1.2:8082/; }
das log sagt:
87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET / HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 87.15.1.4 - user [13/Apr/2024:17:42:23 +0200] "GET /login/index.html?href=%2F&error HTTP/2.0" 302 116 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" [...]
wo ist mein denkfehler?
-
dann schau dir mal im browser mit den developer tools an, was da zurückgegeben wird. irgendein fehler wird da ja dann weitergeschleift.
denke dran. der reverseproxy behandelt alle requests. also auch die zu css, js, bilder, etc-dateien
-
@oliverio habs jetzt so halbwegs hibekommen. danke für die denkanstöße.
das größte problem war, dass man nicht stumpf auf die iqontrol instanz gehen darf, sondern andere ordner durchreichen muss (/ib, /socket.io (?), /...).dann funktioniert es so halbwegs.
hier mal meine config:
server-block:
server { listen 443 ssl http2; # 'ssl' parameter tells NGINX to decrypt the traffic server_name my.iqo1.de; access_log /var/log/nginx/iol-access.log ; error_log /var/log/nginx/iol-error.log notice; rewrite_log on; proxy_ssl_verify off; proxy_ssl_server_name on; proxy_set_header X_FORWARDED_PROTO https; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 86400;
locations:
location /login$request_uri { proxy_pass https://10.1.1.1:8082/login$request_uri; proxy_ssl_verify off; }
location /iqontrol/index.html { proxy_set_header Host $host; proxy_pass https://10.1.1.1:8082$request_uri; if ($request_uri !~* "index.html.*namespace=iqontrol.1") { rewrite .* https://my.iqo1.de/iqontrol/index.html?namespace=iqontrol.1; } }
location /iqontrol/ { proxy_set_header Host $host; proxy_pass https://10.1.1.1:8082$request_uri; }
location /iqontrol/jquery/ { proxy_pass https://10.1.1.1:8082/iqontrol/jquery/; }
location / { proxy_pass https://10.1.1.1:8082/; }
location /lib { proxy_pass https://10.1.1.1:8082/lib/; }
location /socket.io/ { proxy_pass https://10.1.1.1:8082$request_uri; }
zugegeben weiß ich nicht, ob ich wirklich alles brauche (socket.io und lib müsste theoretisch über / ausgeliefert werden), aber so tut es zu 90%.
was nicht geht, und das vestehe ich nicht:
rufe ich die url mit /iqontrol auf, dann läuft das rewriting nicht. wenn ihc das rewrite aber in einen /iqontrol-block packe, funktioniert es nicht mehr. dann kriege ich zwar eine seite, aber sämtliche grafiken und funktionen fehlen...
egal. teilziel erreicht. optimierung erfolgt demnächst.