Contents

Eigenes VPN mit WireGuard auf eine VM einrichten

Anforderungen In diesem Fall ist die Einrichtung ein komplex und du brauchst folgende Skills:

  • Grundlegende Linux-Kommandos (Shell, vi)
  • Verständnis von IP/Ports/Firewalls
  • Basiswissen zu Public/Private Keys

In diesem Post dokumentiere ich, wie ich ein VPN auf meiner VM (Ubuntu/Debian) eingerichtet habe.


Architekturüberblick

[Client: Laptop/Phone]
   WireGuard-App  ──▶  [Internet]
                 [Hetzner Cloud Firewall]
                        │ (51820/UDP erlaubt)
               [VM: Ubuntu/Debian Host]
               - wg0 (10.8.0.1/24)
               - UFW + NAT (MASQUERADE)
               - Dienste (z. B. Caddy/Web)

Warum WireGuard?

  • Einfach & schnell: Schlanke Config, moderne Kryptographie.
  • Sicher: Public-Key-basierte Authentifizierung, kleine Angriffsfläche
  • Flexibel: Full- oder Split-Tunnel, mehrere Peers, portable Profile.

1) Cloud-Firewall

Du sollst den Firewall deines VM-Provider entsprechend anpassen, damit nur gewünschter Traffic zur VM geht. Sehr häufig, eine VM wird mit einer bestimmte Bandbreite bereitsgestellt.

  • Inbound erlauben: 51820/udp (WireGuard), 22/tcp (SSH — vorübergehend/auf eigene IP beschränken), 80/tcp und 443/tcp (falls Webserver läuft).

2) Host-Firewall (UFW) & System (auf der VM)

Jetzt wird die Firewall auf deinen VM eingerichtet, das sorgt für die Schutz + Paketweiterleitung.

ufw allow 51820/udp
ufw allow 80,443/tcp
ufw allow 22/tcp  
ufw enable

# IP-Forwarding dauerhaft aktivieren (IPv4 + IPv6)
printf 'net.ipv4.ip_forward=1\nnet.ipv6.conf.all.forwarding=1\n' > /etc/sysctl.d/99-wireguard-forward.conf
sysctl --system

NAT für Full-Tunnel (WAN-Interface ggf. eth0 anpassen):

nano /etc/ufw/before.rules

Ganz oben einfügen:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Dann:

sed -i 's/^DEFAULT_FORWARD_POLICY.*/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
ufw reload

3) WireGuard installieren & Server-Keys (auf der VM)

Krypto-Identität des Servers.

apt update && apt install -y wireguard qrencode
umask 077
install -d -m 700 /etc/wireguard
cd /etc/wireguard
wg genkey > server.key
wg pubkey < server.key > server.pub
chmod 600 server.key

Server-Config /etc/wireguard/wg0.conf:

SERVER_PRIV=$(cat /etc/wireguard/server.key)
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = ${SERVER_PRIV}
# Optional: DNS = 1.1.1.1, 9.9.9.9
EOF
chmod 600 /etc/wireguard/wg0.conf

Interface starten & aktivieren:

systemctl enable --now wg-quick@wg0
wg show

4) Ersten Client anlegen (z. B. Laptop „alice“)

Schlüssel kann man bequem auf der VM erzeugen und die fertige Config auf den Client übertragen.

cd /etc/wireguard
CLIENT=incompletenotes
wg genkey > ${CLIENT}.key
wg pubkey < ${CLIENT}.key > ${CLIENT}.pub

CLIENT_PRIV=$(cat ${CLIENT}.key)
CLIENT_PUB=$(cat ${CLIENT}.pub)
SERVER_PUB=$(cat server.pub)
SERVER_ENDPOINT="DEINE.SERVER.IP.ODER.DNS:51820"

Client-Datei /etc/wireguard/incompletenotes.conf:

cat > /etc/wireguard/${CLIENT}.conf <<EOF
[Interface]
PrivateKey = ${CLIENT_PRIV}
Address = 10.8.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = ${SERVER_PUB}
Endpoint = ${SERVER_ENDPOINT}
AllowedIPs = 0.0.0.0/0, ::/0    # Full-Tunnel
PersistentKeepalive = 25
EOF

Split-Tunnel? Statt 0.0.0.0/0, ::/0 z. B. nur 10.8.0.0/24 eintragen.

Client am Server registrieren (Peer):

cat >> /etc/wireguard/wg0.conf <<EOF

[Peer]
# ${CLIENT}
PublicKey = ${CLIENT_PUB}
AllowedIPs = 10.8.0.2/32
EOF

wg set wg0 peer ${CLIENT_PUB} allowed-ips 10.8.0.2/32
wg-quick down wg0 && wg-quick up wg0
wg show

Client-Config übertragen:

  • Desktop: /etc/wireguard/incompletenotes.conf per scp kopieren und in die WireGuard-App importieren.

  • Handy: QR im Terminal zeigen:

    qrencode -t ansiutf8 < /etc/wireguard/incompletenotes.conf

5) Funktionstest

Client:

  • Verbinden -> ping 10.8.0.1
  • Full-Tunnel: curl ifconfig.me zeigt die Server-IP
  • SSH über VPN (optional): ssh user@10.8.0.1

Server:

wg show   # Handshake/Traffic prüfen

6) Härtung & Betrieb

  • Regelmäßige Updates: apt update && apt upgrade -y
  • Backups: /etc/wireguard/wg0.conf sichern (Private Keys nie weitergeben).
  • Weitere Clients: Für jede:n neue Keys + eindeutige IP (10.8.0.3/32, 10.8.0.4/32, …) und Peer-Block ergänzen.

Fazit

Mit diesem Setup habe ich eine stabile, sichere VPN-Anbindung zu meiner VM: Cloud-Firewall + UFW regeln Zugriffe, WireGuard (wg0) stellt den Tunnel bereit, NAT ermöglicht auf Wunsch Full-Tunnel ins Internet.