Files
michaelschiemer/docs/deployment/WIREGUARD-SETUP.md
Michael Schiemer edcf509a4f feat: add PHP ini management system and update infrastructure configs
- Add PHP ini management classes (Access, IniDirective, IniKey, PhpIni)
- Update deployment configurations (Wireguard, Traefik, Monitoring)
- Add DNS stack and Ansible role
- Add deployment debugging playbooks
- Update framework components (FilePath, RedisConnectionPool)
- Update .gitignore and documentation
2025-11-02 15:29:41 +01:00

596 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
**Aktuelle Sicherheitshärtung:**
- 🔒 **Traefik-Dashboard** ist jetzt nur noch über WireGuard VPN erreichbar (VPN-only + BasicAuth)
- 🔒 **Grafana** ist nur noch über WireGuard VPN erreichbar (VPN-only Middleware)
- ✅ Hauptanwendung (`michaelschiemer.de`) bleibt öffentlich erreichbar (wie gewünscht)
- 🔒 Traefik arbeitet hinter WireGuard für interne Services (Dashboard, Monitoring)
**Zukünftige Sicherheitshärtung (geplant):**
- 🔒 Weitere Backend-Dienste (Prometheus, Portainer) können später nur noch über VPN erreichbar sein
- 🔒 Firewall-Regeln können bei Bedarf weiter angepasst werden
---
## 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: <client_public_key>
# private key: (hidden)
# listening port: <random_port>
#
# peer: hT3OCWZ6ElX79YdAdexSsZnbWLzRM/5szk+XNEBUaS8=
# endpoint: 94.16.110.151:51820
# allowed ips: 10.8.0.0/24
# latest handshake: <timestamp>
# transfer: <received>, <sent>
```
### 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)
- `wireguard_dns_servers`: Liste interner Resolver (Default: WireGuard-Server-IP, z.B. `["10.8.0.1"]`)
**Dokumentation**: Siehe `deployment/ansible/playbooks/README-WIREGUARD.md`
> Nach dem Lauf liegt die Client-Konfiguration zusätzlich lokal im Repository unter
> `deployment/ansible/wireguard-clients/<client_name>.conf` ideal zum direkten
> Import auf deinem Admin-Rechner (Datei bleibt mit `chmod 600` geschützt).
### Interner DNS (CoreDNS) für VPN-Clients
**Datei**: `deployment/ansible/playbooks/setup-infrastructure.yml` (Tag `dns`)
**Verwendung:**
```bash
cd deployment/ansible
ANSIBLE_VAULT_PASSWORD_FILE=secrets/.vault_pass \
ansible-playbook -i inventory/production.yml playbooks/setup-infrastructure.yml --tags dns
```
**Konfiguration:**
- DNS-Records definieren sich über `dns_records` (Default in `group_vars/production.yml` → `grafana.<app_domain>` → `10.8.0.1`)
- Zusätzliche Einträge können per Override vor dem Playbook-Lauf gesetzt werden, z.B.:
```bash
ansible-playbook ... --tags dns \
-e 'dns_records=[{"host":"grafana.michaelschiemer.de","address":"10.8.0.1"},{"host":"prometheus.michaelschiemer.de","address":"10.8.0.1"}]'
```
- Upstream-Resolver werden über `dns_forwarders` gesteuert (Standard: `1.1.1.1`, `8.8.8.8`)
**Ergebnis:**
- CoreDNS läuft auf dem Server via `network_mode: host` (UDP/TCP 53)
- Alle VPN-Clients können `grafana.michaelschiemer.de` (und weitere Overrides) direkt auf `10.8.0.1` auflösen
- Nicht hinterlegte Hostnamen werden dank `fallthrough` automatisch an die definierten Upstream-Resolver weitergereicht
- Traefik-Middleware `grafana-vpn-only` akzeptiert ausschließlich Verbindungen aus dem WireGuard-Netz `10.8.0.0/24`
- HTTP-Aufrufe zu Grafana laufen so automatisch durch den WireGuard-Tunnel
---
## 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