Du bist einer der Internet Kunden welche vom Provider lediglich eine IPv4 CGNAT (Carrier-grade) Adresse zugewiesen bekommen? In deinem Router steht bei IPv4 eine Adresse ähnlich wie diese hier: 100.64.74.132 ? Dann hast du von deinem Provider keine eigene IPv4 Adresse zugewiesen bekommen, sondern teilst dir diese mit anderen Kunden. Was du aber ganz sicherlich bekommen hast ist ein IPv6 Subnetz, welches du frei nutzen kannst.
Info: CGNAT IP Addresse Range: 100.64.0.0/10
Wo liegt das Problem jetzt?
Wenn du als Homelab-Begeisterter jetzt Dienste nach außen zur Verfügung stellen möchtest, sollte man bestenfalls über IPv4 & IPv6 erreichbar sein. Andernfalls besteht die Möglichkeit das ein Zugriff von außen, über das Smartphone und beim Kumpel oder Büro nicht möglich ist. Denkt daran das auch die zugreifende Seite über v4 und/oder v6 verfügen muss.
Doch was tun wenn mein Provider mir keine IPv4 zu weist?
Ich sehe da zwei Möglichkeiten.
1. Die wirklich beste Möglichkeit ist du rufst deinen Provider an und erklärst Ihm das Problem, bettelst, betest und küsst ihm die Füße ob er dir nicht eine IPv4 schalten kann. Wohlmöglich kostet dich das 2-3€ im Monat. Aber ja, das wäre technisch gesehen die beste Möglichkeit. Aber bitte nicht zu viel Hoffnung aufbringen.
2. Du folgst diesem Blogbeitrag weiter und baust dir über einen 1€ (günstigen) vServer eine NAT Bridge auf und leitest über diesen Server jeglichen IPv4 Traffic. Der Zugriff auf dein Homelab erfolgt dann transparent über IPv4 über diesen Server. Der Datenverkehr ist dabei über einen VPN Tunnel verschlüsselt.
HINWEIS: Folge Anleitung ist KEINE 100% Copy & Paste Anleitung – Es gehört noch eigener Gehirnschmalz hinzu.
1. Du brauchst einen Server mit einer erreichbaren IPv4 Adresse
Buche dir bei einem Hoster deiner Wahl den günstigsten vServer den es gibt, denn hohe Leistungen wirst du nicht brauchen. Ein 1€ Server sollte dafür vollkommen ausreichen. Der Server braucht aber folgendes:
- Eine erreichbare eigene IPv4 Adresse (bestenfalls auch IPv6)
- Wenn möglich unlimitierter Traffic (nicht zwingend)
Du kannst diesen Server auch in der Hetzner Cloud buchen – Dann bekommst von mir noch direkt einen 20€ Gutschein als Neukunde dazu.
2. Du brauchst eine VPN Verbindung – Tipp: Wireguard
Du benötigst eine VPN Verbindung zwischen deinem Heimnetz und dem vServer. Diese Verbindung kann entweder direkt mit IPv6 oder auch mit IPv4 (initial von deinem Heimnetz aus) aufgebaut werden. In diesem Tunnel sprichst du allerdings nur IPv4, kannst aber auch da beides nutzen. Hier ein Beispiel:
Server Konfiguration – Wireguard wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = GOBttohzE8bJ2xif1rkrD8sXzz8vz4OfX6E8LXzlJkM=
Table = off
[Peer]
PublicKey = EBTA6WVHGEJvJNZvarW0QKjkdewPNPZwl3iyONsne24=
AllowedIPs = 0.0.0.0/0
Homelab Client Konfiguration – Wireguard wg0.conf
[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = iCiJ1YqFM7ww9wYif7Wd3jgXMH3hx2zdh1usB2e9JUg=
Table = off
[Peer]
PublicKey = TNbTxrw+KeHRQPJzxw85iIr+Va9CYOSsvijSG5vtyVY=
AllowedIPs = 0.0.0.0/0
Endpoint = <ZIEL-IP-SERVER-v4-o-v6>:51820
3. IPTables mit DNAT & SNAT leiten den Datenverkehr durchs VPN
Jetzt kommt der Part wo es magisch wird. Das hier stehenden Beispiel leitet jeglichen Datenverkehr, welcher auf Port 80 und Port 443 (http & https) auf dem Server eintrifft, weiter quer durch den VPN Tunnel und erreicht somit sein Ziel. Das Skript kann natürlich beliebig mit weiteren Ports erweitert werden.
2 Magische IPTables Regeln kümmern sich um das weiterleiten des Datenverkehrs zum Ziel. Die erste erstellt ein Destination NAT auf die Ziel-IP in deinem Homelab. Die zweite definiert ein Source-NAT und verändert die Source IP in die interne WireGuard IP. Damit wird das Routing vereinfacht im Homelab.
#!/bin/bash
echo "###################"
echo "Erlaube IPv4 Forwards"
echo "###################"
sed -i 's/#net\.ipv4\.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf && sysctl -p
echo "###################"
echo "IPTables bereinigen"
echo "###################"
iptables -t nat -F
iptables -F
echo "###################"
echo "Erstelle IPTables INPUT Regeln"
echo "###################"
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 51820 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -P INPUT DROP
echo "###################"
echo "Erstelle IPTables NAT Regeln"
echo "###################"
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dport 80,443 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A POSTROUTING -o wg0 -p tcp -m multiport --dport 80,443 -d 10.0.0.2 -j SNAT --to-source 10.0.0.1
echo "###################"
echo "Erstelle Forward Regeln"
echo "###################"
iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -o wg0 -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Wie man gut erkennen kann, verändert das Script noch ein paar Dinge mehr, welche aber lediglich zur Sicherheit auf dem Server beitragen.
Fazit zu dieser Lösung
Das was hier gezeigt wird, ist lediglich die Spitze des Eisbergs. Diese Lösung kann so auch deutlich erweitert werden und noch Netze hinter dem Wireguard Tunnel erreichen. Dann kommt aber ein kleiner zusätzlicher Routing Part hinzu. Für die Leute die wirklich eine IPv4 Erreichbarkeit haben wollen, aber vom Provider keine bekommen ist das zumindest eine gangbare Lösung.
# | Vorschau | Produkt | Bewertung | Preis | |
---|---|---|---|---|---|
1 | Raspberry Pi 5 8 GB | 92,60 EUR | Bei Amazon ansehen | ||
2 | Raspberry Pi 5 4GB | 66,44 EUR | Bei Amazon ansehen | ||
3 | Raspberry Pi 5 8GB Starter-Kit | 64GB microSD | USB-C 27W Netzteil | Gehäuse mit Lüfter | Micro… | 139,90 EUR | Bei Amazon ansehen |
23. November 2023 um 05:59 Uhr
Moin,
sind das schon nftables oder das alte iptables? gibt nen guide auf github der es zwar auf englisch erklärt, aber immerhin einem paar regeln erklärt wenn man damit das heimnetz erreichen möcht.
https://github.com/mochman/Bypass_CGNAT
gibt da auch automatische scripts, aber nie probiert. mit nem cs2 server läuft das. jedoch is der ping halt nicht so pralle.
23. November 2023 um 06:02 Uhr
nachtrag,
man kann die regeln auch in die wireguard config reinschreiben, dann gäbe es noch sowas wie preup = sysctl -w net.ipv4.ip_forward 1; und predown damit der es wieder entfernt. ein ultimativer blogeintrag zu allen deinen guides mit verlinkung wäre nicht schlecht und handliche iptables erklärung. mir gehts teilweise dabei wie dem traefik maskottchen und guck schräg durch die gegend 🙂
24. November 2023 um 01:47 Uhr
Ein bisschen Gehirnschmalz:
Port 51820 sollte in dem iptables-Regelsatz noch ergänzt werden. Sonst wird das nix mit Wireguard ^^
iptables -A INPUT -i eth0 -p udp –dport 51820 -j ACCEPT
Gruß
24. November 2023 um 17:40 Uhr
Ja logisch. Ich hatte es drin, jetzt auch das Script.
26. November 2023 um 12:25 Uhr
dort fehlt noch ein weiterer “-” bei dport 51820
Grüße
26. November 2023 um 22:21 Uhr
Auch diesen noch hinzugefügt.
24. November 2023 um 22:25 Uhr
Danke für die Anleitung. Bei Hetzner gehts mit ipv4 erst bei 4,xx € los. Habt ihr nen Vorschlag für nen guten “1-Euro-Server”? 🙂
25. November 2023 um 00:06 Uhr
Bei ionos.de gibt es den 1€-Server!
https://www.ionos.de/server/vps
25. November 2023 um 14:53 Uhr
Manchmal gibt es auch welche bei 1Blu.de.
17. Februar 2024 um 17:26 Uhr
Bei 1blu bekomme ich Wireguard aufgrund fehlender Kernel Header nicht zum Laufen (weder Ubuntu noch Debian). Ist wohl ein bekanntes Problem, leider zu spät drauf gestoßen….
18. Februar 2024 um 00:33 Uhr
Das lag wohl an Viturtuozzo, mit Debinan KVM lauft es .
2. April 2024 um 17:36 Uhr
proxmox läuft inkl wireguard..
2. April 2024 um 17:43 Uhr
Bei mir lief es nur mit manuellen
–># <— enfernen der raute in /etc/sysctl.conf bei
…#net\.ipv4\.ip_forward=1…. die fehler meldung tun/tap erledigt
27. Mai 2024 um 10:36 Uhr
Netcup hat durchgängig 1€ und 2€ server im Angebot. 12-monatige Abrechnung und Vertragslaufzeit.
https://www.netcup.de/vserver/vps-mini.php
30. November 2023 um 10:32 Uhr
Hallo zusammen,
danke erstmal für die Anleitung.
Ich habe eine Frage bzgl. der Weiterleitung der realen IP (zwecks fail2ban etc).
Ich habe nun einen VPS als wireguard server, eine VM im lokalen Netz mit dem wireguard client, einen nginxProxyManager im lokalen netz und schluessendlich den Webserver.
Konstellation sieht so aus:
VPS WG-Peer –> NPM –> Webserver
Funktioniert auch alles. Im NPM hab ich entsprechend real_ip-forward regeln hinterlegt und der Webserver versteht auch alles. Ich bekomme beim Zugriff auf de Webserver momentan die lokale IP vom WG-Peer angezeigt.
Ich würde natürlich gerne die reale IP des eigentlichen Zugreifers sehen.
Meine iptable-Regeln auf dem WG-Peer sieht wie folgt aus:
PostUp = iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to-destination :80; iptables -t nat -A POSTROUTING -p tcp –dport 80 -j MASQUERADE
Gibt es da eine Möglichkeit?
30. November 2023 um 10:35 Uhr
Die Kommentar-Funktion blockiert gewisse Zeichenfolgen. Hier nochmal ein Nachtrag:
VPS –> WG-Peer –> NPM –> Webserver
iptable:
PostUp = iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to-destination IP-vom-NPM:80; iptables -t nat -A POSTROUTING -p tcp –dport 80 -j MASQUERADE
3. Dezember 2023 um 16:15 Uhr
Ich weiß nicht ob das gewollt ist. Aber im Skript steht bei beiden wg0.conf beim ListenPort: 51820
4. Dezember 2023 um 10:50 Uhr
Ja, das kann man durchaus so machen.
15. Dezember 2023 um 21:43 Uhr
Und nicht vergessen die iptable rules zu speichern, da sie nach einem reboot wieder weg sind …
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
Dann sind sie nämlich nach einem Neustart auch wieder da.
20. Dezember 2023 um 18:13 Uhr
Hey, wenn man dein Script einfügt für die IP Table rules, kopiert er das erste Minus falsch mit. Da ist einscheinend ein Tippfehler drin:
iptables -A INPUT -i eth0 -p udp “–-“dport 51820 -j ACCEPT.
Es sind zwei unterschiedliche Minus Striche…
21. Dezember 2023 um 08:48 Uhr
Du hast Recht. Ich habs korrigiert. Danke dir.
29. Dezember 2023 um 16:32 Uhr
Danke für die Anleitung, ich kann endlich meine Dienste von Extern erreichbar machen 🙂
Eine Frage habe ich allerdings noch. Jetzt würde ich gerne mittels WG eine Verbindung von meinem Laptop in mein locales Netz aufbauen. Dazu habe ich den Port 51821 geöffnet und an meine pfsense weitergelietet. Dort habe ich ein neuen Tunnel inkl. Interface erstellt (erstmal alles sperangelweit offen, um zu testen) auch in der Firewall habe ich sowohl in Wireguard, WAN und dem WGInterface den Port freigegeben.
Ich kann aber leider vom MacBook keine Verbindung aufbauen. Es passiert nicht mal ein Handschake. Woran könnte das noch liegen?
31. Januar 2024 um 20:54 Uhr
Die IP-Tables Rules leiten nur TCP Verkehr weiter. Wireguard läuft über UDP.
Falls nicht geschehen versuch mal die Regeln auf UDP umzustellen.
4. März 2024 um 08:28 Uhr
Vielen Dank für die verständliche Anleitung. Auch wenn erst einige Hinrwindungen in Wallung kommen mussten, habe ich das Kontrukt erfolgreich aufbauen können.
Ein Problem habe ich: die Verbindung scheint nach einer gewissen “auszusetzen”. Jedenfalls kommt es immer wieder zur Nicht-Erreichbarkeit. Als Abhilfe reicht aus, vom Heimserver einen Ping auf den öffentlichen vServer abzusetzen. Danach steht die Verbindung wieder.
Kann mir jemand einen Tipp geben, wie ich die connection dauerhaft aufrecht erhalten kann?
5. März 2024 um 09:12 Uhr
Der Eintrag “PersistentKeepalive” in der Wireguard config des Clients hat geholfen.
6. April 2024 um 11:26 Uhr
Hallo,
ich habe den wireguard Tunnel bei mir zwischen einem VPS und dem Raspberry Pi einrichten können. Der Tunnel funktioniert. Ich kann auf nginx zugreifen. Zum Testen habe ich nginx aber ohne Docker installiert.
Allerdings würde ich gerne auf Grafana zugreife. Grafana ist auf meinem Raspberry Pi als Docker Container installiert. Daran bin ich leider gescheitert.
Kann mir jemand helfen, wie ich auf den Docker Container über wireguard zugreifen kann?
18. Mai 2024 um 16:11 Uhr
Tolle Lösung,
Aber kann ich mich nicht auch direkt mit dem wireguard auf der fritzbox verbinden?
Das würde den zusätzlichen wireguard Client auf dem heimrechner vermeiden.
26. Mai 2024 um 22:03 Uhr
ja ist Möglich. Ich selbst habe eine UDM-SE hinter der FB (nicht als Exposed Host) und habe die UDM-SE als “VPN-Client” am WireGuard-Server angemeldet… ich komme aber noch nicht auf den lokalen Server… Ping geht auch nicht durch. Von Intern kann ich aber das NIC des VPN-Servers erreichen. ich tüftle noch etwas herum…
5. Juli 2024 um 12:23 Uhr
Hi, ist es auch möglich alle Ports direkt auf das Wireguard Interface zu senden und als Wireguard Endpunkt eine Opnsense zu haben? Also möchte 2 öffentliche IPv4 Adressen zu Hause nutzen über Opnsense?
6. Juli 2024 um 00:43 Uhr
Hello, ich probierte das ganze mit Tailscale aus und möchte darüber auf einen Minecraftserver zugreifen.
leider scheint bei mir irgendwas nicht zu funktionieren, da ich den server nicht erreiche.
Ich benutze als einstieg einen Raspberry.
Von meinem Laptop kann ich den MC-Server über Tailscale erreichen.
Hat jemand Tipps für mich, woran es liegen könnte?