Reverse-Proxy hinter einer Firewall/Fritzbox

Was ist ein Reverse-Proxy?
Ein Reverse-Proxy ist ein Server, eine App oder ein Cloud-Dienst, der vor einem oder mehreren Webservern sitzt, um eingehende Client-Anfragen abzufangen und zu prüfen, bevor er sie an den Webserver weiterleitet und anschließend die Antwort des Servers an den Client zurücksendet.

Hier wird das Aufsetzen zwei Apache Webserver hinter einer Firewall beschrieben, ganz konkret hinter einer FritzBox. An der Firewall (FritzBox) können wir Ports zu einem Server öffnen. Wenn wir allerdings zwei Webserver oder mehr hinter der Firewall nützen möchten, brauchen wir einen Reverse-Proxy.

Ausgangssituation.
Wir möchten gerne zwei Domains der Öffentlichkeit oder für eigene bestimmte Zwecke zur Verfügung stellen. Unser Ziel ist im Internet die Domains in Browser aufzurufen, um Zugriff auf unsere internen Webserver zu bekommen.
An der Firewall haben wir nur die Möglichkeit, bestimmte, gleiche Ports für einen Server zu öffnen.

Unter DynDNS Service (z.B. ddnss.de) habe ich zwei Domains mydomain2.ddnss.de und mydomain3.ddnss.de unter meinem Konto, registriert. Ich nenne die hier weiter mydomain2.xx und mydomain3.xx

Punkt
Die entsprechenden Daten wurden in FritzBox eingetragen. Es gibts meistens Platz für nur einen DynDNS Eintrag. Wenn das das gleiche DynDNS Konto ist, werden den Domains die gleiche IP-Adresse zugewiesen.
Zweite Möglichkeit.
Wenn wir eine echte Domain haben und auch den Zugang zu DNS, dann können wir entsprechende CName (Canonical Name Record) Einträge machen. Kurz gesagt in DNS erstellen wir ein CName Eintrag (Subdomain) und das Ziel ist unsere DynDNS Domain.

 

Punkt
Die Ports z.B. 80, 443, 3478, 5349 in der Firewall öffnen. In der Freigabe sehen wir, dass die Port für einen Server geöffnet werden. Für weitere Server können wir nicht die gleiche Ports öffnen

Punkt
Die Daten von z.B. ddnss.de in der Fritzbox eintragen.

 

Punkt
Die Firewall/FritzBox haben wir entsprechend konfiguriert. Wir können jetzt im Internet unsere Domain mydomain2.xx in Browser aufrufen. Die Anfragen gehen an unsere Firewall und dann werden die an 192.168.2.110 weitergeleitet. Auf unserem Server 192.168.2.110 wird ein Apache-Dienst erwartet.
Punkt
Apache und php Module werden installiert. Im Artikel Apache Webserver wird das genauer beschrieben. Ähnliche Beschreibung inkl. Letsencrypt Zertifikat Erstellung finden Sie im Artikel Nextcloud in DNZ.
Im ersten Schritt konfigurieren wir den Apache, um das Zertifikat abzuholen. Ein VirtulHost für die mydomain2.xx existiert noch nicht.  Im zweiten Schritt wird auf dem Apache IP: 192.168.2.110 ein VirtualHost erstellt und aktiviert. Auf dieser Weise kann man die Seite der Domain mydomain2.xx aufrufen. Hier ein kleines Beispiel. So könnte z.B. eine Datei namens mydomain2.xx.conf aussehen.

 

<VirtualHost *:443>
      ServerName mydomain2.xx
      DocumentRoot /var/www/mydomain2/
      Protocols h2 http/1.1
      # log files
      ErrorLog /var/log/apache2/mydomain2.xx-error.log
      CustomLog /var/log/apache2/mydomain2.xx-access.log combined
      SSLEngine On
      SSLCertificateFile /etc/letsencrypt/live/mydomain2.xx/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/mydomain2.xx/privkey.pem
      # HSTS
      <IfModule mod_headers.c>
            Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
      </IfModule>
      <Directory /var/www/mydomain2/>
            Options +FollowSymlinks
            AllowOverride All
            <IfModule mod_dav.c>
                  Dav off
            </IfModule>
            SetEnv HOME /var/www/mydomain2
            SetEnv HTTP_HOME /var/www/mydomain2
       </Directory>
</VirtualHost>

 

Damit das alles funktioniert, müssen wir einiger Apache Module aktivieren und die Zertifikate müssen in den Pfaden existrueren. Schauen Sie bitte unten Letsencrypt Zertifikat holen

 

# a2enmod ssl
# a2enmod rewrite
# a2enmod headers

 

Die Konfigurationsdatei für unsere Domain mydomai2.xx wird aktiviert. Wir wechseln in den Ordner /etc/apache2/sites-available/ in ndem sich die Datei mydomain2.xx.conf befindet und aktivieren wir es, danach starten wir Apache2 neu.

 

# a2ensite mydomain2.xx.conf
# systemctl restart apache2.service

Letsencrypt Zertifikat holen

Punkt
Alle Zertifikate für unsere Domains werden auf dem ersten Apache2 Server abgeholt und das ist der Reverse-Proxy Server mydomain2.xx
Punkt
Die certbot Pakete werden installiert, wenn es noch nicht installiert sind.

 

# apt install certbot python3-certbot-apache

 

Punkt
Nach der Installation erstellen wir einen neuen Ordner für die Let's Encrypt Autorisierung. Die Rechte werden angepasst.

 

# mkdir -p /var/lib/letsencrypt/.well-known
# chgrp www-data /var/lib/letsencrypt
# chmod g+s /var/lib/letsencrypt
Punkt
Wir wechseln in den Ordner /etc/apache2/conf-available/ und erstelle z.B. mit nano eine neue Konfigurationsdatei letsencryptcert.conf. Der Name der Datei kann selbstverständlich auch anders heißen.

 

# cd /etc/apache2/conf-available/
# nano letsencryptcert.conf

 

Der Inhalt der Datei /etc/apache2/conf-available/letsencryptcert.conf

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
   AllowOverride None
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   Require method GET POST OPTIONS
</Directory>
Punkt
Die Konfigurationsdatei wird mit dem folgenden Link aktiviert.

 

# ln -s /etc/apache2/conf-available/letsencryptcert.conf /etc/apache2/conf-enabled/

 

Punkt
Die Apache Konfiguration wird überprüft und der Apache-Dienst neu gestartet.

 

# apachectl configtest
# systemctl restart apache2.service
Punkt
Wir holen uns unsere Let's Encrypt Domains Zertifikate mydomain2.xx und mydomain3.xx

 

# certbot certonly --agree-tos --email info@mydomain2.xx --webroot -w /var/lib/letsencrypt/ -d mydomain2.xx
# certbot certonly --agree-tos --email info@mydomain3.xx --webroot -w /var/lib/letsencrypt/ -d mydomain3.xx


Wenn keine Fehlermeldung angezeigt wird, wurde unseres Let's Encrypt Zertifikat heruntergeladen und befindet sich im Ordner /etc/letsencrypt/live/monoplan2.xx bzw. in /etc/letsencrypt/live/monoplan3.xx

Punkt
Der anderen Domain mydomain3.xx wurde auch die öffentliche IP-Adresse der Firewall/FritzBox zuweisen. Die öffentlichen Anfragen gehen dann zu der FritzBox, von dort werden die weiter an den ersten
Server IP: 192.168.2.110 geleitet. Wir möchten allerdings, dass der zweite Server 192.168.2.111 die Anfragen beantworten soll. Aus diesem Grund erstellen wir auf dem Server IP: 192.168.2.110 einen zweiten VitualHost z.B. mit dem Namen z.B. reverse-proxy.conf

 

<VirtualHost *:443>
    ServerName mydomain3.xx
    ServerAdmin postmaster@mydomain3.xx

    ErrorLog /var/log/apache2/mydomain3.xx_error_log
    CustomLog /var/log/apache2/mydomain3.xx_access_log common

    ProxyPreserveHost On
    ProxyPass / http://192.168.2.111:80/
    ProxyPassReverse / http://192.168.2.111:80/

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/mydomain3.xx/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mydomain3.xx/privkey.pem

</VirtualHost>


Damit das alles funktioniert, müssen wir noch einige Apache Module aktivieren, die Konfigurationsdatei aktivieren und den Apache-Dienst neu starten.

 

# a2enmod proxy
# a2enmod proxy_http
# a2ensite reverse-proxy.conf
# systemctl restart apache2.service


Konfiguration diesen VertualHost sagt uns, dass wir die WEB-Seiten aus dem Internet nur per https:// aufgerufen werden können und dabei die Let's Encrypt Zertifikate der Domain mydomain3.xx genutzt werden. Die Kommunikation zwischen den Server 192.168.2.110 und 192.168.2.111 ist unverschlüsselt und findet per Port 80 statt. Das ist im grundegenommen kein Problem, weil das interne Server sind.
Selbstverständlcih auch hier kann man nach Bedarf verschlüsslte Verbindung einsetzen.

Punkt
Im nächsten Schritt müssen wir auf dem Server 192.168.2.11 für die Domain mydomain3.xx den Dienst Apache und alle benötigte php Module installieren. Danach konfigurieren wir ein VirtualHost z.B. mit dem Namen mydomain3.xx.conf. Der Servername ist hier als mydomain3.xx definiert.

<VirtualHost *:80>
   ServerName mydomain3.xx
   ServerAdmin webmaster@mydomain3.xx
   DocumentRoot /var/www/html/mydomain3.xx
   ErrorLog /var/log/apache2/mydomain3.xx_error_log
   CustomLog /var/log/apache2/mydomain3.xx_access_log common
    <Directory /var/www/html/mydomain3.xx/>
         Order allow,deny
         Allow from all
    </Directory>
</VirtualHost>
Punkt
Nach Bedarf können wir noch einiger Apache-Module aktivieren, z.B.

 

# a2enmod ssl
# a2enmod rewrite
# a2enmod headers