WireGuard VPN für Teams: Sicherer Zugriff auf Self-Hosted-Infrastruktur per Docker
Wer Server selbst betreibt, steht vor einer grundlegenden Frage: Wie greifen Teammitglieder sicher auf interne Dienste zu? Admin-Panels, Datenbanken, Monitoring-Dashboards — all das gehört nicht ins öffentliche Internet. Die klassische Lösung: ein VPN. Und seit WireGuard 2020 in den Linux-Kernel aufgenommen wurde, gibt es keinen Grund mehr, sich mit OpenVPN herumzuschlagen.
In diesem Artikel zeigen wir, wie Sie WireGuard als Docker-Container für Ihr Team aufsetzen, Clients konfigurieren und den Zugriff auf Ihre Self-Hosted-Infrastruktur absichern. Wenn Sie Ihre Infrastruktur generell absichern möchten, empfehlen wir auch unseren Artikel über Backup-Strategien für Docker.
Warum WireGuard statt OpenVPN?
WireGuard ist seit Linux-Kernel 5.6 (März 2020) fester Bestandteil des Kernels. Der Unterschied zu OpenVPN ist drastisch:
| Merkmal | WireGuard | OpenVPN |
|---|---|---|
| Codeumfang | ~4.000 Zeilen | 100.000+ Zeilen |
| Protokoll | UDP (Kernel-Level) | UDP/TCP (Userspace) |
| Verbindungsaufbau | < 100 ms | Mehrere Sekunden |
| Kryptografie | ChaCha20, Curve25519, BLAKE2s | OpenSSL (konfigurierbar) |
| Konfiguration | Minimal, deklarativ | Komplex, viele Optionen |
| Angriffsfläche | Minimal durch wenig Code | Groß durch Komplexität |
| Mobile Performance | Exzellent (Roaming-Support) | Verbindungsabbrüche bei Netzwechsel |
Weniger Code bedeutet weniger Bugs, weniger Angriffsfläche und einfacheres Auditing. WireGuard ist zudem auf allen Plattformen verfügbar — Linux, Windows, macOS, iOS und Android mit offiziellen Apps.
Docker-Setup: wg-easy — WireGuard mit Web-UI
Für Teams ist wg-easy die beste Wahl. Es kombiniert WireGuard mit einer Web-Oberfläche zum Verwalten von Clients — QR-Codes, Config-Downloads und Traffic-Statistiken inklusive.
Systemanforderungen
- Minimum: 1 vCPU, 512 MB RAM, 10 GB Storage
- Empfohlen für Teams: 1 vCPU, 1 GB RAM für 10–20 gleichzeitige Clients
- Linux-Kernel 5.6+ (WireGuard im Kernel) oder DKMS-Modul
- Docker + Docker Compose
- Ein offener UDP-Port (Standard: 51820)
Docker Compose
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy
container_name: wg-easy
environment:
- LANG=de
- WG_HOST=vpn.example.com
- PASSWORD_HASH=$$2y$$10$$... # bcrypt-Hash
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
- WG_ALLOWED_IPS=10.8.0.0/24,192.168.1.0/24
- WG_PERSISTENT_KEEPALIVE=25
volumes:
- wg-data:/etc/wireguard
ports:
- "51820:51820/udp" # VPN
- "51821:51821/tcp" # Web-UI
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
volumes:
wg-data:
Wichtig: Setzen Sie PASSWORD_HASH als bcrypt-Hash, nicht als Klartext. Generieren Sie den Hash mit:
docker run -it ghcr.io/wg-easy/wg-easy wgpw 'IhrSicheresPasswort'
Die Web-UI ist nach docker compose up -d unter Port 51821 erreichbar.
Alternative: linuxserver/wireguard (ohne GUI)
Für fortgeschrittene Setups ohne Web-UI bietet linuxserver/wireguard mehr Kontrolle. Die Anzahl der Clients wird über die PEERS-Variable definiert, Konfigurationen werden automatisch generiert:
services:
wireguard:
image: lscr.io/linuxserver/wireguard
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- SERVERURL=vpn.example.com
- PEERS=alice,bob,carol,dave
- PEERDNS=1.1.1.1
- INTERNAL_SUBNET=10.13.13.0
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
Die Client-Configs und QR-Codes liegen anschließend unter ./config/peer_alice/, ./config/peer_bob/ usw.
Clients einrichten
WireGuard bietet offizielle Apps für alle Plattformen. Die Einrichtung dauert unter einer Minute:
- Mobile (iOS/Android): App installieren → QR-Code aus wg-easy scannen → fertig
- Desktop (Windows/macOS/Linux): App installieren →
.conf-Datei importieren → aktivieren
Eine Client-Konfiguration sieht so aus:
[Interface]
PrivateKey = <automatisch generiert>
Address = 10.8.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <Server-PublicKey>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
Split Tunneling: Nur interner Traffic über VPN
Standardmäßig können Sie steuern, welcher Traffic durch den VPN-Tunnel geht. Der Schlüssel ist AllowedIPs:
- Nur internes Netz:
AllowedIPs = 10.8.0.0/24— nur Traffic zum VPN-Netz wird getunnelt, Internet läuft normal - Alles über VPN:
AllowedIPs = 0.0.0.0/0— gesamter Traffic geht über den Server - Mehrere Netze:
AllowedIPs = 10.8.0.0/24, 172.18.0.0/16— VPN-Netz plus Docker-Netzwerk
Für Teams empfehlen wir Split Tunneling: Nur der Zugriff auf interne Dienste läuft über VPN, normales Browsen geht direkt ins Internet. Das spart Bandbreite und reduziert die Latenz.
Zugriffskontrolle für Teams
WireGuard kennt von Haus aus keine Benutzerrollen — jeder Peer hat die gleichen Rechte im Netzwerk. Für granulare Zugriffskontrolle setzen Sie auf Netzwerk-Ebene:
iptables-Regeln im WireGuard-Container
# Nur alice darf auf das Admin-Panel (Port 8080) zugreifen
iptables -A FORWARD -s 10.8.0.2 -d 172.18.0.0/16 -p tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -d 172.18.0.0/16 -p tcp --dport 8080 -j DROP
Peer-Management mit wg-easy
- Neue Mitarbeiter: In der Web-UI “Add Client” klicken, QR-Code teilen
- Mitarbeiter verlässt das Team: Client in der Web-UI deaktivieren oder löschen
- Kompromittierter Client: Sofort in der UI entfernen — der öffentliche Schlüssel wird ungültig
Integration mit Docker-Infrastruktur
Der eigentliche Mehrwert: WireGuard als Gateway zu Ihrer gesamten Docker-Infrastruktur. Verbinden Sie den wg-easy-Container mit Ihren Docker-Netzwerken:
services:
wg-easy:
# ... wie oben ...
networks:
- vpn
- monitoring
- admin
networks:
vpn:
monitoring:
external: true
admin:
external: true
Damit erreichen VPN-Clients alle Container in den verbundenen Netzwerken — Grafana, Portainer, phpMyAdmin, Mailcow-Admin — ohne dass diese Dienste öffentlich erreichbar sein müssen.
Absicherung der Web-UI
Die wg-easy Web-UI sollte nicht öffentlich im Internet erreichbar sein. Drei Ansätze:
- Nur über VPN: Port 51821 nicht nach außen mappen, nur über das VPN-Netz erreichbar
- IP-Whitelist: UFW/iptables-Regel für Port 51821 auf Ihre Management-IP beschränken
- Hinter Traefik: Basic Auth oder IP-Whitelist-Middleware, wie in unserem Monitoring-Artikel beschrieben
Häufige Fragen
Brauche ich eine feste IP-Adresse?
Ideal, aber nicht zwingend. Eine dynamische IP funktioniert mit einem DDNS-Dienst (z. B. DuckDNS). Setzen Sie WG_HOST auf Ihre DDNS-Domain.
Wie viele Clients kann ein Server handhaben?
WireGuard ist extrem effizient. Ein kleiner VPS mit 1 vCPU und 1 GB RAM bedient problemlos 20–50 gleichzeitige Clients. Der Engpass ist die Bandbreite, nicht die Rechenleistung.
Funktioniert WireGuard hinter restriktiven Firewalls?
WireGuard nutzt UDP. In Firmennetzwerken oder Hotels, die nur TCP 80/443 erlauben, funktioniert es nicht direkt. Workaround: wstunnel kann WireGuard-Traffic in einen WebSocket-Tunnel verpacken.
Was passiert bei einem Netzwechsel (WLAN → Mobilfunk)?
WireGuard handhabt Roaming nativ — die Verbindung bleibt bestehen. Das ist einer der größten Vorteile gegenüber OpenVPN, wo Netzwechsel oft Verbindungsabbrüche verursachen.
Kann ich WireGuard und Traefik auf dem gleichen Server betreiben?
Ja, problemlos. Traefik nutzt TCP-Ports 80/443, WireGuard nutzt UDP-Port 51820. Keine Konflikte.
Managed VPN: Weniger Aufwand, mehr Sicherheit
WireGuard ist einfach — aber “einfach” heißt nicht “wartungsfrei”. Kernel-Updates, Backup der Schlüssel, Monitoring der Verbindungen, Firewall-Regeln pflegen: Das summiert sich. Bei netzspitze.tech übernehmen wir den kompletten VPN-Stack als Teil Ihrer Managed-Infrastruktur:
- WireGuard-Server als Teil Ihres Docker-Stacks
- Automatische Backups der Konfiguration
- Monitoring der VPN-Verbindungen
- Onboarding neuer Teammitglieder in Minuten
- Integration mit Ihrer bestehenden Infrastruktur (Traefik, Monitoring, Dienste)
Jetzt Beratungstermin buchen — wir richten Ihren sicheren Team-Zugang ein.