mod_proxy / reverseproxy

Alles, was den Apache betrifft, kann hier besprochen werden.

mod_proxy / reverseproxy

Postby moonchaser » 05. September 2014 11:17

Hallo,

ich möchte meine Wlan-Kameras in meinem Heimnetz (basierend auf Raspberry Pi) über einen Apache Server (auch RPi) extern aus dem Internet sichtbar machen. Betriebssystem ist alles Linux. Ich habe also eine html Seite allcams.html mit tags

<img src=192.45.0.56:657> # das sei die lokale Adresse der Wlan Kamera1
<img src=192.45.0.57:657> # das sei die lokale Adresse der Wlan Kamera2
usw.

erzeugt. In meinem Heimnetz bekomme ich dann schön die Bilder der Kameras auf einer Seite des Servers mit z.B. der Adresse

https://192.145.0.50/allcams.html

angezeigt. Ich habe jetzt in meinem Router portforwarding auf den Apache Server aktiviert und kann mit meiner dynamischen Internetadresse auch darauf zugreifen und die Seite wird auch geladen...bis auf die Bilder der Kameras. Ich gehe davon aus, dass die lokalen Adressen nicht aufgelöst bzw. übersetzt werden. Im Internet bin ich dann über ReverseProxy gestolpert und hoffe das löst mein Problem. Wenn ich also in Apache mod_proxy aktiviere und so was wie

<Location /cam1/>
ProxyPass http://192.45.0.56:657/
ProxyPassReverse http://192.45.0.56:657/
Order allow,deny
Allow from all
</Location>

in meine Apache Konfiguration für den virtuellen host aufnehme und die Kamera tags in meiner html Seite allcams.html so umschreibe :

<img src="http://MeineDynAdresse/cam1">
...

sollte ich dann mit

https://MeineDynAdresse/allcams.html

dann wie im Heimnetz die Bilder sehen oder habe ich das Ganze nicht verstanden? :-)

Danke schon mal
Michael
moonchaser
 
Posts: 4
Joined: 05. September 2014 10:54
Operating System: Linux

Re: mod_proxy / reverseproxy

Postby Nobbie » 05. September 2014 11:44

Im Prinzip sollte es so gehen, aber Du erwähnst im Text einen "virtuellen Host", aber ich sehe nicht, welchen virtuellen Host und wozu Du den definiert hast?

Geht etwas nicht? Ich würde es auch leicht anders machen (eben genau mit einem virtuellen Host, deswegen meine Frage oben). Aber insgesamt sollte es eigentlich so gehen.

Es gibt aber auch eine zweite Möglichkeit, wenn Du sowieso Deinen Server hinter einem Router betreibst, dann hast Du im Router ein Portforwarding für den Server auf Port 80 eingerichtet, dass der auf den internen Rechner 192.145.0.50 weiterleitet.

Das kannst Du natürlich ganz einfach wiederholen und richtest einfach noch ein Portforwarding ein, diesmal aber auf Port 657 (statt 80). Und das bekommt dann als Ziel die Webcam (also 192.45.0.56). Das hat den Vorteil, dass Du sogar komplett ohne Xampp und Konsorten von der ganzen Welt aus die Fotos sehen kannst, einfach

Code: Select all
<img src="http://MeineDynAdresse:657" />


in einem beliebigen HTML Dokument angeben, oder ganz platt nur http://MeineDynAdresse:657 im Browser eingeben (egal wo auf der Welt) und dann siehst Du Deine Webcam. Dürfte die einfachere Lösung sein...

P.S.: Ich sehe gerade, dass Du mehrere Webcams betreibst. Da hängt es jetzt vom Router ab, ob das dennoch so einfach geht. Ich selbst habe eine Fritzbox und die kann nicht nur Portforwarding, sondern auch noch Portmapping. D.h. ich kann den ankommenden Port 1000 beispielsweise auf eine interne IP weiterleiten (bis dahin kann das jeder Router), aber dabei gleichzeitig angeben, dass die Daten bei der internen Weitergabe NICHT auf Port 1000 kommen, sondern beispielsweise auf Port 80. Und das brauchst Du, wenn Deine Kameras tatsächlich denselben Port benutzen. Dann kannst Du nämlich einfach beliebige Ports von außen annehmen (sagen wir 1001 und 1002), und 1001 wird auf 192.45.0.56:657 geroutet (und gemapped) und 1002 auf 192.45.0.57:657 (verschiedene IPs, aber der gleiche Port 657). Mit der Fritzbox geht das problemlos. Von außen sieht man die Webcams dann via http://MeineDynAdresse:1001 bzw. http://MeineDynAdresse:1002

Ansonsten wäre ggf. die letzte Option, ob Du in den Webcams den Port angeben kannst? In meiner Webcam kann ich das. Dann braucht es der Router nicht zu mappen. Nimmst Du einfach 656 und 657 oder so.

Wenn das alles nicht geht, dann hilft in der Tat nur noch der Umweg über den reverse Proxy, aber das hat eben den Nachteil, dass Du einen ganzen Xampp Server betreiben musst, das ist im Prinzip eigentlich sonst nicht notwendig.
Nobbie
 
Posts: 8772
Joined: 09. March 2008 13:04

Re: mod_proxy / reverseproxy

Postby moonchaser » 05. September 2014 13:11

@Nobbie

Danke für die ausführliche Antwort. Die Konfiguration eines virtuellen Hosts habe ich natürlich schon, der gepostete <Location> Abschnitt soll da rein. Wie
gesagt, die Gesamtseite sehe ich ja auch von extern nur nicht die integrierten lokalen url's. Vielleicht auch weil die Firewall dazwischen eben nur Port 443 oder 80 zuläßt.

Und da mein Router nur Portforwarding kann und ich nur Port 443 (https) nehmen will, bringen unterschiedliche Ports auch nichts für externen Zugriff.
Deshalb brauche ich ein anderes Unterscheidungskriterium und das kann dann nur der Teil nach der Domain (also z.B. https://MeineDynAdresse/cam1) sein und das dachte ich geht nur mit Reverse Proxy.

Den Apache Server hab ich schon und der läuft auch auf dem Raspberry Pi gut genug. Muss also Reverse Proxy nur noch hinzufügen. Wollte nur schon vorher wissen, ob das so geht.

Michael
moonchaser
 
Posts: 4
Joined: 05. September 2014 10:54
Operating System: Linux

Re: mod_proxy / reverseproxy

Postby Nobbie » 05. September 2014 14:24

moonchaser wrote:Die Konfiguration eines virtuellen Hosts habe ich natürlich schon, der gepostete <Location> Abschnitt soll da rein


Da die Kameras sicherlich einen extrem primitiven Webserver betreiben, wird das wahrscheinlich mit der Location problemlos gehen. Ein reverse Proxy kann (je nach Komplexität der dahinter liegenden Webseite) da aber ganz schön schwierige Probleme nach sich ziehen, weil Du im Prinzip einen Pfadnamen (nämlich "/cam1") des vorgeschalteten Servers auf einen anderen anderen Pfadnamen (nämlich nur noch "/") des dahinter liegenden Servers aufeinander abbildest. Da kann es ganz ekelhafte Probleme geben (das wäre zu aufwändig, das hier zu erläutern).

Deswegen empfehle ich eigentlich immer, dass man das umgeht, in dem man einfach noch weitere virtuelle Hosts definiert, in Deinem Fall jetzt konkret für jede Webcam einen eigenen virtuellen Host und da wird dann jeweils ein reverse Proxy definiert, der aber dann nicht verschiedene Pfade aufeinandern abbildet, sondern einfach "/" auf "/". Das sieht fast genauso aus, nur fällt die Location Anweisung weg, dafür muss Du zwei mal einen virtuellen Host definieren. Ich vermute mal, Du hast sowieso bei irgendeinem Provider eine Domain für die dynamische DNS Anbindung, da würde ich dann zwei entsprechende weitere (ggf. Subdomains) nehmen.

Das sieht dann so ungefähr aus:

Code: Select all
<VirtualHost  *:443>
ServerName cam1.myip.dyndns.org
ProxyPass / http://192.45.0.56:657/
ProxyPassReverse / http://192.45.0.56:657/
</VirtualHost>

<VirtualHost  *:443>
ServerName cam2.myip.dyndns.org
ProxyPass / http://192.45.0.57:657/
ProxyPassReverse / http://192.45.0.57:657/
</VirtualHost>


Und im HTML Source steht dann einfach nur noch (also in allcams.html):

Code: Select all
<img src="https://cam1.myip.dyndns.org" />
<img src="https://cam2.myip.dyndns.org" />


moonchaser wrote:Vielleicht auch weil die Firewall dazwischen eben nur Port 443 oder 80 zuläßt.


Nein, das hat mit Firewalls nichts zu tun. Das liegt an der Adresse 192.45.0.57 - das ist keine sog. "Public IP" aus dem TCPIP Adressbereich, sondern per Definition eine Local IP. Und das bedeutet, dass IPs aus dem Local IP Bereich werden NICHT irgendwie im Internet gesucht, sondern immer im lokalen LAN des Browsers, der diese IP anfordert. Irgendwo in der Welt steht ja ein Browser, der bekommt die Seite allnet.html angeliefert und da steht diese img-Klausel drin und das Bild hat die obige IP 192.45.0.57 und das sucht der Rechner in seinem eigenen lokalen Netz, der hat Null Ahnung davon, dass Du zu Hause auch ein LAN hast, wo diese IP vergeben ist und wo die Kamera dran hängt. Das ist das Problem der lokalen IPs, deswegen kann man die nur via Portforwarding überhaupt nach draußen bringen, aber das tust ja nur mit dem RaspBerry Server, als muss noch einmal mehr um die Ecke gedacht werden, deswegen muss Dein RaspBerry Server den Kopf hinhalten, selbst die Webcam aufsuchen und das Bild unter seinem Servernamen ausliefern. Das ist die Idee des Reverse Proxy. Du brauchst insgesamt also Portforwarding plus reverse Proxy. Denn eine IP a la 192.45.0.57 wird NIE einen Request von außen auf Dein Netzwerk zur Folge haben.
Nobbie
 
Posts: 8772
Joined: 09. March 2008 13:04

Re: mod_proxy / reverseproxy

Postby moonchaser » 05. September 2014 15:03

Nein, das hat mit Firewalls nichts zu tun. Das liegt an der Adresse 192.45.0.57 - das ist keine sog. "Public IP" aus dem TCPIP Adressbereich, sondern per Definition eine Local IP.

Ja, so hatte ich mir das auch ursprüglich gedacht. Allerdings war mir nicht klar, wie der Apache Server mit den Cams redet, wenn die urls in seine Seite eingebettet sind. Er könnte ja auch lokal die Bilder "holen" und danach mit der Adresse des virtuellen hosts versehen und so tun als ob sie von ihm kämen. Aber ich denke genau das macht das Reverse Proxy :)
Ich vermute mal, Du hast sowieso bei irgendeinem Provider eine Domain für die dynamische DNS Anbindung, da würde ich dann zwei entsprechende weitere (ggf. Subdomains) nehmen.

Ok, werde ich mal prüfen und ggf. auch ausprobieren. Aber ist natürlich nicht beliebig erweiterbar, bzw. hängt vom Provider ab.

Michael
moonchaser
 
Posts: 4
Joined: 05. September 2014 10:54
Operating System: Linux

Re: mod_proxy / reverseproxy

Postby Nobbie » 06. September 2014 10:56

moonchaser wrote:Allerdings war mir nicht klar, wie der Apache Server mit den Cams redet, wenn die urls in seine Seite eingebettet sind. Er könnte ja auch lokal die Bilder "holen" und danach mit der Adresse des virtuellen hosts versehen und so tun als ob sie von ihm kämen.


Ne, dazu müßte Apache ja HTML "verstehen", aber das kann Apache nicht. Der Apache liefert nur stumpf aus. Erst der Browser interpretiert den HTML Code und fordert dann die Bilder an (mit Folgerequests).
Nobbie
 
Posts: 8772
Joined: 09. March 2008 13:04

Re: mod_proxy / reverseproxy

Postby moonchaser » 12. September 2014 20:44

Also wen es interessiert. Reverse Proxy funktioniert prima und erlaubt es Server aus dem häuslichen Intranet mit dem globalen Internet zu verbinden, ohne für jeden ein Portforwarding einrichten zu müssen.

Als Vorteile sehe ich : https Verschlüsselung auch für normale http Server, zusätzliche Authentifizierung, Erreichbarkeit aller Server unter einem Port, also z.B. 443 wenn man hinter einer Firewall ist und die häuslichen Server andere Ports und IP's erwarten.

Man muss im Router das Portforwarding auf den Port des virtuellen Apache Hosts, der auch den Reverse Proxy bereitstellt, einstellen. Natürlich muss man die Internet Adresse des Routers kennen, bzw. sich eine dynamische Adresse bei einem Provider zulegen. Ich kann somit sicher und mit Passwortabfrage meine Intranet Kameras weltweit anschauen oder aber z.B. auch einen http server auf µP Basis (Net-IO) zum Abfragen oder Geräte Ein- und Ausschalten ansprechen. Oder man kann den Apache Server über Shellinabox mit SSH auf CLI Ebene sicher unter https administieren.

Michael
moonchaser
 
Posts: 4
Joined: 05. September 2014 10:54
Operating System: Linux


Return to Apache

Who is online

Users browsing this forum: No registered users and 5 guests