L2TP/IPsec VPN mit Docker in wenigen Minuten

L2TP/IPsec VPN mit Docker in wenigen Minuten
Photo by Daniel Jerez / Unsplash

Manchmal braucht es ein klassisches VPN-Protokoll – sei es für ältere Geräte, native VPN-Clients in Windows/macOS oder als schnelle Zwischenlösung. Mit dem Docker-Image teddysun/l2tp kann man in kürzester Zeit einen L2TP/IPsec-Server aufsetzen – ohne mühsame manuelle Konfiguration auf dem Host.

L2TP/IPsec gilt als veraltet, aber für bestimmte Legacy-Zwecke oder einfache Nutzungsszenarien nach wie vor nützlich

Hier zeige ich dir, wie du mit Docker Compose einen funktionsfähigen VPN-Server aufbaust – sicher, modular und updatefähig.

Der docker-compose Stack

version: "2"
services:
  l2tp:
    image: teddysun/l2tp:3.32
    container_name: l2tp_ipsec_vpn
    restart: always
    environment:
      - VPN_IPSEC_PSK=<secret-key>
      - VPN_USER=Nucleus3347
      - VPN_PASSWORD=<secret-key>
      - VPN_PUBLIC_IP=
      - VPN_L2TP_NET=
      - VPN_L2TP_LOCAL=
      - VPN_L2TP_REMOTE=
      - VPN_XAUTH_NET=
      - VPN_XAUTH_REMOTE=
      - VPN_DNS1=9.9.9.9
      - VPN_DNS2=149.112.112.112
      - VPN_SHA2_TRUNCBUG=
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    ports:
      - '500:500/udp'
      - '4500:4500/udp'
    volumes:
        - /opt/docker/volumes/l2tp_modules:/lib/modules
    privileged: true

Konfigurationsparameter im Überblick

Variable Beschreibung
VPN_IPSEC_PSK Der Pre-Shared Key für die IPsec-Verbindung
VPN_USER Benutzername für die VPN-Einwahl
VPN_PASSWORD Passwort für den gewählten Benutzer
VPN_PUBLIC_IP Öffentliche IP oder Domain deines VPN-Servers (wird automatisch erkannt, wenn leer)
VPN_L2TP_NET Optional: eigenes Subnetz für L2TP-Clients (z. B. 192.168.42.0/24)
VPN_DNS1, DNS2 DNS-Server, die an die Clients verteilt werden (hier: Quad9)
VPN_SHA2_TRUNCBUG Workaround für bestimmte Android-Clients mit SHA2-Kompatibilitätsproblemen

Notwendige Ports

Damit Clients sich verbinden können, müssen folgende Ports (beide UDP) in der Firewall geöffnet sein:

  • 500/udp (IPsec)
  • 4500/udp (NAT-Traversal für IPsec)

Privileged Mode & Kernel-Module

Da das VPN IPsec verwendet, benötigt der Container erweiterte Rechte (privileged: true) sowie Zugriff auf die Kernel-Module des Hosts:

volumes:
  - /opt/docker/volumes/l2tp_modules:/lib/modules

Stelle sicher, dass dein Host das Modul af_key geladen hat – z. B. über:

modprobe af_key

Updates per Watchtower

Auch hier sorgt das Label

- "com.centurylinklabs.watchtower.enable=true"

dafür, dass der Container regelmäßig von Watchtower auf neue Versionen überprüft und automatisch aktualisiert wird – ideal in Kombination mit E-Mail-Benachrichtigung.

Kompatibilität

L2TP/IPsec ist nativ unterstützt auf folgenden Plattformen:

  • Windows 7–11 (ohne zusätzliche Clients)
  • macOS
  • Android (ab Werk)
  • iOS (ab Werk)

Es ist daher ein ideales Protokoll für "Bring Your Own Device"-Szenarien oder ältere Geräte, ohne dass zusätzliche Software benötigt wird.

Sicherheitshinweise

  • Vermeide den Einsatz von schwachen PSKs – verwende lange, komplexe Schlüssel (mind. 32 Zeichen)
  • L2TP/IPsec gilt als veraltet, aber für bestimmte Legacy-Zwecke oder einfache Nutzungsszenarien nach wie vor nützlich
  • Nutze idealerweise ein restriktives Firewall-Setup und überwache den Zugang

Fazit

Mit dem teddysun/l2tp-Image lässt sich ein VPN-Server für klassische Clients, unabhängig vom Hostsystem, extrem schnell umsetzen. Durch den Docker-Ansatz bleibt das Setup portabel, versioniert und leicht wartbar. Besonders bei Hybridumgebungen mit Windows- oder Apple-Geräten ist diese Lösung eine gute Ergänzung zu WireGuard oder OpenVPN.