# WireGuard VPN Setup - Complete Guide **Status**: ✅ Active **Last Updated**: 2025-10-31 **Server**: 94.16.110.151 (michaelschiemer.de) --- ## Übersicht WireGuard ist ein modernes, schnelles und sicheres VPN-Protokoll, das für den sicheren Zugriff auf interne Services auf dem Production-Server verwendet wird. **Features:** - ✅ Schnell und performant - ✅ Moderne Kryptographie - ✅ Einfache Konfiguration - ✅ Native Unterstützung in Linux, macOS, Windows, iOS, Android - ✅ Automatisierte Installation via Ansible --- ## Server-Informationen **Server-Endpoint:** - **Host**: 94.16.110.151 - **Port**: 51820 (UDP) - **VPN-Netzwerk**: 10.8.0.0/24 - **Server-IP (VPN)**: 10.8.0.1 **Server-Public-Key:** ``` hT3OCWZ6ElX79YdAdexSsZnbWLzRM/5szk+XNEBUaS8= ``` **Wichtige Sicherheitshinweise:** - ✅ SSH-Zugriff über normale IP bleibt vollständig funktionsfähig - ✅ WireGuard routet standardmäßig nur das VPN-Netzwerk (10.8.0.0/24) - ✅ Normale Internet-Routen werden nicht geändert - ✅ Firewall-Regeln für SSH (Port 22) werden NICHT entfernt oder blockiert **Zukünftige Sicherheitshärtung (geplant):** - 🔒 Backend-Dienste (Prometheus, Grafana, Portainer) sollen später nur noch über VPN erreichbar sein - 🔒 Aktuell sind alle Dienste noch öffentlich erreichbar (für einfachere Einrichtung) - 🔒 Firewall-Regeln können später angepasst werden, um nur VPN-Zugriff zu erlauben --- ## Installation ### Server-Installation (via Ansible) Die Server-Installation erfolgt automatisch via Ansible: ```bash cd deployment/ansible ansible-playbook -i inventory/production.yml playbooks/setup-wireguard.yml ``` **Was wird installiert:** - WireGuard und Tools - Server-Keys (generiert oder vorhandene verwendet) - Server-Konfiguration - IP Forwarding aktiviert - NAT (Masquerading) konfiguriert - Firewall-Port 51820/udp geöffnet - WireGuard-Service gestartet ### Client hinzufügen Um einen neuen Client hinzuzufügen: ```bash cd deployment/ansible ansible-playbook -i inventory/production.yml playbooks/add-wireguard-client.yml \ -e "client_name=myclient" ``` **Optionale Parameter:** - `client_ip`: Spezifische Client-IP (Standard: automatisch berechnet) - `allowed_ips`: Erlaubte IP-Ranges (Standard: 10.8.0.0/24) **Beispiel mit spezifischer IP:** ```bash ansible-playbook -i inventory/production.yml playbooks/add-wireguard-client.yml \ -e "client_name=myclient" \ -e "client_ip=10.8.0.5" ``` --- ## Client-Konfiguration ### 1. Config-Datei abrufen Die Client-Konfigurationsdatei liegt auf dem Server unter: ``` /etc/wireguard/clients/{client_name}.conf ``` **Abrufen der Config-Datei:** ```bash # Von Ansible Control Machine scp -i ~/.ssh/production \ deploy@94.16.110.151:/etc/wireguard/clients/development.conf \ ~/development.conf ``` Oder direkt auf dem Server: ```bash ssh -i ~/.ssh/production deploy@94.16.110.151 sudo cat /etc/wireguard/clients/development.conf ``` ### 2. WireGuard auf Client installieren **Linux (Ubuntu/Debian):** ```bash sudo apt update sudo apt install wireguard wireguard-tools ``` **Linux (CentOS/RHEL):** ```bash sudo yum install wireguard-tools # oder sudo dnf install wireguard-tools ``` **macOS:** ```bash brew install wireguard-tools ``` **Windows:** Download von https://www.wireguard.com/install/ **iOS/Android:** WireGuard App aus dem App Store/Play Store installieren ### 3. VPN verbinden **Linux/macOS (Command Line):** ```bash # Config-Datei kopieren sudo cp ~/development.conf /etc/wireguard/development.conf # VPN starten sudo wg-quick up development # Status prüfen sudo wg show # VPN trennen sudo wg-quick down development ``` **Linux/macOS (Alternative):** ```bash # Direkt mit Datei sudo wg-quick up ~/development.conf ``` **Windows:** 1. WireGuard-App öffnen 2. "Import tunnel(s) from file" wählen 3. `development.conf` Datei auswählen 4. "Activate" klicken **iOS/Android:** 1. WireGuard-App öffnen 2. QR-Code scannen (falls verfügbar) oder Config-Datei importieren 3. Tunnel aktivieren ### 4. QR-Code generieren Falls `qrencode` auf dem Server installiert ist, kann ein QR-Code generiert werden: ```bash # Auf dem Server qrencode -t ansiutf8 < /etc/wireguard/clients/development.conf # oder für PNG qrencode -t png -o /tmp/development-qr.png < /etc/wireguard/clients/development.conf ``` --- ## Verbindung testen Nach dem Verbinden mit dem VPN: ### 1. VPN-Status prüfen ```bash # Status anzeigen sudo wg show # Erwartete Ausgabe: # interface: development # public key: # private key: (hidden) # listening port: # # peer: hT3OCWZ6ElX79YdAdexSsZnbWLzRM/5szk+XNEBUaS8= # endpoint: 94.16.110.151:51820 # allowed ips: 10.8.0.0/24 # latest handshake: # transfer: , ``` ### 2. Server-IP pingen ```bash # Server im VPN-Netzwerk pingen ping 10.8.0.1 # Sollte erfolgreich sein ``` ### 3. VPN-Netzwerk prüfen ```bash # Routing-Tabelle prüfen ip route show # Sollte einen Eintrag für 10.8.0.0/24 über wg0 zeigen ``` ### 4. Services über VPN erreichen Nach erfolgreicher VPN-Verbindung sollten folgende Services über das VPN-Netzwerk erreichbar sein: - **Prometheus**: http://10.8.0.1:9090 - **Grafana**: http://10.8.0.1:3000 - **Portainer**: https://10.8.0.1:9443 **Hinweis**: - ⚠️ Aktuell sind diese Services auch öffentlich erreichbar (Traefik-Routing) - 🔒 **Geplant**: Später sollen alle Backend-Dienste nur noch über VPN erreichbar sein - ✅ Für die Einrichtung bleibt der öffentliche Zugriff vorerst aktiviert --- ## Client-Verwaltung ### Client-Liste anzeigen ```bash # Auf dem Server sudo wg show # Zeigt alle verbundenen Clients ``` ### Client-Config-Dateien anzeigen ```bash # Auf dem Server ls -la /etc/wireguard/clients/ ``` ### Client entfernen Um einen Client zu entfernen: ```bash # Auf dem Server sudo nano /etc/wireguard/wg0.conf # Entferne den [Peer] Block für den Client # WireGuard neu starten sudo wg-quick down wg0 sudo wg-quick up wg0 # Optional: Client-Config löschen sudo rm /etc/wireguard/clients/clientname.conf ``` Oder über Ansible (manuelle Datei-Bearbeitung erforderlich): ```bash # 1. Client aus /etc/wireguard/wg0.conf entfernen # 2. WireGuard-Service neu starten: cd deployment/ansible ansible production -m shell -a "sudo wg-quick down wg0 && sudo wg-quick up wg0" ``` --- ## Troubleshooting ### VPN verbindet nicht **1. Firewall prüfen:** ```bash # Auf dem Server sudo ufw status | grep 51820 # Sollte zeigen: 51820/udp ALLOW # Falls nicht: sudo ufw allow 51820/udp comment 'WireGuard VPN' ``` **2. WireGuard-Service prüfen:** ```bash # Auf dem Server sudo systemctl status wg-quick@wg0 # Logs anzeigen sudo journalctl -u wg-quick@wg0 -f ``` **3. Server-Konfiguration prüfen:** ```bash # Auf dem Server sudo wg show sudo cat /etc/wireguard/wg0.conf ``` **4. Client-Config prüfen:** - Endpoint korrekt? (94.16.110.151:51820) - Server-Public-Key korrekt? - Client-Private-Key vorhanden? - AllowedIPs korrekt? **5. Netzwerk-Verbindung prüfen:** ```bash # Vom Client aus ping 94.16.110.151 # Sollte erfolgreich sein # UDP-Port testen nc -u -v 94.16.110.151 51820 ``` ### VPN verbindet, aber kein Traffic **1. IP Forwarding prüfen:** ```bash # Auf dem Server cat /proc/sys/net/ipv4/ip_forward # Sollte "1" sein # Falls nicht: echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` **2. NAT-Rules prüfen:** ```bash # Auf dem Server sudo iptables -t nat -L -n | grep MASQUERADE sudo iptables -L FORWARD -n | grep wg0 ``` **3. Routing prüfen:** ```bash # Auf dem Server ip route show # Sollte Routes für wg0 zeigen # Vom Client ip route show # Sollte Route für 10.8.0.0/24 über VPN zeigen ``` ### SSH-Zugriff funktioniert nicht mehr **WICHTIG**: SSH-Zugriff sollte weiterhin über die normale IP funktionieren! ```bash # SSH über normale IP (nicht VPN) ssh -i ~/.ssh/production deploy@94.16.110.151 # Falls nicht funktioniert: # 1. Prüfe, ob VPN alle Traffic routet (AllowedIPs = 0.0.0.0/0) # 2. Deaktiviere VPN: sudo wg-quick down development # 3. Prüfe Firewall: sudo ufw status | grep 22 ``` ### Performance-Probleme **1. MTU anpassen:** ```bash # In Client-Config hinzufügen: # [Interface] # MTU = 1420 ``` **2. PersistKeepalive anpassen:** ```bash # In Client-Config bereits konfiguriert: # PersistentKeepalive = 25 ``` **3. Server-Last prüfen:** ```bash # Auf dem Server sudo wg show # Zeigt Transfer-Statistiken ``` --- ## Best Practices ### Sicherheit 1. **Backup der Server-Keys:** ```bash # Auf dem Server sudo tar czf wireguard-backup.tar.gz /etc/wireguard/ # Sicher speichern (z.B. verschlüsselt) ``` 2. **Client-Keys sicher verwalten:** - Client-Private-Keys niemals teilen - Config-Dateien sicher speichern - Nicht genutzte Clients entfernen 3. **Regelmäßige Updates:** ```bash # Auf dem Server sudo apt update && sudo apt upgrade wireguard wireguard-tools ``` 4. **Firewall-Regeln:** - Nur notwendige Ports öffnen - Regelmäßig Firewall-Status prüfen ### Monitoring 1. **VPN-Verbindungen überwachen:** ```bash # Auf dem Server sudo wg show ``` 2. **Logs prüfen:** ```bash # Auf dem Server sudo journalctl -u wg-quick@wg0 -f ``` 3. **Transfer-Statistiken:** ```bash # Auf dem Server sudo wg show # Zeigt received/sent für jeden Client ``` --- ## Ansible Playbooks ### Setup WireGuard Server **Datei**: `deployment/ansible/playbooks/setup-wireguard.yml` **Verwendung:** ```bash cd deployment/ansible ansible-playbook -i inventory/production.yml playbooks/setup-wireguard.yml ``` **Variablen:** - `wireguard_port`: Port für WireGuard (Standard: 51820) - `wireguard_network`: VPN-Netzwerk (Standard: 10.8.0.0/24) - `wireguard_server_ip`: Server-IP im VPN (Standard: 10.8.0.1) ### Add WireGuard Client **Datei**: `deployment/ansible/playbooks/add-wireguard-client.yml` **Verwendung:** ```bash cd deployment/ansible ansible-playbook -i inventory/production.yml playbooks/add-wireguard-client.yml \ -e "client_name=myclient" ``` **Variablen:** - `client_name`: Name des Clients (erforderlich) - `client_ip`: Spezifische Client-IP (Standard: automatisch berechnet) - `allowed_ips`: Erlaubte IP-Ranges (Standard: 10.8.0.0/24) **Dokumentation**: Siehe `deployment/ansible/playbooks/README-WIREGUARD.md` --- ## Verzeichnisstruktur **Auf dem Server:** ``` /etc/wireguard/ ├── wg0.conf # Server-Konfiguration ├── wg0_private.key # Server-Private-Key (600) ├── wg0_public.key # Server-Public-Key (644) └── clients/ # Client-Konfigurationen ├── development.conf # Development-Client └── ... ``` **Auf dem Client (Linux/macOS):** ``` /etc/wireguard/ └── development.conf # Client-Konfiguration (600) ``` --- ## Support Bei Problemen: 1. **Logs prüfen:** ```bash sudo journalctl -u wg-quick@wg0 -f ``` 2. **Status prüfen:** ```bash sudo wg show ``` 3. **Firewall prüfen:** ```bash sudo ufw status ``` 4. **Connectivity testen:** ```bash ping 10.8.0.1 # Vom Client ``` 5. **Ansible Playbook erneut ausführen:** ```bash cd deployment/ansible ansible-playbook -i inventory/production.yml playbooks/setup-wireguard.yml ``` --- ## Referenzen - **WireGuard-Website**: https://www.wireguard.com/ - **WireGuard-Installation**: https://www.wireguard.com/install/ - **WireGuard-Dokumentation**: https://www.wireguard.com/papers/wireguard.pdf - **Ansible Playbook-Dokumentation**: `deployment/ansible/playbooks/README-WIREGUARD.md` --- **Zuletzt aktualisiert**: 2025-10-31 **Version**: 1.0