Marvin Esse: Frage zur Reverse Proxy Konfiguration

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

  1. 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.

    --
    Die Krawatte ist das Kopftuch des Westens
    1. 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

      1. 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.

        --
        Die Krawatte ist das Kopftuch des Westens
        1. 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

          1. 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.

            --
            Die Krawatte ist das Kopftuch des Westens
            1. 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

              1. 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.

                --
                Die Krawatte ist das Kopftuch des Westens
                1. 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

                  1. 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.

                    --
                    Die Krawatte ist das Kopftuch des Westens
                    1. 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 Krawatte ist das Kopftuch des Westens
                    2. 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

                      1. 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.

                        --
                        Die Krawatte ist das Kopftuch des Westens
                        1. 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

                          1. 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.

                            --
                            Die Krawatte ist das Kopftuch des Westens
                            1. 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

                              1. 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.

                                --
                                Die Krawatte ist das Kopftuch des Westens