Frage zur Reverse Proxy Konfiguration
Marvin Esse
- https
- webserver
0 TS0 Marvin Esse0 TS0 Marvin Esse0 TS
Hallo,
ein interner Apache-Webserver verwendet leider überall absolute URLs, wie beispielsweise <img src="/inhalt/images/bild1.jpg">
Eventuell kommt erschwerend hinzu, dass intern kein vollständiger FQDN verwendet wird. Also z.B. http://intern/inhalt/index.php
Wie muss ich den Reverse Proxy konfigurieren, damit der Aufruf funktioniert?
Es ist das erste Mal, dass ich einen bestehenden internen Server von außen erreichbar machen muss. Daher sind meine Kenntnisse hier noch mehr als bescheiden.
LG Marvin
Hello,
ein interner Apache-Webserver verwendet leider überall absolute URLs, wie beispielsweise <img src="/inhalt/images/bild1.jpg">
Eventuell kommt erschwerend hinzu, dass intern kein vollständiger FQDN verwendet wird. Also z.B. http://intern/inhalt/index.php
also wird "intern" aufgelöst auf den Webserver?
Ping das mal bitte.
Wie ist der Webserver eingerichet?
( ) Virtual Hosts?
( ) Single Host?
[ ] Namebased?
[ ] IP-based?
Liebe Grüße
Tom S.
Hallo Tom,
das "intern" wird natürlich intern aufgelöst. Das läuft über einen internen DNS-Server. Ein Ping liefert die lokale IP-Adresse des Servers. (10.101.22.32)
Der Server ist als Virtual Host, Name-based eingerichtet.
LG Marvin
Hello,
das "intern" wird natürlich intern aufgelöst. Das läuft über einen internen DNS-Server. Ein Ping liefert die lokale IP-Adresse des Servers. (10.101.22.32)
Der Server ist als Virtual Host, Name-based eingerichtet.
Also steht in den Virt-Host-Direktiven ServerName intern
drin?
Ich bin mir jetzt nicht sicher, was Du mit einem Reverse-Proxy anfangen willst? Wie ist denn eure Netz-Architektur? Mal doch bitte mal ein Bild.
Habt Ihr eine DMZ (für den Reverse Proxy) und steht der Webserver im internen Bereich, der von außen nicht erreichbar ist? Der Name intern
und das 10er Netz lassen ja darauf schließen, dass eure IT-Landschaft etwas größer ist.
Liebe Grüße
Tom S.
Ja , bei ServerName steht 'intern' drin. Genauer: intern:80
Der Reverse Proxy soll den internen Server extern erreichbar machen. Der interne Server hat ja eine interne IP und interne Domain. Der Reverse Proxy steht in der DMZ, hat somit auch eine öffentliche IP und hat eine eigene Domain (A-Record auf einer Subdomain).
IT-Landschaft, groß/klein ist wahrscheinlich Ansichtssache. 😉 Ich würd sagen: noch überschaubar.
Was das Bildchen betrifft:
Outside/Internet <--> Firewall <--> Reverse Proxy/DMZ(https/443) <--> Firewall <--> intern/Inside(http:80)
Der Reverse Proxy bedient bereits 2 andere Domains bzw. interne Webserver, die aber wohl sauberer (nur mit relativen Pfadangaben) programmiert sind und daher keine Probleme beim Aufruf/Weiterleiten erzeugen.
LG Marvin
Hello,
Ja , bei ServerName steht 'intern' drin. Genauer: intern:80
dann sollte es genügen, auf dem Proxy das Modul zu enablen, einen üblichen Virtual-Host für die (externe Domain):443
einzurichten und die drei Zeilen
# ProxyPreserveHost On
ProxyPass / http://intern:80/
ProxyPassReverse / http://intern:80/
zusätzlich einzufügen.
Alle anderen Aufgaben sollten die Router und der DNS übernehmen.
Die auskommentierte Zeile aktivieren würde dazu führen, dass anstelle von "intern" als Hostname der Hostname aus dem externen Request weitergereicht werden würde. Das ist ganz praktisch, wenn man auf dem internen Webserver unterscheiden will, woher der Request nun kommt (innen oder außen). Du könntest dann auf dem internen Webserver dafür ein ServerAlias externe_domain
einrichten, was sich dann über das Environment im aktiven Backend abfragen ließe.
Siehe auch Apache-Manual Übersicht Proxy und Direktiven.
Liebe Grüße
Tom S.
Leider reicht das offenbar nicht, denn auch nach dem Tutorial hier: Apachetutor - Reverse Proxy
muss es fehlschlagen.
Dort steht: <a href="/otherfile.html">This link will be resolved by the browser to http://www.example.com/otherfile.html, which is incorrect.</a>
Irgendwie müssen diese Links umgebaut werden, aber wie?
LG Marvin
Hello,
Leider reicht das offenbar nicht, denn auch nach dem Tutorial hier: Apachetutor - Reverse Proxy
muss es fehlschlagen.
Dort steht: <a href="/otherfile.html">This link will be resolved by the browser to http://www.example.com/otherfile.html, which is incorrect.</a>
Irgendwie müssen diese Links umgebaut werden, aber wie?
Genau das macht doch der Reverse-Proxy für Dich.
Hast Du es ausprobiert?
Liebe Grüße
Tom S.
Natürlich habe ich es schon ausprobiert.
Die Konfiguration sieht so aus:
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /intern http://10.101.22.32/intern/
Ich hatte es auch schon (zusätzlich) damit probiert:
ProxyHTMLEnable On
ProxyHTMLURLMap /intern/ /
Es hat aber keine Auswirkung... Das Bild wird nicht angezeigt. <img src="/intern/images/01.jpg">
Bei den Eigenschaften des Bildes (Firefox: Seiteninformationen / Medien) wird angezeigt: https://externedomain.de/intern/images/01.jpg
Richtig angezeigt wird das Bild, wenn das Bild relativ adressiert werden würde: <img src="images/01.jpg">
LG Marvin
Hello,
Die Konfiguration sieht so aus:
ProxyPreserveHost On ProxyRequests Off ProxyPass /intern http://10.101.22.32/intern/
Ich hatte es auch schon (zusätzlich) damit probiert:
ProxyHTMLEnable On ProxyHTMLURLMap /intern/ /
Warum hast Du es denn nicht genau so übernommen, wie ich es Dir geschrieben hatte?
Mit deiner Kinfiguration dort oben hast Du alles vergurkt.
<VirtualHost *:443>
ServerName externe_domain.de
ServerAlias www.externe_domain.de
# ProxyPreserveHost On
# ProxyRequests Off
ProxyPass / http://intern:80/
ProxyPassReverse / http://intern:80/
### Angaben für Zertifikate etc
# ...
</VirtualHost>
Im DNS für eurer Netz darf/muss es externe_domain.de
nur einmal geben auf dem Proxy und intern
nur einmal auf dem internen Webserver. Ggf. muss im Routing der Rückweg aus der DMZ nach draußen noch separat angegeben werden. Das kann ich natürlich nicht sehen, was Ihr da konfiguriert habt.
Wenn das dann funktioniert, können wir uns nochmal um ProxyPreserveHost On
kümmern. Das lass erstmal ausgeschaltet.
Dass der Proxy nach dem Konfigurieren nochmal neu gestartet bzw. reloaded werden muss, ist klar, oder?
Liebe Grüße
Tom S.
Hello,
mal ganz generell die Frage:
kannst Du den internen Webserver überhaupt von innen mit einem Browser erreichen?
Wenn im DNS eine unvollständige Domainbezeichnung angegeben wird, wird die zwar bei der DNS-Abfrage ordnungsgemäß aufgelöst, nur die Browser machen das nicht mit.
Da müsste die Domain schon mindestens web.lan
heißen oder eben so ähnlich, also mindestens einen Punkt enthalten. Sonst machen das die Browser nicht mit.
Da musst Du wohl noch mal an die Konfigurationen der HTTP-Server ran und ans DNS auch.
Theoretisch müsste es von außen aber gehen, da der Apache den unvollständigen Domainnamen eigentlich mitmacht und die Browser außen ja die externe_domain.de
vorgegaukelt bekommen vom ReverseProxy.
Liebe Grüße
Tom S.
Die Konfiguration hatte halt bei den anderen beiden (Sub)Domains geklappt und daher hatte ich die übernommen und lediglich angepasst.
Mit Deiner Konfiguration funktionierte noch weniger 😟 Wenn ich jetzt eine Unterseite aufrufen will: https://externedomain.de/intern/test.html wird sofort umgeleitet auf https://intern/index.php
Nachdem ich wieder ProxyPerserveHost auf On gesetzt habe, sieht es jetzt viel besser aus. Der Aufruf der Testseite funktioniert jetzt und auch die Seite selber.
Aber... Mit meiner Konfiguration wollte ich auch erreichen, dass bei der Adresse https://externedomain.de/ der lokale Inhalt des Reverse Proxy angezeigt wird und nur bei https://externedomain/intern/ soll der lokale Inhalt vom internen Server http://intern/extranet/ angezeigt werden.
LG Marvin
Hello,
grrr
Bring bitte nicht alles durcheinander. Ein Schritt nach dem anderen!
Du solltest bitte aus dem internen Netz einen Request auf den internen Websewrver durchführen und fetstellen, ob das funktioniert. Mit dem verkürzten Namen füe "ServerName intern" geht das aber nicht, weil das die BROWSER nicht mitmachen. Die wollen mindestens einen Punkt im Domainnamen haben!
Bitte korrigiere alseo den Domainname des internen Webservers auf irgendwas mit Punkt und unschädlicher TLD. Mein Vorschlag dafür war "web.lan". Dann trage diesen Namen bitte im DNS ein mit der dazugehörigen IP des internen Webservers.
Wenn nun auch der Proxy aka ReverseProxy im DNS bekannt ist und von außen erreichbar, dann richte ihn so ein, wie ich Dir das gepostet habe. Konfiguriere die Routen in den Routern links und rechts von der DMZ! Von diesem Moment an sollte der interne webserver von innen über http://web.lan/ erreichbar sein, der Proxy über die externe Domain. Die sollte dann aber schon ihre Daten vom internen Webserver beziehen. Der Reverse-Proxy schreibt die URLs (Domainanteile) automatisch in beide Richtungen.
Wenn das funktioniert unterhalten wir uns über ProxyPreserveHost und über ProxyPass sowie multiple Domainnames für unterschiedliche Inhalte von Aktiven Webservern (als welchen mit Scripting).
Liebe Grüße
Tom S.
Du solltest bitte aus dem internen Netz einen Request auf den internen Websewrver durchführen und fetstellen, ob das funktioniert. Mit dem verkürzten Namen füe "ServerName intern" geht das aber nicht, weil das die BROWSER nicht mitmachen. Die wollen mindestens einen Punkt im Domainnamen haben!
Aus dem internen Netz funktioniert der Zugriff auf den internen Webserver mit diesem verkürzten Servernamen seit mehr als 17 Jahren! Die Browser (Firefox, Internet Explorer und Chrome) sowie auch die Betriebssysteme (WinXP, Win2000, WinMobile, Win7, Win10, Linux, IOS) haben auch nie gemeckert.
Bitte korrigiere alseo den Domainname des internen Webservers auf irgendwas mit Punkt und unschädlicher TLD. Mein Vorschlag dafür war "web.lan". Dann trage diesen Namen bitte im DNS ein mit der dazugehörigen IP des internen Webservers.
Ich werde an dem seit Jahren funktionierenden (wenn auch zugegeben unglücklichen Konstrukt) etwas ändern.
Wenn nun auch der Proxy aka ReverseProxy im DNS bekannt ist und von außen erreichbar, dann richte ihn so ein, wie ich Dir das gepostet habe. Konfiguriere die Routen in den Routern links und rechts von der DMZ!
Auch der Proxy ist bekannt und von außen erreichbar. Und der funktioniert erst seit ich die Konfiguration von Dir PLUS ProxyPerserveHost auf On gesetzt habe.
Wenn das funktioniert unterhalten wir uns über ProxyPreserveHost und über ProxyPass sowie multiple Domainnames für unterschiedliche Inhalte von Aktiven Webservern (als welchen mit Scripting).
Ist es möglich, dass der Proxy anderen Inhalt zeigt, abhängig vom angegebenen Unterverzeichnis? Also bei https://externedomain.de etwas anderes zeigt als bei https://externedomain.de/geheim Er soll nur bei Angabe des Verzeichnisses als Reverse Proxy den Inhalt des internen Webservers zeigen.
Wie könnte ich noch nur Unbekannten schon den Zugriff von außen erschweren, wobei sich die gewünschten aber weder per VPN anmelden sollen noch einer festen IP zugeordnet werden können.
An dieser Stelle aber einen großen Dank für Deine Hilfsbereitschaft und Geduld.
LG Marvin
Hello,
Ist es möglich, dass der Proxy anderen Inhalt zeigt, abhängig vom angegebenen Unterverzeichnis? Also bei https://externedomain.de etwas anderes zeigt als bei https://externedomain.de/geheim Er soll nur bei Angabe des Verzeichnisses als Reverse Proxy den Inhalt des internen Webservers zeigen.
Es geht ein ganze Menge.
Man kann auch den Rewrite-Mode hinzunehmen auf dem Gateway/ReverseProxy
Du kannst auch Verzeichnisbäume ausnehmen vom Reverse-Proxy-Dienst und sie direkt vom Proxy-Webserver holen.
Zunächst solltest Du aber genau formulieren, was wo liegt und was von wo aus mittels welches Requests erreicht werden soll, aber auch welche Ressourcen ausgenommen werden müssen.
Was ich bisher nicht hinbekommen habe, sind die Substitutes, also In den Headern oder im Requestbody etwas zu ändern.
Wie könnte ich noch nur Unbekannten schon den Zugriff von außen erschweren, wobei sich die gewünschten aber weder per VPN anmelden sollen noch einer festen IP zugeordnet werden können.
Diesen Satz verstehe ich nicht wirklich aber ich rate mal ins Blaue: mit Tokens (Cookies)?
Irgendwie müsstest Du die User wiedererkennbar machen. Aber das käme dann schon einem vorgeschalteten Ticketsystem gleich.
An dieser Stelle aber einen großen Dank für Deine Hilfsbereitschaft und Geduld.
Du kannst mir am besten damit danken, wenn Du das 17-Jahre-Geheimnis mit dem Kurznamen mit mir zusammen lüftest. Das bekomme ich einfach nicht nachgestellt, weder in der virtuellen Umgebung, noch in der realen. Das Geheimnis muss mMn im DNS stecken. Vielleicht hat hier noch jemand eine Idee?
Liebe Grüße
Tom S.
Du kannst auch Verzeichnisbäume ausnehmen vom Reverse-Proxy-Dienst und sie direkt vom Proxy-Webserver holen.
Das klingt gut, genau das möchte ich ja...
Zunächst solltest Du aber genau formulieren, was wo liegt und was von wo aus mittels welches Requests erreicht werden soll, aber auch welche Ressourcen ausgenommen werden müssen.
Der anzuzeigende Content auf dem internen Server liegt unter http://intern/neu Der Reverse-Proxy sollte diesen Bereich nur dann anzeigen, wenn https://externedomain.de/geheim aufgerufen wird. In allen anderen Fällen soll der Content direkt vom Proxy geholt werden.
Wie könnte ich noch nur Unbekannten schon den Zugriff von außen erschweren, wobei sich die gewünschten aber weder per VPN anmelden sollen noch einer festen IP zugeordnet werden können.
Diesen Satz verstehe ich nicht wirklich aber ich rate mal ins Blaue: mit Tokens (Cookies)?
Irgendwie müsstest Du die User wiedererkennbar machen. Aber das käme dann schon einem vorgeschalteten Ticketsystem gleich.
Der interne Server wird zukünftig vom Internet aus erreichbar sein. Für den gewünschten Nutzerkreis soll der Zugriff möglichst einfach sein, für alle anderen möglichst schwer. Ohne mit Zertifikaten und zusätzlichen Logins arbeiten zu müssen, dachte ich das Verzeichnis zu verstecken. Der Zugriff also nur Personen zu ermöglichen, die die URL kennen. Mir ist schon klar, dass die URL weitergegeben werden könnte, aber das ist im Moment zu vernachlässigen.
An dieser Stelle aber einen großen Dank für Deine Hilfsbereitschaft und Geduld.
Du kannst mir am besten damit danken, wenn Du das 17-Jahre-Geheimnis mit dem Kurznamen mit mir zusammen lüftest. Das bekomme ich einfach nicht nachgestellt, weder in der virtuellen Umgebung, noch in der realen. Das Geheimnis muss mMn im DNS stecken. Vielleicht hat hier noch jemand eine Idee?
Auf dem DNS-Server sind Forward-Lookupzonen eingerichtet worden. Eine z.B. heißt firma.local. Dort ist ein A-Eintrag mit dem Namen 'intern' und seiner IP-Adresse angelegt. Auf dem Server (und Clients) ist die Netzwerkschnittstelle so konfiguriert, dass firma.local automatisch als DNS-Suffix angehängt wird. Wenn ich einen Ping auf intern absetze bekomme ich die Antwort von intern.firma.local. Ich hoffe, das hilft Dir weiter.
LG Marvin
Hello,
Du kannst auch Verzeichnisbäume ausnehmen vom Reverse-Proxy-Dienst und sie direkt vom Proxy-Webserver holen.
Das klingt gut, genau das möchte ich ja...
Nur als kurzes Beispiel:
ProxyPass /index.php !
ProxyPass /sofortantwort/ !
das würde dazu führen, dass die index.php nicht vom Intern-Webserver geholt werden würde, sondern vom GW-Server. Und alle Ressourcen, deren Path mit /sofortantwort/ beginnt, würden ebenfalls nicht (!) woanders gesucht werden.
Man kann auch mit <files>, <directory>, usw. Behälter bauen, in denen dann die Proxy-Direktiven untergebracht werden. Kommt immer darauf an, was sich zuerst auswirkt.
Der anzuzeigende Content auf dem internen Server liegt unter http://intern/neu Der Reverse-Proxy sollte diesen Bereich nur dann anzeigen, wenn https://externedomain.de/geheim aufgerufen wird. In allen anderen Fällen soll der Content direkt vom Proxy geholt werden.
Das Mappen auf ein anderes Verzeichnis sollte mit
ProxyPassMatch /(geheim)/ http://intern/neu/?$1 ## Statt des 'intern' ggf. die IP nutzen.
funktionieren. Alles was jetzt als
externe_domain.de/geheim/blabla
requestet wird, sollte auf dem internen Webserver mit dem Request
externe_domain.de/neu/blabla
ankommen, vorausgesetzt, Du hat auf dem internen WebServer einen ServerAlias "externe_domain.de" eingerichet. Sonst kann sder Request dort nicht zugeordnet werden und würde an den Default zurückfallen.
Das war vielleicht gestern auch noch ein Restproblem bei Dir.
Wie könnte ich noch nur Unbekannten schon den Zugriff von außen erschweren, wobei sich die gewünschten aber weder per VPN anmelden sollen noch einer festen IP zugeordnet werden können.
Diesen Satz verstehe ich nicht wirklich aber ich rate mal ins Blaue: mit Tokens (Cookies)?
Irgendwie müsstest Du die User wiedererkennbar machen. Aber das käme dann schon einem vorgeschalteten Ticketsystem gleich.Der interne Server wird zukünftig vom Internet aus erreichbar sein. Für den gewünschten Nutzerkreis soll der Zugriff möglichst einfach sein, für alle anderen möglichst schwer. Ohne mit Zertifikaten und zusätzlichen Logins arbeiten zu müssen, dachte ich das Verzeichnis zu verstecken. Der Zugriff also nur Personen zu ermöglichen, die die URL kennen. Mir ist schon klar, dass die URL weitergegeben werden könnte, aber das ist im Moment zu vernachlässigen.
Auf dem DNS-Server sind Forward-Lookupzonen eingerichtet worden. Eine z.B. heißt firma.local. Dort ist ein A-Eintrag mit dem Namen 'intern' und seiner IP-Adresse angelegt. Auf dem Server (und Clients) ist die Netzwerkschnittstelle so konfiguriert, dass firma.local automatisch als DNS-Suffix angehängt wird. Wenn ich einen Ping auf intern absetze bekomme ich die Antwort von intern.firma.local. Ich hoffe, das hilft Dir weiter.
Ja, dann lag ich mit meiner Vermutung schon richtig, habe aber wahrscheinlich in meinem virtuellen Netz noch einen Punkt (am Ende) vergessen, oder sonstwas falsch gemacht. Ohne Bind (DNS) und DHCP lässt ich das nicht nachstellen. Darum hat es in der realen Umgebung auch nicht funktioniert.
Liebe Grüße
Tom S.