Zum Inhalt springen

Reverse Proxy unter Debian 11 installieren

Beitragsbild fuer "Reverse Proxy unter Debian 11 installieren"

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:

  1. Kommunikation zwischen Host und Reverse Proxy wird über SSL realisiert
  2. 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ß!