🛡️ Wie ich mir ein WireGuard-VPN eingerichtet habe – und fast daran zerbrochen wäre

  • Post author:
  • Post last modified:25. März 2025

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.rules um 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ätHat eigenen …Und trägt ein …
ServerPrivate Key APublic Key B vom Client ein
ClientPrivate Key BPublic 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
  • 🧵 tcpdump ist 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)

KomponenteKonfiguration
ServerUbuntu, WireGuard, Port 51888, NAT über UFW
DDNSdeinedomain.ddns.net via No-IP
ClientmacOS WireGuard App
Tunnel-Netz10.10.0.0/24, IP 10.10.0.1 ⇆ 10.10.0.2
RoutingUFW erlaubt Route wg0 → enp3s0f0
Testcurl 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.

Schreiben Sie einen Kommentar