WireGuard VPN Server #
WireGuard is a streamlined VPN protocol designed for speed, security, and simplicity. This deployment provides a WireGuard VPN server, allowing secure and private network access.
Quelle #
Kein eigenes Chart: Der Verbund wird über das generische app-template von
BJW-S Labs zusammengesetzt. Die
einzelnen Container stammen aus verschiedenen Quellen:
| Container | Image |
|---|---|
| WireGuard-Server | lscr.io/linuxserver/wireguard |
| Web-Portal | ghcr.io/h44z/wg-portal |
| SSH-Bastion | eigenes Image aus der Forgejo-Registry (docker-ssh-bastion) |
| Tailscale | tailscale/tailscale |
Dokumentation #
Die Dokumentation der verwendeten Weboberfläche steht unter h44z/wg-portal.
Funktion #
Dieser Dienst bietet einen zentralen und einfach zu verwaltenden VPN-Zugang zum Netzwerk.
- WireGuard-Server: Der Kern des Dienstes, der den verschlüsselten VPN-Tunnel bereitstellt.
- Web-Portal: Eine Weboberfläche, auf der sich Benutzer anmelden können. Der Hostname steht im Ingress in
values.yaml. - LDAP-Integration: Benutzer werden gegen ein Active Directory authentifiziert. Nur Mitglieder einer bestimmten Gruppe (
wireguardEnabled) dürfen sich anmelden. - Self-Provisioning: Nach der Anmeldung können Benutzer ihre eigenen VPN-Clients (Peers) erstellen, QR-Codes zum einfachen Einrichten auf Mobilgeräten scannen und Konfigurationsdateien herunterladen.
- Bastion Host: Ein integrierter SSH-Server, der als sicherer Sprung-Host ins Netzwerk dienen kann.
Lokale Anpassungen #
- Die Benutzerverwaltung läuft gegen ein LDAP-Verzeichnis; Peers werden daraus abgeleitet.
- VPN-Tunnel (UDP) und SSH (TCP) hängen an einem gemeinsamen LoadBalancer-Service.
- Die SSH-Host-Schlüssel kommen aus einem Secret, das aus dem Verzeichnis
ssh/erzeugt wird — sie bleiben damit über Neustarts hinweg stabil, und Clients bekommen keine Warnung über einen gewechselten Schlüssel. - Für den Bastion gilt eine eigene
sshd-Konfiguration, eingebunden als ConfigMapsshd-config. /lib/moduleswird vom Host als einzigeshostPathdurchgereicht — WireGuard braucht das Kernelmodul des Hosts.- Der Bastion Container stellt einen SSH Jumphost bereit. Primär für die Nutzung von Ansible. Damit lassen sich alle Geräte hinter den NATs erreichen, welche im VPN sind.
- Wg-portal stellt eine leichte Möglichkeit bereit den Mitarbeitern vordefinierte Zugänge zum VPN bereitzustellen. Der Container nutzt das Netzwerk des wireguard Containers und muss deshalb mit ihm zusammen neu gestartet werden.
Die Konfiguration erfolgt über Umgebungsvariablen in der values.yaml-Datei.
Wichtige Umgebungsvariablen #
LDAP_URL,LDAP_BASEDN,LDAP_USER,LDAP_PASSWORD: Konfigurieren die Verbindung zum Active Directory.LDAP_SYNC_FILTER: Definiert, welche Benutzer Zugriff auf den VPN-Dienst haben.SELF_PROVISIONING: Ist auftruegesetzt, um Benutzern die eigenständige Verwaltung ihrer Geräte zu ermöglichen.MAIL_FROM,EMAIL_HOST: Konfigurieren den E-Mail-Versand für Benachrichtigungen.
Wichtige Einstellungen #
- LoadBalancer: WireGuard (
51194/UDP) und SSH (3022/TCP) hängen an einemLoadBalancer-Service mit fester Adresse aus dem MetalLB-Pool. - Ingress: Der Zugriff auf das Web-Portal wird über einen Ingress mit einem Hostnamen ermöglicht.
- Speicher: WireGuard-Konfigurationen und Portal-Daten liegen auf Longhorn-Volumes; die PVCs stehen in
storage.yaml.
Installation #
Die Anwendung wird mittels Kustomize und Helm durch ArgoCD im Kubernetes-Cluster bereitgestellt. Die Konfiguration befindet sich im apps/wireguard-Verzeichnis. Eine manuelle Installation kann mit folgendem Befehl durchgeführt werden:
1kubectl kustomize --enable-helm apps/wireguard | kubectl apply -n wireguard -f -Abhängigkeiten #
- Ein laufender Kubernetes-Cluster
- Traefik als Ingress-Controller
- cert-manager für das TLS-Zertifikat
- MetalLB für die LoadBalancer-Adresse
- Longhorn als Storage-Provider
- Ein erreichbares LDAP-Verzeichnis für die Anmeldung
- Das WireGuard-Kernelmodul auf den Knoten, auf denen der Pod läuft