Ein ehrlicher Erfahrungsbericht mit kompletter Schritt-für-Schritt-Anleitung
🎬 Kapitel 1: Nur ein VPN, was soll schon schiefgehen?
Ich wollte es einfach.
Nur ein VPN.
Kein Cloud-Zeug. Kein Abo. Kein “Managed Service”.
Nur ich, mein MacBook, mein Heimserver – und eine verdammt sichere Verbindung dazwischen.
Was folgte?
Handshakes, die nicht kommen.
Pakete, die im Nirvana verschwinden.
Firewalls, die mich auslachen.
Aber hey:
Am Ende lief alles – stabil, sicher, und mit massivem Lerneffekt.
Hier ist mein Weg. Vielleicht hilft er dir.
🧭 Kapitel 2: Die Architektur – mit DDNS, klar
Zuhause läuft ein Mac Mini mit Ubuntu Server.
Ich habe zwar eine feste öffentliche IP – aber um flexibel zu bleiben, nutze ich trotzdem DDNS via No-IP.
Mein Setup:
- Server: Ubuntu auf Mac Mini
- DynDNS:
deinedomain.ddns.net(über No-IP) - Client: macOS mit WireGuard App
- VPN-Netz:
10.10.0.0/24 - Port: UDP
51888
➡️ DynDNS sorgt dafür, dass ich meinen Heimserver jederzeit unter deinedomain.ddns.net erreiche – selbst wenn sich die öffentliche IP ändert.
🧩 Kapitel 3: Die Stolpersteine – jeder ein Lehrstück
❌ Kein Handshake
Der Client schickt brav Pakete.
Der Server lauscht.
Aber nix passiert.
🔍 Diagnose: Ich hatte die Public Keys verwechselt.
🧠 Lektion: Private Key = bleibt bei dir. Public Key = gibst du dem anderen.
❌ Kein Zugriff aufs Internet
VPN-Tunnel steht.
Handshake läuft.
Aber: Kein Zugriff auf Webseiten.
🔍 Diagnose: Es fehlte NAT (Masquerading).
🔧 Lösung:/etc/ufw/before.rulesum den folgenden Block ergänzen:
iniCopyEdit*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.0.0/24 -o enp3s0f0 -j MASQUERADE
COMMIT
📢 Wichtig:
Die Datei muss am Ende mindestens zwei
COMMITs enthalten:
Einen für den NAT-Block (den du einfügst)
Und einen, der bereits da ist – ganz unten, für*filter
❌ DNS kaputt
Ich war im Tunnel – aber DNS löste nichts mehr auf.dig google.com? Timeout.
🔧 Lösung:
- Im Client:
DNS = 1.1.1.1- Auf dem Server:
bashCopyEditsudo nano /etc/ufw/sysctl.conf
# net.ipv4.ip_forward=1
sudo sysctl -p /etc/ufw/sysctl.conf
❌ Firewall blockt alles – still und heimlich
Ich dachte, ich hätte alles freigegeben:
bashCopyEditsudo ufw allow 51888/udp
Aber es reichte nicht.
🔧 Zusätzlich notwendig:
bashCopyEditsudo ufw route allow in on wg0 out on enp3s0f0
Jetzt flutscht es.
🔐 Kapitel 4: Die Schlüssel – wenn du’s einmal wirklich verstehst
🧠 Grundprinzip (in einem Satz):
Jedes Gerät hat ein eigenes Schlüsselpaar.
Private Key bleibt geheim.
Public Key wird dem anderen übergeben.
🔑 Schlüssel erzeugen
bashCopyEditumask 077
wg genkey | tee private.key | wg pubkey > public.key
📍 Key-Zuordnung:
| Gerät | Hat eigenen … | Und trägt ein … |
|---|---|---|
| Server | Private Key A | Public Key B vom Client ein |
| Client | Private Key B | Public Key A vom Server ein |
🧪 Beispiel-Config (abstrahiert):
🔹 Server – /etc/wireguard/wg0.conf
iniCopyEdit[Interface]
PrivateKey = <server_private_key>
Address = 10.10.0.1/24
ListenPort = 51888
SaveConfig = false
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.10.0.2/32
PersistentKeepalive = 25
🔹 Client – macOS WireGuard App
iniCopyEdit[Interface]
PrivateKey = <client_private_key>
Address = 10.10.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public_key>
AllowedIPs = 0.0.0.0/0
Endpoint = deinedomain.ddns.net:51888
PersistentKeepalive = 25
🧠 Merksatz fürs Leben:
🎯 Private Key = bleibt bei dir.
🔁 Public Key = gibst du dem anderen.
🧪 Kapitel 5: Läuft’s?
Ein paar Tests auf dem Client (Mac):
bashCopyEditping 10.10.0.1 # Tunnelverbindung
dig google.com # DNS via VPN
curl ifconfig.me # Anzeige der Server-IP?
Wenn ifconfig.me die Server-Öffentliche IP zeigt:
✅ Tunnel funktioniert vollumfänglich
🔁 Kapitel 6: VPN starten beim Boot (Server)
bashCopyEditsudo systemctl enable wg-quick@wg0
Jetzt wird das VPN-Interface automatisch beim Boot gestartet.
📦 Kapitel 7: DDNS mit No-IP (weil feste IPs überbewertet sind)
Mein Setup basiert auf No-IP, läuft zuverlässig:
bashCopyEditcd /usr/local/src
sudo wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
sudo tar xf noip-duc-linux.tar.gz
cd noip-*
sudo make
sudo make install
sudo noip2 -C
Damit wird meine Domain deinedomain.ddns.net automatisch aktualisiert, sobald sich die IP ändert.
➡️ Im VPN-Client trage ich einfach Endpoint = deinedomain.ddns.net:51888 ein. Fertig.
🧠 Kapitel 8: Was ich gelernt habe
- 🔐 Keymanagement ist alles – richtig lesen, sauber zuordnen
- 🔥 Firewalls sind nicht böse, aber streng
- 🧵
tcpdumpist der beste Debugging-Thread der Welt - 💡 NAT, DNS, Routing – man versteht sie erst, wenn sie nicht funktionieren
- 😴 Eine Nacht Schlaf ist oft die bessere Lösung als vier Stunden Frust
- 🧘 Und am Ende: der Tunnel funktioniert. Und du fühlst dich wie ein VPN-Gott.
✅ Kapitel 9: Mein funktionierendes Setup (Kurzfassung)
| Komponente | Konfiguration |
|---|---|
| Server | Ubuntu, WireGuard, Port 51888, NAT über UFW |
| DDNS | deinedomain.ddns.net via No-IP |
| Client | macOS WireGuard App |
| Tunnel-Netz | 10.10.0.0/24, IP 10.10.0.1 ⇆ 10.10.0.2 |
| Routing | UFW erlaubt Route wg0 → enp3s0f0 |
| Test | curl ifconfig.me zeigt die Server-Öffentliche IP ✅ |
💬 Kapitel 10: Und jetzt du
Wenn du auch einen WireGuard-VPN willst,
der nicht nur funktioniert, sondern auch verständlich ist:
Tu dir den Gefallen. Bau ihn dir selbst.
Aber hol dir Hilfe, wenn du hängst.
Ich bin durch den Tunnel gegangen.
Und ich sag dir:
Es lohnt sich.