Webdienste hinter DS Lite verfügbar machen mit Wireguard
In diesem Tutorial findet ihr eine Schritt-für-Schritt-Tutorial, wie ihr mit Wireguard und Nginx verschiedene Webdienste, wie zum Beispiel eine Webseite, oder einen Nextcloud Server hinter einem DS Lite Anschluss für das Internet verfügbar machen könnt. Dabei wird der externe VPN-Server als Mittler genutzt, um die Dienste zugänglich zu machen. Daten- bzw Verbindungsprotokolle wie ftp, sftp oder ssh funktionieren hier mit dieser vorgestellten Methode nicht. In einem weiteren Beitrag widmen wir uns dann solchen Diensten.
Was ist das Problem bei einem DS-lite Anschluss
Ein DS-Lite-Anschluss (Dual-Stack Lite) ist eine Technologie, die von Internet Service Providern (ISPs) verwendet wird, um die Übergangsphase vom alten IPv4-Protokoll zum neuen IPv6-Protokoll zu erleichtern. Diese Technologie wird vor allem bei privaten Internetanschlüssen eingesetzt, bei denen die ISPs den IPv4-Adressmangel umgehen müssen.
Wie funktioniert DS-Lite?
Bei DS-Lite erhaltetihr eine native IPv6-Adresse für euer Heimnetzwerk. Eure Geräte kommunizieren primär über IPv6. Da das Internet jedoch noch nicht vollständig auf IPv6 umgestellt ist und viele Dienste noch auf IPv4 basieren, benötigen eure Geräte weiterhin Zugriff auf IPv4. Dafür wird bei DS-Lite ein sogenannter „AFTR“ (Address Family Transition Router) verwendet. Dieser Router übernimmt die Übersetzung und leitet den IPv4-Verkehr über eine gemeinsame IPv4-Adresse, die von mehreren Kunden gleichzeitig genutzt wird (Carrier-Grade NAT, CGNAT).
Problem: Keine öffentliche IPv4-Adresse
Das Hauptproblem bei DS-Lite ist, dass ihr keine eigene, öffentliche IPv4-Adresse erhaltet. Stattdessen teilt ihr euch eine IPv4-Adresse mit vielen anderen Kunden eures ISPs. Dies führt zu folgenden Einschränkungen:
- Kein direktes Port Forwarding:
Da ihr keine eigene öffentliche IPv4-Adresse habt, könnt ihr keine eingehenden Verbindungen direkt zu eurem Heimnetzwerk weiterleiten. Das bedeutet, dass ihr keine Server oder Dienste (wie einen Webserver, FTP-Server oder VPN-Server) direkt im Internet verfügbar machen könnt. - Schwierigkeiten bei der Erreichbarkeit:
Da die IPv4-Adresse, die ihr nutzt, nicht exklusiv ist, können keine eingehenden Verbindungen direkt zu eurem Anschluss geroutet werden. Wenn ihr beispielsweise einen Webserver betreiben möchtet, kann niemand von außen auf diesen zugreifen, weil euer Router keinen direkten IPv4-Zugang hat. - CGNAT (Carrier-Grade NAT):
Bei DS-Lite befindet sich dein Heimnetzwerk hinter einem CGNAT, der von eurem ISP verwaltet wird. CGNAT ist eine große NAT-Instanz, die den IPv4-Verkehr von vielen Kunden gleichzeitig verarbeitet. Dies bedeutet, dass alle eingehenden Verbindungen an dieselbe IPv4-Adresse gehen, und es gibt keinen Mechanismus, um sie an euren spezifischen Router weiterzuleiten.
Warum sind Dienste im Internet nicht aussetzbar?
Wenn ihr einen Dienst (wie einen Webserver oder eine VPN-Verbindung) öffentlich zugänglich machen möchtet, muss dieser Dienst über das Internet erreichbar sein. Dafür benötigt ihr eine öffentliche IP-Adresse, die speziell eurem Router zugewiesen ist. Bei DS-Lite ist dies nicht der Fall, da:
- Nur IPv6 öffentlich erreichbar: euer Heimnetzwerk erhält eine öffentlich erreichbare IPv6-Adresse, aber viele Dienste und Nutzer im Internet verwenden noch IPv4 und können daher nicht ohne Weiteres auf euren Dienst zugreifen.
- Eingehende IPv4-Verbindungen sind blockiert: Ohne eine öffentliche IPv4-Adresse können keine Verbindungen von außen über IPv4 zu eurem Netzwerk hergestellt werden. Selbst wenn ein IPv6-Dienst öffentlich erreichbar ist, könnten Nutzer, die nur über IPv4 erreichbar sind, diesen Dienst nicht nutzen.
Wir schauen uns jetzt eine Möglichkeit an, wie ihr trotz DS-Lite Anschluss, eure Dienste dem Internet zugänglich machen könnt!
Voraussetzungen um Dienste hinter DS-Lite Anschlüssen verfügbar zu machen
- VPS mit öffentlicher IPv4-Adresse: Ein externer Server mit einer öffentlichen IPv4-Adresse (z.B. bei Hetzner, Ionos, DigitalOcean).
- Portfreigabe auf dem VPS: Der Wireguard Port 51820 und der Httpsport 443 muss in den Firewalleinstellungen des Servers freigegeben werden.
- Dienst im Heimnetzwerk: Zum Beispiel ein Webserver oder Nextcloud, der über das lokale Netzwerk läuft. Ein ein SSL Zertifikat ist auf dem lokalen Server nicht notwendig. Dieser Dienst muss auch über einen Webserver auf einen Port 80 lauschen.
Schritt 1: Wireguard auf dem öffentlichen Server installieren
Leider können wir WG-Easy aus diesem Tutorial nicht verwenden, da es aus irgendeinem Grund einfach nicht funktionieren will, die Clients vom Host aus zu erreichen, deshalb wählen wir eine andere Installationsmethode, die aber genau so einfach ist. Wir installieren uns den Wireguard Road-Warrior Installer, der uns Wireguard komplett installiert, und auch in der Lage ist, Clients einzurichten. Den Link zum Road Warrior Installer gibts es hier.
Erstellt euch einen Ordner für den Download des Scripts und wechselt in den Ordner:
mkdir ~/wireguard-installer
cd wireguard-installer
Ladet euch den Installer herunter mit:
wget https://git.io/wireguard -O wireguard-install.sh
Ausführen könnt ihr den Installer mit
bash wireguad-install.sh
Die Installation startet, und ihr werdet nach der IP-Adresse gefragt, nehmt natürlich die öffentliche IP Adresse des Servers, meisstens ist das die 1:
Als nächstes werdet ihr nach dem Port gefragt, bestätigt einfach mit Enter um den Standard Wireguard Port zu verwenden 51820:
Als nächstes könnt ihr bereits einen ersten Client einrichten, hier könnt ihr bereits eine Konfiguration für einen Dienst eurer Wahl erstellen und danach den DNS Server für die Namensauflösung festlegen. AdGuard ist hier eine gute Wahl:
Der Wireguard Server wird installiert, und ihr erhaltet zugleich den QR Code für euren ersten Client (z.B für ein Smartphone) und auch eine Konfigurationsdatei, welche im angegebenen Pfad gespeichert wird:
Weitere WireGuard-Clients konfigurieren
Führt den Script einfach erneut aus, und wählt Add Client:
Schritt 2: Heimserver (Dienst) mit WireGuard verbinden
WireGuard auf dem Heimserver installieren
Zuerst müsst ihr natürlich Wireguard auch auf dem Webserver installieren:
Für Debian/Ubuntu:
sudo apt update && sudo apt install wireguard -y
Konfigurationsdatei einrichten
Erstellt eine neue Konfigurationsdatei auf dem Heimserver, die könnt ihr je nach Dienst benennen wie ihr wollt:
sudo nano /etc/wireguard/webserver.conf
Füge den Inhalt der Konfigurationsdatei ein, den ihr vom Wireguard Installer erhalten habt.
Beispiel:
[Interface]
PrivateKey = <Dein_Privatkey>
Address = x.x.x.x/24
[Peer]
PublicKey = <Öffentlicher_Schlüssel_von_wg-easy>
Endpoint = <DEINE_SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Speichert die Datei mit strg+o und beendet mit strg+x
WireGuard starten
Aktiviert und startet den Wireguard-Tunnel. Es reicht wenn ihr den Anfang der Konfigurationsdatei angebt:
sudo wg-quick up webserver
sudo systemctl enable wg-quick@example-webserver
Teste die Verbindung, indem ihr z.B. das Gateway des externen Server anpingt:
ping 10.8.0.1
Habt ihr einen Ping, seid ihr erfolgreich verbunden:
Schritt 3: Nginx als Reverse Proxy auf dem VPN-Server einrichten
Nginx installieren (falls noch nicht geschehen):
sudo apt install nginx -y
Nginx konfigurieren:
Erstelle eine neue Nginx-Konfigurationsdatei für deinen Dienst: sudo nano /etc/nginx/sites-available/dein-dienst
Beispielkonfiguration für einen HTTPS-Proxy:
server {
listen 80;
server_name deine-domain.de;
location / {
proxy_pass http://10.8.0.2:80; # IP des Dienstes im Heimnetzwerk
proxy_set_header Host $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-Proto $scheme;
}
}
Ersetzt deine-domain.de
durch euren Domainnamen und die IP-Adresse 10.8.0.2
durch die IP des Heimservers im VPN-Netzwerk. Diese findet ihr auch in der Client-Konfigurationsdatei.
Nginx aktivieren:
Aktiviert die neue Konfiguration:
sudo ln -s /etc/nginx/sites-available/dein-dienst /etc/nginx/sites-enabled/
Testet die Konfiguration:
sudo nginx -t
Startet Nginx neu:
sudo systemctl restart nginx
Jetzt installieren wir uns noch Certbot, für die Anforderung, und Verwaltung der SSL Zertifikate:
sudo apt install certbot python3-certbot-nginx -y
Danach beantragt ihr ein Zertifikat mit dem Befehl:
sudo certbot --nginx -d deine-domain.de
Ersetzt deine-domain.ch mit eurer tatsächlichen Domain!
Schritt 4: Firewall-Regeln konfigurieren (optional)
Falls erforderlich, könnt ihr mit iptables
sicherstellen, dass der Traffic zwischen mehreren Clients (also einem Webserver, und einem anderem Dienst auf einem anderen Server im Wireguard Netzwerk) nicht möglich ist, das geht mit folgendem Befehl:
iptables -I FORWARD -i wg0 -o wg0 -j REJECT
Das stellt sicher, dass der Traffic zwischen euren Servern unterbunden wird, und die Dienste somit zueinander isoliert sind.
Firewall-Regeln sichern:
Installiert zuerst die das Programm um iptable Konfigurationen zu sichern:
sudo apt-get install iptables-persistent
und speichert die Regel mit:
sudo netfilter-persistent save
Damit bleiben die hinzugefügten Regeln auch nach einem Neustart aktiv.
Schritt 5: Zugriff testen
Dienst aufrufen
Ruft von einem externen Gerät die Domain auf, die auf den Nginx-Server zeigt (https://deine-domain.de
). Der Verkehr sollte nun über den Wireguard-Server an den Heimdienst weitergeleitet werden wobei der Reverse Proxy Config auf dem Wireguard Server die SSL Terminierung vornimmt, und den Traffic über Port 80 an den Client weiterleitet.
Fehlerbehebung
Wenn der Zugriff nicht funktioniert, überprüft die WireGuard-Verbindung (sudo wg show
), oder die Nginx-Logs (/var/log/nginx/error.log
), und eure Firewall-Einstellungen.
Pingt vom Wireguard-Server die Clients an, die müssen auch eine Antwort liefern:
#auf dem Wireguard Server:
ping 10.8.0.2
Fazit
Mit diesem Setup habt ihr einen Webdienst oder einen Webserver, der hinter einem DS-Lite-Anschluss läuft, über das Internet verfügbar gemacht. Das externe VPS fungiert als Brücke und leitet den Verkehr sicher über WireGuard und Nginx an euer Heimnetzwerk weiter.
Danke für dein Tutorial.
Den Wireguard Tunnel zwischen VPS-Server und VPN-Client in auf meinem Homeserver funktioniert. Die Server sind auch pingbar.
Jedoch wenn ich versuche via https://mein-dienst.de darauf zuzugreifen bekommen ich einen 502 Bad-Gateway Fehler.
Das NGINX Log sagt:
2024/10/03 09:03:19 [error] 2385#2385: *7 connect() failed (111: Connection refused) while connecting to upstream, client: [IP], server: mein-dienst.de, request: „GET / HTTP/1.1“, upstream: „http://10.7.0.3:80/“, host: „mein-dienst.de“
2024/10/03 09:03:23 [error] 2385#2385: *9 connect() failed (111: Connection refused) while connecting to upstream, client: [Endpoint-IP], server: mein-dienst.de, request: „GET /index.php/204 HTTP/1.1“, upstream: „http://10.7.0.3:80/index.php/204“, host: „cloud.b0rgis.de“
2024/10/03 09:04:07 [error] 2385#2385: *14 connect() failed (111: Connection refused) while connecting to upstream, client: [Endpoint-IP], server: mein-dienst.de, request: „GET / HTTP/1.1“, upstream: „http://10.7.0.3:80/“, host: „mein-dienst.de“
2024/10/03 09:04:07 [error] 2385#2385: *14 connect() failed (111: Connection refused) while connecting to upstream, client: [Endpoint-IP], server: mein-dienst.de, request: „GET / HTTP/1.1“, upstream: „http://10.7.0.3:80/“, host: „mein-dienst.de“
2024/10/03 09:04:07 [error] 2385#2385: *14 connect() failed (111: Connection refused) while connecting to upstream, client: [Endpoint-IP], server: mein-dienst.de, request: „GET /favicon.ico HTTP/1.1“, upstream: „http://10.7.0.3:80/favicon.ico“, host: „mein-dienst.de“, referrer: „https://mein-dienst.de/“
2024/10/03 09:04:21 [error] 2385#2385: *9 connect() failed (111: Connection refused) while connecting to upstream, client: [Endpoint-IP], server: mein-dienst.de, request: „GET /index.php/204 HTTP/1.1“, upstream: „http://10.7.0.3:80/index.php/204“, host: „cloud.b0rgis.de“
2024/10/03 09:04:57 [error] 2385#2385: *21 connect() failed (111: Connection refused) while connecting to upstream, client: [IP], server: mein-dienst.de, request: „HEAD / HTTP/1.1“, upstream: „http://10.7.0.3:80/“, host: „mein-dienst.de“
Hi!
Tippfehler in der Nginx config?
Die muss auf die exakte Client IP Adresse zeigen.
Wenn der client die IP 10.8.0.2 hat, muss in der nginx Konfiguration unter
`proxy_pass http://10.8.0.2:80`
auch die IP des Clients stehen.
Der Dienst auf dem lokalen Server muss selber dann natürlich auch eine Webserverkonfiguration haben, der auf Port 80 lauscht.
lg
Hi mit dieser Anleitung ist der Tunnel wirklich schnell aufgebaut.
Allerdings habe ich eine Verständnisfrage vom VPS 10.8.0.1 kann der VPN Client 10.8.0.2 und auch die VM Ubuntu Maschine mit 192.168.178.10 erreicht werden mittels Ping. Jedoch kann ich keine anderen VMs oder Drucker im selbigen 192 Netz anpingen. Was muss hier noch gemacht werden? Wenn Ping die Dienste nicht erreicht wird Nginx als Reverse Proxy auf dem VPS bei Hetzner über den Tunnel auch nichts erreichen z.B. Nextcloud. Kannst du mir eine Hilfestellung geben?
Hi, sorry für die späte Antwort, aber besser spät als nie!
Diese Lösung ist nicht dafür gedacht, dass du Drucker oder andere Geräte dann erreichen kannst, diese befinden sich ja nicht im VPN Netzwerk, sondern nur der Client, der sich mit dem VPN Server verbindet.
Damit du deine Drucker und etc erreichen kannst, müsste der VPN Server also auf deinem Router oder auf einem Gerät in deinem Netzwerk laufen, und nicht auf einem externen Host. Dafür ist die Anleitung ja wie bereits erwähnt, ja auch nicht gedacht.
lg Mario