Herzlich willkommen zu diesem Tutorial. Hier zeige ich dir, wie du einen eigenen Reverse Proxy Server mittels NGINX unter Debian 11 installieren kannst.
Installation der Voraussetzungen
Anfangs müssen sudo und iptables sowie alle relevanten NGINX und Certbot Pakete installiert werden. Außerdem aktualisieren wir die Paketquellen des Debian Servers und installieren alle anstehende Updates.
apt-get update apt-get upgrade apt-get install nginx certbot python3-certbot-nginx iptables sudo -y
Funktionsweise
Ein Reverse Proxy Server nimmt als zentrales System alle Anfragen an und verteilt diese je nach Konfiguration an die entsprechenden Server. Daraus ergeben sich zwei Vorteile: zum einen können mehrere Systeme hinter einer einzigen öffentlichen IP-Adresse über entsprechende Domains oder Subdomains erreicht werden, zum anderen hat man durch die zentrale Verwaltung von SSL-Zertifikaten weniger Konfigurations- bzw. Verwaltungsaufwand.
Im obenstehendes Beispiel wird ein Webrequest an api.unknownworkspace.de, über die öffentliche IP-Adresse (in meinem Fall mittels DynDNS gesteuert, da ich keine statische IP-Adresse besitze) an den Reverse Proxy weitergeleitet. Dieser leitet die Anfrage an den zuständigen Server weiter. Identifiziert wird der Request über die Subdomain bzw. Domain.
Konfiguration von Nginx
Zunächst wird ein zu steuernder Host angelegt. Dabei unterscheide ich zwischen zwei Konfigurationen:
- Kommunikation zwischen Host und Reverse Proxy wird über SSL realisiert
- Kommunikation zwischen Host und Reverse Proxy wird ohne SSL realisiert
In beiden Fällen wird die Verbindung zwischen Client und Reverse Proxy immer über HTTPS (SSL) realisiert. Sollte eine Webseite über HTTP aufgerufen werden, wird die Anfrage automatisch auf SSL umgeleitet, unabhängig ob der Reverse Proxy Server und der Host Server verschlüsselt kommunizieren. Wenn du die Verbindung zwischen Host und Reverse Proxy trotzdem über SSL realisieren möchtest, kannst du dir folgende Anleitung ansehen.
vi /etc/nginx/sites-enabled/subdomain.domain.tld
Verbindung zwischen Reverse Proxy und Host unverschlüsselt:
server { # Domain der zugreifenden URL. server_name example.unknownworkspace.de; listen 80; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; # Weiterleitung des Requests an Server-IP. proxy_pass http://10.10.2.98; } }
Verbindung zwischen Reverse Proxy und Host verschlüsselt:
server { # Domain der zugreifenden URL. server_name example2.unknownworkspace.de; listen 443; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; # Weiterleitung des Requests an Server-IP. proxy_pass https://10.10.2.99; # Zertifikat der Stammzertifizierungsstelle welche das Zertifikat für # example2.unknownworkspace.de signiert hat. proxy_ssl_trusted_certificate /etc/nginx/ssl/ca.crt; } }
Bei verschlüsselten Verbindungen muss das Zertifikat der Stammzertifizierungsstelle, welche das veröffentlichte Serverzertifikat des Servers auf welchen zugegriffen werden soll, signiert hat, unter /etc/nginx/ssl/ca.crt abgelegt werden.
Konfiguration von Certbot um Lets Encrypt Zertifikate auszustellen bzw. zu aktualisieren
Certbot ist im allgemeinen für die SSL Konfiguration der angelegten Site in Nginx, der auszustellenden Zertifikate und der Aktualisierung der Zertifikate erforderlich. Das ganze kann auch ohne Certbot realisiert werden. Certbot vereinfacht diesen Prozess.
Um ein kostenloses Let’s Encrypt Zertifikat für unseren Server durch Certbot erstellen zu lassen, muss folgender Befehl verwendet werden.
sudo certbot --nginx
Nachfolgend wird, wenn mehrere Sites konfiguriert wurden, abgefragt, welche Site mit einem SSL Zertifikat versehen werden soll. Gib dazu einfach die entsprechende Nummer ein. Außerdem wird abgefragt, ob HTTP Traffic von außen auf HTTPS umgeleitet werden soll. Hier wählst du entsprechend “Yes”. Nachfolgend sollte die Konfiguration einer zuvor angelegten Site wie folgt aussehen:
server { server_name example.unknownworkspace.de; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://10.10.2.98; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.unknownworkspace.de/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.unknownworkspace.de/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = example.unknownworkspace.de) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name example.unknownworkspace.de; return 404; # managed by Certbot }
Anschließend musst du die Nginx Instanz neu laden:
systemctl nginx reload
Konfiguration Firewall
Folgende Firewall Regeln wende ich für den Betrieb des Servers an:
# Konfiguration aller Routen, Traffic zu akzeptieren sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT # IPTables leeren sudo iptables -F # Akzeptieren von SSH Verbindungen sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # Akzeptieren von Web Verbindungen # HTTP sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # HTTPS sudo iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT # Akzeptieren von bereits aufgebauten Verbindungen sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Konfiguration der INPUT Route, Traffic zu blockieren sudo iptables -P INPUT DROP
Zum speichern der Firewall-Regeln kannst du iptables-persistent installieren. Während der Installation muss der Dialog „Save current IPv4 rules“ und „Save current IPv6 Rules“ mit Yes bestätigt werden:
apt-get install iptables-persistent
Schlusswort
Herzlichen Glückwunsch, du hast erfolgreich einen Reverse Proxy Server mit NGINX erstellt. Zum testen, verbinde dich auf deinen Webserver mit deiner Domain. Zum Beispiel: example.unknownworkspace.de. Du wirst feststellen das dich der Server auf https://example.unknownworkspace.de umleitet und auf den Server welcher in der Konfiguration angegeben ist weitergeleitet wird.
Vielen Dank für das lesen und viel Spaß!