Sicheres VPN mit Wireguard und wg-easy

WireGuard ist ein modernes VPN-Protokoll, das sich durch eine einfache Implementierung, eine hohe Sicherheit sowie hohe Geschwindigkeit auszeichnet. Einsatzmöglichkeiten sind z.B sichere Verbindungen aus dem Homeoffice ins Büro, als Zugangspunkt zu Serversystemen oder zur Verbindung lokaler Netzwerke von entfernten Standorten. Im folgenden wird kurz beschrieben, wie ein eigener Wireguard VPN-Server mit Docker eingerichtet werden kann.

Voraussetzungen

Die Installationsbeispiele basieren auf folgenden Umgebung:

  • (Virtueller) Server mit Debian 11, Docker und docker-compose
  • nginx (+ letsencrypt) als reverse Proxy für die wg-easy Administrationsoberfläche

wg-easy

Wireguard ist bereits in vielen modernen Linux-Kernen enthalten und entwickelt sich immer mehr zum Standard. Es ist im Vergleich zu Lösungen wie OpenVPN schnell und benötigt weniger Ressourcen. Es gibt eine Vielzahl an Konfigurationsoptionen, die in textbasierten Konfigurationsdateien hinterlegt werden können. Um diese doch recht komplexe Konfiguration zu vereinfachen gibt es diverse Tools wie wireguard-ui oder wg-easy 

Setup wg-easy mit docker-compose

Sind Docker und docker-compose eingerichtet, kann wg-easy mittels folgender Konfiguration gestartet werden:

version: "3.3"
services:
  wg-easy:
    environment:
      # !! Required:
      # Change this to your host's public address
      - WG_HOST=some.domain.com

      # Optional:
      - PASSWORD=somesecurepassword
      - WG_ALLOWED_IPS=0.0.0.0/0
      #- WG_PORT=51820
      #- WG_DEFAULT_ADDRESS=10.8.0.x
      #- WG_DEFAULT_DNS=4.4.4.4
      #- WG_MTU=1420
      #- WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      #- WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      #- WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      
    image: weejewel/wg-easy
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    #restart: unless-stopped
    restart: always
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    logging:
      options:
        max-size: "2m"
        max-file: "20"

Anschließend wird der Container mittels docker-compose up -d gestartet.

Die korrekte nginx Proxykonfiguration vorausgesetzt ist das Admin-Interface nun über z.B. https://some.domain.com erreichbar:

Hier können nun Profile für einzelne Benutzer:innen angelegt werden. Die jeweilige Konfiguration kann heruntergeladen und in einem der vielen Wireguard-Clients (Windows, Linux, Mac, Android, iOS) geladen werden (https://www.wireguard.com/install/). 

Verbindet sich ein Client erfolgreich mit dem Wireguard-Server, wird der gesamte Netzwerkverkehr über diese Verbindung geroutet. D.h. die Clients sind nun mit der identischen statischen IP des Wireguard-Servers im Internet unterwegs. So lässt sich z.B. der Zugriff auf IP-geschützte Ressourcen einfach regeln.

Als weitere Ergänzung kann der Wireguard-Server in ein (virtuelles) lokales Netzwerk eingebunden werden. So kann der Zugriff auf besonders sensible Daten ausschließlich über dieses lokale Netzwerk erfolgen und ist nicht mehr über das Internet möglich.

Sonstiges

Ist eine externe Firewall vorgeschaltet (dringend zu empfehlen), so muss an dieser zwingend der Port 51820 (UDP) freigeschaltet werden. Ohne diesen kann der Wireguard Server nicht von den Clients erreicht werden.

Zudem ist es empfehlenswert, den Zugriff auf das wg-easy Interface nur für verbundene VPN-Clients zu erlauben und dieses nicht öffentlich im Internet bereitzustellen. Selbst mit einem starken Passwort ist das Risiko viel zu hoch, dass Unbefugte Zugriff erhalten.

prev Automatische Verbindung von SSH über einen Proxy
next Integration von KI / AI in TYPO3