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
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.
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.
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 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.
# systemctl restart apache2.service
Letsencrypt Zertifikat holen
# chgrp www-data /var/lib/letsencrypt
# chmod g+s /var/lib/letsencrypt
# nano letsencryptcert.conf
Der Inhalt der Datei /etc/apache2/conf-available/letsencryptcert.conf
<Directory "/var/lib/letsencrypt/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
# systemctl restart apache2.service
# 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
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_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.
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>
# a2enmod rewrite
# a2enmod headers