PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port über Apache virtuelles Verzeichnis mappen?



peez
12.01.2010, 07:57
Ich habe das Problem, dass bei mir in der Firma alles außer http(s) und ftp geblockt wird. Das heißt ich komme nicht auf meinen DSM drauf, da dieser ja auf 5001 läuft.
Kennt ihr eine Möglichkeit, über http da drauf zu kommen? Port 80 geht nicht, der ist nämlich schon belegt...
Jetzt dachte ich, da sollte doch irgendwie ein lokales "mapping" möglich sein... Vielleicht über den Apache? Indem man ein virtuelles Verzeichnis anlegt, das z.B. auf https://host:443/dsm hört u. dann intern auf https://host:5001 geht?

mkl0815
12.01.2010, 08:48
Ja das sollte gehen. Der Trick ist ein


RewriteEngine On
RewriteRule ^virtdsm(/.*)$ http://192.168.100.1:5000$1 [P]

Allerdings müssen dafür die Module mod_rewrite, mod_proxy und mod_proxy_http im Apache geladen sein.
Die IP muss natürlich angepasst werden. Zugegriffen wird dann via
http(s)://meine-externe-ip/virtdsm/
Das ganze sollte sowohl in der .htaccess als auch in der VHost-Konfig funktionieren.

peez
12.01.2010, 09:03
Super Sache! Probiere ich gleich heute abend. An mod_rewrite habe ich gar nicht gedacht...
Gibts die Module denn im Standard-Apachen?

Wahrscheinlich werde ich das in dem Apachen machen müssen, wo auch die Photostation (die ist ja auf Port 80) läuft... Weißt du ob das der User- oder System-Apache ist?

jahlives
12.01.2010, 15:41
Ja das sollte gehen. Der Trick ist ein


RewriteEngine On
RewriteRule ^virtdsm(/.*)$ http://192.168.100.1:5000$1 [P]
Allerdings müssen dafür die Module mod_rewrite, mod_proxy und mod_proxy_http im Apache geladen sein.
Die IP muss natürlich angepasst werden. Zugegriffen wird dann via
http(s)://meine-externe-ip/virtdsm/
Das ganze sollte sowohl in der .htaccess als auch in der VHost-Konfig funktionieren.
Bist du sicher, dass das klappt? Afaik kannst du mit mod_rewrite nur lokale Adressen transparent für den Client umschreiben. Wenn du auf einen anderen Host wechselst gibt es einen Header für den Client mit der neuen Adresse.
Ich würde eher auf mod_proxy setzen. Der Client ruft den Proxy auf welcher den Request an den DSM weiterreicht und das Resultat an den Client zurücksendet. Der Client merkt nicht, dass sich irgendetwas ändert. Bei der htaccess Lösung bekäme der Client ja den 5000-er Port geliefert und so wie ich den topicstarter verstanden habe wird dieser Port ja blockiert.

mkl0815
12.01.2010, 18:15
gugst Du:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule
Abschnitt: 'proxy|P' (force proxy)

Dafür ist nämlich das "P" nach der Rule da, damit wird die Rule nämlich zum Proxy. Allerdings halt nur, wenn die Proxy-Module geladen sind. Das praktische ist, das man den Proxy_Pass "nur" für die gewünschte URL hat. Man kann also nicht versehentlich einen Relay-Proxy bauen, der mal eben von außen für Böse Dinge genutzt werden kann.

Was Du meinst mit " gibt es einen Header für den Client mit der neuen Adresse" würde ein "R=301,L" oder ein "R=302,L" machen. Der baut einen Redirect (als 301-permanent oder als 302-temporär).

Rewrite kann eine ganze Menge mehr, als "nur URLs umbiegen".

Was evtl. noch passieren könnte ist, das die DSM-Oberfläche mit absoluten URLs arbeitet, also die eigene IP, bzw. den lokalen Host in die Links schreibt. Damit klappt das o.g. beschriebene dann natürlich nicht.
Hier brauchts dann noch die Direktive "ProxyPassReverse" mit dem man die URLs wieder gerade biegen kann.

jahlives
12.01.2010, 19:40
Hei thanks für den Link :)
So genau habe ich mich mit .htaccess gar nie auseinandergesetzt und meine Proxy Anweisungen immer in die Hauptkonfig geschrieben. Mit dem [P] kann ich ja dann direkt aus der htaccess raus einen Proxy Request auslösen und diesen sogar noch bedingt wenn ein bestimmter Host auf dem Apache abgefragt wurde.

Gruss

tobi

peez
12.01.2010, 21:06
So. Ich habs jetzt auf diese beiden Wege versucht.

1: mod_proxy:



LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine On
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /dsm http://127.0.0.1:5000
ProxyPassReverse /dsm http://127.0.0.1:5000



2: mod_rewrite (wie oben beschrieben)


LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine On
RewriteRule ^virtdsm(/.*)$ http://192.168.100.1:5000$1 [P]


Beides einfach am Ende von /usr/syno/apache/conf/httpd.conf-user, weil ich nirgends rausfinden konnte wo genau das DocumentRoot liegt, um da eine .htaccess Datei zu machen...

Wo liegt denn der DocumentRoot? In der httpd.conf-user ist die entspr. Zeile auskommentiert u. wenn ich einfach mal trotzdem versuche, in diesem Verzeichnis die index.html zu ändern, passiert nichts.

Weg Nr. 1 funktioniert so halb - leider scheinen alle URLs im DSM hart kodiert zu sein, weshalb weder die Bilder angezeigt werden noch das Login-Formular an sein Ziel kommt... Aufgrund dessen gehe ich mal davon aus, dass auch wenn Methode Nr. 2 funktioniert, ich nicht zu meinem Ziel komme :-(

jahlives
12.01.2010, 21:20
Die Links im DSM sind afaik relativ, also irgendwas wie src="webman/...."
Probier mal einen zusätzlichen Proxyrewrite für webman


RewriteRule ^webman(.*)$ http://192.168.1.100/webman$1 [P]

peez
12.01.2010, 22:29
Hmm... Habe jetzt das gemacht:



ProxyPass /webman http://127.0.0.1:5000/webman
ProxyPassReverse /webman http://127.0.0.1:5000/webman

ProxyPass /dsm http://127.0.0.1:5000
ProxyPassReverse /dsm http://127.0.0.1:5000

ProxyPass /dsm/webman http://127.0.0.1:5000/webman
ProxyPassReverse /dsm/webman http://127.0.0.1:5000/webman


Leider scheint das doppelte zuweisen von http://127.0.0.1:5000/webman Ärger zu machen (bekomme beim Start von Apache eine entspr. Warnung)

Wenn ich das auf Anhieb richtig sehe ist jetzt noch das Problem, dass manchmal als url "webman/xyz.gif" benutzt wird und dann wiederum "/webman/xyz.gif".

Mit der Rewrite Rule funktionierts überhaupt nicht. Muss die nicht irgendwo innerhalb eines <Directory> Elements definiert werden? Das habe ich schon so ewig nicht mehr gebraucht...

mkl0815
13.01.2010, 07:42
Nach einigem Basteln habe ich es soweit hinbekmmen.
Aber der Reihe nach:

1.) Die "LoadModule" Anweisungen kommen in die "/usr/syno/apache/conf/httpd.conf-user" wobei das evtl. Unnötig ist, denn in der httpd.conf stehen die schon drin.

2.) Die RewriteRules müssen mind. In eine VirtualHost Umgebung, am besten aber in eine Directory oder Location (oder halt die lokale .htaccess)
Ich hab das jetzt unter /usr/syno/etc/httpd-vhost-user.conf (oder so ähnlich, bn gerade unterwegs und kann nicht nachschauen) in den Default-VHost eingetragen.
Leider macht uns die DSM Oberfläche einen Strich durch die Rechnung. Es werden zwar relative URLs verwendet, leider aber mit einem absoluten Pfad. (z.b. /scripts/...js) aber auch relative Pfade ( "webman/...gif"). damit geht ein einfacher Proxy erstmal nur ohne das /virtdsm/ im Pfad.

Was ich genau in die Configs eingetragen habe, reiche ich nach. Es ist schon so ein leichter Krampf auf dem iPhone was ins Forum zu posten, wenn die eingeblendete Tastatur 2/3 des Bildschirms füllt. :-)

mkl0815
13.01.2010, 18:17
So, bin nun wieder zu Hause und hab mal geschaut, was ich da heute Morgen auf die Schnelle verbrochen hab:


# diff -u httpd-vhost.conf-user.orig httpd-vhost.conf-user
--- httpd-vhost.conf-user.orig 2009-11-10 20:38:02.000000000 +0100
+++ httpd-vhost.conf-user 2010-01-13 18:14:03.000000000 +0100
@@ -2,6 +2,17 @@
<VirtualHost *:80>
ServerName *
DocumentRoot /var/services/web
+
+<Directory />
+ Options FollowSymLinks
+ AllowOverride All
+</Directory>
+<Directory /var/services/web>
+
+ RewriteEngine On
+ RewriteRule ^(.*)$ http://192.168.0.1:5000/$1 [P]
+</Directory>
+
</VirtualHost>
<VirtualHost *:80>
ServerName web.home.das-tierhausi.de


Das Ganze ist ein "diff" und die Zeilen mit den "+" am Anfang, sind die neu hinzugekommenen.
Das Original liegt unter: "/usr/syno/etc/httpd-vhost.conf-user"
Wie bereits geschrieben, habe ich auf die Schnelle keine Möglichkeit gefunden, hier noch ein Stückchen Pfad ala "/virtdsm/" dazwischen zu mogeln. Somit wird es schwierig ohne VirtualHosts weitere Webinhalte direkt über Port 80 auszuliefern.

mkl0815
13.01.2010, 18:25
Noch eine andere Möglichkeit:
http://www.no-ip.com/services/managed_dns/free_dynamic_dns.html


Port 80 Redirects
Many residential ISPs Block port 80, No-IP Free DNS enables you to run a webserver on a non-standard port, yet users accessing your site never have to enter a port number. For example http://yourname.no-ip.com/ can redirect to http://yourname.no-ip.com:8833/
Damit würde sogar SSL funktionieren :-)

Lass die DS die No-IP Domain aktuell halten und baue bei denen die Weiterleitung von Port 80 auf Port 5000 oder von 443 auf 5001.
Der Vorteil ist, Du kannst auch weiterhin "normale" Seiten von extern erreichbar machen. Brauchst halt nur nen zusätzlichen DNS-Eintrag.