Zum Hauptinhalt springen
  1. Beiträge/
  2. Kleines Homelab/
  3. k3s-prod: Kubernetes Cluster Konfiguration und Anwendungsbereitstellung/

WireGuard VPN Server

··477 Wörter· ·
Inhaltsverzeichnis

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 ConfigMap sshd-config.
  • /lib/modules wird vom Host als einziges hostPath durchgereicht — 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 auf true gesetzt, 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 einem LoadBalancer-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
Fabrice Kirchner
Autor
Fabrice Kirchner
stolzer Vater, Nerd, Admin