Files
michaelschiemer/docs/deployment/WIREGUARD-SETUP.md
Michael Schiemer e598309c48 feat: improve WireGuard client management and framework initialization
- Improve WireGuard client IP calculation logic (find next available IP)
- Add local wireguard-clients directory for storing client configs
- Integrate Redis pool into CacheInitializer
- Improve ContainerBootstrapper with better imports and Redis pool
- Add monitoring role tags for better task organization
- Update WireGuard documentation
- Store generated WireGuard client configs locally
2025-11-02 03:29:23 +01:00

12 KiB
Raw Blame History

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:

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:

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:

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:

# 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:

ssh -i ~/.ssh/production deploy@94.16.110.151
sudo cat /etc/wireguard/clients/development.conf

2. WireGuard auf Client installieren

Linux (Ubuntu/Debian):

sudo apt update
sudo apt install wireguard wireguard-tools

Linux (CentOS/RHEL):

sudo yum install wireguard-tools
# oder
sudo dnf install wireguard-tools

macOS:

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):

# 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):

# 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:

# 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

# 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

# Server im VPN-Netzwerk pingen
ping 10.8.0.1

# Sollte erfolgreich sein

3. VPN-Netzwerk prüfen

# 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:

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

# Auf dem Server
sudo wg show

# Zeigt alle verbundenen Clients

Client-Config-Dateien anzeigen

# Auf dem Server
ls -la /etc/wireguard/clients/

Client entfernen

Um einen Client zu entfernen:

# 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):

# 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:

# 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:

# Auf dem Server
sudo systemctl status wg-quick@wg0

# Logs anzeigen
sudo journalctl -u wg-quick@wg0 -f

3. Server-Konfiguration prüfen:

# 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:

# 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:

# 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:

# Auf dem Server
sudo iptables -t nat -L -n | grep MASQUERADE
sudo iptables -L FORWARD -n | grep wg0

3. Routing prüfen:

# 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!

# 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:

# In Client-Config hinzufügen:
# [Interface]
# MTU = 1420

2. PersistKeepalive anpassen:

# In Client-Config bereits konfiguriert:
# PersistentKeepalive = 25

3. Server-Last prüfen:

# Auf dem Server
sudo wg show
# Zeigt Transfer-Statistiken

Best Practices

Sicherheit

  1. Backup der Server-Keys:

    # 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:

    # 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:

    # Auf dem Server
    sudo wg show
    
  2. Logs prüfen:

    # Auf dem Server
    sudo journalctl -u wg-quick@wg0 -f
    
  3. Transfer-Statistiken:

    # 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:

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:

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

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).


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:

    sudo journalctl -u wg-quick@wg0 -f
    
  2. Status prüfen:

    sudo wg show
    
  3. Firewall prüfen:

    sudo ufw status
    
  4. Connectivity testen:

    ping 10.8.0.1  # Vom Client
    
  5. Ansible Playbook erneut ausführen:

    cd deployment/ansible
    ansible-playbook -i inventory/production.yml playbooks/setup-wireguard.yml
    

Referenzen


Zuletzt aktualisiert: 2025-10-31
Version: 1.0