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.

CGNAT WireGuard IPv6 Tunnel

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.