Reverse-Proxy ins eigene LAN trotz CGNAT

Reverse-Proxy ins eigene LAN trotz CGNAT

Bereit für einen Tauchgang in die Welt des Reverse-Proxys? In diesem Beitrag erfährst du, wie du einen Reverse-Proxy nutzt, um trotz CGNAT sicher auf dein LAN zuzugreifen. Wir werden Schritt für Schritt durch die Konfiguration gehen.

Das Problem mit CGNAT (Carrier-Grade Network Address Translation)

Carrier-Grade Network Address Translation macht den direkten Zugriff auf deine lokalen Ressourcen zur Herausforderung. Deine öffentliche IP-Adresse ist dabei mit weiteren Kunden deines Internet-Providers geteilt, was Remote-Zugriff und Hosting zur Geduldsprobe macht: Stell dir dein Heimnetzwerk wie einen Raum in einem Club vor. Zum Club teilen sich viele Leute denselben Eingang. CGNAT ist sozusagen der Türsteher, der sicherstellt, dass alle dieselben „Namensschilder“ tragen, sprich dieselbe öffentliche IP-Adresse nutzen.

Jetzt kommt der Haken: Wenn du von außen auf bestimmte Räume (lokale Dienste) zugreifen möchtest, wird das schwierig, da dein Türsteher nicht wirklich unterscheiden kann, wer zu welchem Raum darf. Die Tür zum Club bleibt zu.

Aber keine Sorge, ein Reverse-Proxy ist wie ein kluger Concierge, der vor der Tür steht, spezielle Anfragen entgegennimmt und sie an die richtigen Räume weiterleitet.

Was ist denn bitte ein Reverse-Proxy?

Hast du schon mal von Reverse-Proxies gehört? Es wäre doch super, wenn du sicher und effizient auf deine lokalen Netzwerkressourcen zugreifen, deine Webanwendungen vor Angriffen schützen und die Geschwindigkeit deiner Websites verbessern könntest – all das dank eines cleveren Helfers. Wenn du dich jetzt fragst, ob ein Reverse-Proxy das alles kann, ist die Antwort schlicht und ergreifend: Ja! Kann er!

Mit einem Reverse-Proxy kannst du die Kontrolle über deinen Datenverkehr übernehmen, Lastenausgleich betreiben und sogar SSL/TLS-Verschlüsselung handhaben. Klingt spannend, oder? Aber das ist noch nicht alles! Er ermöglicht dir, auf deine internen Ressourcen zuzugreifen, ohne von Firewalls geblockt zu werden oder zu viele Türen in dein Netzwerk zu öffnen und bietet dir die Möglichkeit, deine Webanwendungen mit einem zusätzlichen Sicherheitspuffer zu umgeben.

Mein Szenario

Voraussetzungen für die Durchführung

Die folgende Anleitung bezieht sich auf ein Szenario, in dem auf beiden Servern (VPS und Home-Server die Linux-Distribution „Ubuntu“ (genauer: Ubuntu Server) läuft. Auf anderen Systemen ist eventuell eine andere Vorgehensweise nötig.

Wireguard-Tunnel einrichten

Du hast vielleicht schon von VPNs gehört: Um zwei Server sicher miteinander zu verbinden, kannst du ein solches nutzen. Und genau hier kommt WireGuard ins Spiel, ein modernes VPN-Protokoll, das nicht nur leistungsstark, sondern auch einfach zu konfigurieren ist. Auf deinem VPS und Home-Server* musst du dazu in der Kommandozeile einige Befehle eingeben. Das Prozedere lehnt sich an die Vorgehensweise von Andre Jansen an, unterscheidet sich an einigen Stellen (vor allem den iptables) aber davon.

*mein Home-Server für Wireguard und den NGINX Proxy Manager läuft übrigens nicht „bare metal“, sondern selbst in einem Container unter Proxmox

Auf dem VPS und dem Home-Server führst du zunächst folgende Befehle aus, mit denen beide Server erst upgedatet und neugestartet werden und dann diverse nötige Software installiert wird:

sudo apt update -y && sudo apt upgrade -y && sudo shutdown -r now
sudo apt install software-properties-common unzip -y
sudo apt install netfilter-persistent -y
sudo apt install ufw -y
sudo apt install wireguard -y

Mit den folgenden befehlen erstellst du nun auf der VPS und dem Home-Server private Schlüssel für den Wireguard-Tunnel (VPN-Tunnel), die jeweils in der Konfigurations-Datei /etc/wireguard/wg0.conf abgespeichert werden. Zusätzlich wird je System ein öffentlicher Schlüssel erstellt, den du dir notieren oder per Copy&Paste abspeichern musst:

(umask 077 && printf "[Interface]\nPrivateKey= " | sudo tee /etc/wireguard/wg0.conf > /dev/null)

wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

Auf dem VPS editierst du nun die oben genannte Konfigurationsdatei /etc/wireguard/wg0.conf:

sudo nano /etc/wireguard/wg0.conf

Die Datei musst du mit den korrekten Parametern füllen, die auf dein Netzwerk und deine Konfiguration zutreffen:

[Interface]
PrivateKey = <Privaten Schlüssel des VPS hier eingeben>
ListenPort = 55107
Address = 192.168.4.1/32
[Peer]
PublicKey = <Öffentlichen Schlüssel vom Home-Server hier>
AllowedIPs = 192.168.4.2/32

Auf dem Home-Server editierst du auch mit folgendem Befehl die Konfigurationsdatei:

sudo nano /etc/wireguard/wg0.conf

Die Datei musst du ebenfalls mit den korrekten Parametern füllen:

[Interface]
PrivateKey = <Privater Schlüssel des Home-Servers hier eingeben>
Address = 192.168.4.2/32
[Peer]
PublicKey = <Öffentlichen Schlüssel des VPS hier eingeben>
AllowedIPs = 192.168.4.1/32
Endpoint = <öffentliche IPv4 Adresse des VPS hier eingeben>:55107
PersistentKeepalive = 25

Auf dem VPS musst du nun noch IPv4-Forwarding aktivieren, dazu editierst du folgende Konfigurations-Datei:

sudo nano /etc/sysctl.conf

In diese Datei fügst du unten folgende Zeilen an:

net.ipv4.ip_forward=1

Die so durchgeführten Änderungen aktivierst du nun noch mit folgendem Befehl:

sudo sysctl -p

Auf dem VPS und dem Home-Server kannst du den Wireguard-Tunnel nun starten:

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0

Nun musst du auf dem VPS noch die korrekten iptables setzen, damit der Netzwerkverkehr auch immer das korrekte Ziel erreicht. Ansonsten fließen Anfragen an den VPS nicht automatisch durch den Wireguard-Tunnel an deinen NGINX Proxy Manager. Achtung, du musst die Befehle auf deine Konfiguration anpassen!

sudo iptables -P FORWARD DROP
sudo iptables -A FORWARD -i ens6 -o wg0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i ens6 -o wg0 -p tcp --syn --dport 443 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i ens6 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i wg0 -o ens6 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 80 -j DNAT --to-destination 192.168.4.2
sudo iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 443 -j DNAT --to-destination 192.168.4.2
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.4.2:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.4.2:443
sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 80 -d 192.168.4.2 -j SNAT --to-source 192.168.4.1
sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 443 -d 192.168.4.2 -j SNAT --to-source 192.168.4.1

Dein Wireguard-Interface sollte wg0 heißen. Deine Netzwerkkarte der VPS könnte einen anderen Namen als ens6 haben. Diesen kannst du mit ip -c a herausfinden.

Damit die iptables einen Neustart überleben, musst du sie noch sichern:

sudo apt install netfilter-persistent -y
sudo netfilter-persistent save
sudo systemctl enable netfilter-persistent
sudo apt install iptables-persistent

Den letzten Befehl musst du mit der Eingabetaste zweimal bestätigen.

Falls gewünscht, schalte an deiner VPS noch die Firewall ein. Achte dabei darauf, dass du alle Ports öffnest, die du benötigst, damit du dich nicht aussperrst – darunter z.B. Port 22, falls du ihn für SSH nutzt.

sudo ufw allow 22  
sudo ufw allow 55107
sudo ufw enable
sudo ufw status

Einrichtung des Reverse-Proxys

NGINX Proxy Manager ist eine Software, die dir die Einrichtung von Reverse-Proxies erleichtert und dir dabei eine einfach zu bedienende Web-Oberfläche bietet. Du kannst damit auch SSL-Zertifikate für sichere Verbindungen verwalten. Der Manager überwacht den Datenverkehr, protokolliert Ereignisse und erleichtert die Verwaltung von Benutzern und Teams. Praktisch für Anfänger, da du die Konfigurationsdateien von NGINX nicht direkt bearbeiten musst. Und genau diese Software kommt bei dir nun zum Einsatz.

Das Ganze läuft als Docker-Container, sodass die Einrichtung an sich auch wirklich einfach ist. Da ich meinen Docker-Container auf einem Home-Server einrichten will, der selbst schon ein Container ist, verwende ich für beide das gleiche Netzwerk, über network_mode: host.

Zur Installation muss auf deinem Home-Server Docker installiert sein. Dies kannst du über folgende Befehle erreichen:

sudo apt update && apt upgrade -y
sudo apt install docker.io -y
sudo apt install docker-compose -y

Dann legst du auf deinem Home-Server eine Docker-Konfigurationsdatei an:

cd ~
mkdir npm
cd npm
nano docker-compose.yml

In diese Datei kommt dann folgender Inhalt:

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: host

    environment:
      DISABLE_IPV6: 'true'

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Letztlich musst du deine Konfiguration nur noch starten. Dazu kannst du folgenden Befehl verwenden, der beim ersten Starten möglicherweise etwas Zeit zur Ausführung benötigt:

docker-compose up -d

Über die IP-Adresse deines Home-Servers kannst du unter Port 81 nun die Web-Oberfläche vom NGINX Proxy Manager in einem Browser erreichen:

http://<IP DEINES HOME-SERVERS>:81

Die Standard-Zugangsdaten lauten:

E-Mail Adresse:    admin@example.com
Passwort:          changeme

Und jetzt: Ab mit deinen Diensten ins WWW!

Die Kombination beider Tools ermöglicht es dir, deine selbst gehosteten Anwendungen sicher und effizient ins Netz zu öffnen. Nun bist du also bereit, mit Leichtigkeit Web-Dienste zu erstellen und mithilfe des NGINX Proxy Managers den Datenverkehr aus dem öffentlichen Internet zu deinen Servern zu steuern.

Weiterlesen & Anmerkungen zur Sicherheit

In jedem Fall solltest du dir aber nocheinmal Gedanken zur Sicherheit deiner Web-Dienste machen, wenn du sie permanent ins Netz stellst. Was deinen VPS betrifft, so kannst du unter diesem Link in englischer Sprache noch einmal nachlesen, welche Sicherheitsmaßnahmen du ergreifen kannst. Dein Home-Server sollte dann hinter dem VPS und NGINX Proxy Manager recht sicher sein, getunnelt werden ja nur die HTTP-Ports. Was dann aber deine letztlich selbst gehosteten Web-Dienste betrifft, gibt es keine wirkliche Anleitung zur Absicherung: Am besten, du schaust, wie die Community und die Entwickler zum öffentlichen Hosting stehen. Manche empfehlen, dies gar nicht erst zu tun, andere wiederum schätzen ihre Dienste als deutlich sicherer ein.

Sicher ist es gut, immer auch wieder vom Access List Feature Gebrauch zu machen. Mehr dazu erfährst du in diesem (englischsprachigen) YouTube-Video:

Hier klicken, um den Inhalt von YouTube anzuzeigen.
Erfahre mehr in der Datenschutzerklärung von YouTube.

Happy hosting!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.