
Docker IPsec VPN Server — Updated!
Docker-basierter IPsec-VPN-Server mit Unterstützung für IPsec/L2TP, Cisco IPsec und IKEv2 sowie automatischer Generierung von Zugangsdaten und plattformübergreifender Client-Konfiguration.
English | 简体中文 | 繁體中文 | Русский
IPsec-VPN-Server auf Docker
Docker-Image zum Betreiben eines IPsec-VPN-Servers mit IPsec/L2TP, Cisco IPsec und IKEv2.
Basiert auf Alpine 3.23 oder Debian 12 mit Libreswan (IPsec-VPN-Software) und xl2tpd (L2TP-Daemon).
Ein IPsec-VPN verschlüsselt Ihren Netzwerkverkehr, sodass niemand zwischen Ihnen und dem VPN-Server Ihre Daten abhören kann, während sie über das Internet übertragen werden. Dies ist besonders nützlich bei ungesicherten Netzwerken, z. B. in Cafés, Flughäfen oder Hotelzimmern.
Funktionen:
- Generiert automatisch VPN-Anmeldedaten und IKEv2-Konfiguration beim ersten Start
- Unterstützt IKEv2 mit starken und schnellen Ciphern (z. B. AES-GCM)
- Generiert VPN-Profile zur automatischen Konfiguration von iOS-, macOS- und Android-Geräten
- Unterstützt Windows, macOS, iOS, Android, Chrome OS und Linux als VPN-Clients
- Enthält ein Hilfsskript zur Verwaltung von IKEv2-Benutzern und -Zertifikaten
- Automatisch erstellt und veröffentlicht über GitHub Actions
- Persistente Daten über ein Docker-Volume
- Multi-Arch:
linux/amd64,linux/arm64,linux/arm/v7
Ebenfalls verfügbar:
- VPN: IPsec ohne Docker, WireGuard, OpenVPN, Headscale
- KI: Self-Hosted AI Stack für lokale LLMs, Chat, RAG, Sprache und KI-Tools
- 📚 Bücher: The Self-Hosted AI Builder’s Guide, Privacy Tools in the Age of AI
Schnellstart
Verwenden Sie diesen Befehl, um einen IPsec-VPN-Server auf Docker einzurichten:```bash
docker run
--name ipsec-vpn-server
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
Ihre VPN-Anmeldedaten werden zufällig generiert. Siehe [VPN-Anmeldedaten abrufen](#retrieve-vpn-login-details).
Alternativ können Sie [IPsec-VPN ohne Docker einrichten](https://github.com/hwdsl2/setup-ipsec-vpn). Um mehr über die Verwendung dieses Images zu erfahren, lesen Sie die folgenden Abschnitte.
## Community
- 📬 [Projektupdates abonnieren](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (1–2 E-Mails/Monat) — erhalten Sie kostenlose VPN- und KI-Bereitstellungsanleitungen (PDF)
- 💬 Treten Sie der [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/)-Community für Diskussionen bei
- ⭐ Markieren Sie das Repository mit einem Stern, wenn Sie es nützlich finden — das hilft anderen, es zu entdecken
## Anforderungen
- Ein Linux-Server mit einer öffentlichen IP-Adresse oder einem DNS-Namen
- Docker installiert
- VPN-Ports in Ihrer Firewall geöffnet (UDP 500 und 4500)
- Sie können dieses Image auch mit [Podman](https://docs.podman.io) ausführen, nachdem Sie einen Alias für `docker` erstellt haben
**Hinweis:** Fortgeschrittene Benutzer können dieses Image auf macOS mit [Docker für Mac](https://docs.docker.com/desktop/setup/install/mac-install/) verwenden. Vor der Verwendung des IPsec/L2TP-Modus müssen Sie den Container möglicherweise einmal mit `docker restart ipsec-vpn-server` neu starten. Dieses Image unterstützt Docker für Windows nicht.
## Download
Holen Sie sich den vertrauenswürdigen Build aus der [Docker-Hub-Registry](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/):```bash
docker pull hwdsl2/ipsec-vpn-server
Alternativ kannst du von Quay.io herunterladen:```bash docker pull quay.io/hwdsl2/ipsec-vpn-server docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
Unterstützte Plattformen: `linux/amd64`, `linux/arm64` und `linux/arm/v7`.
Fortgeschrittene Benutzer können den [Quellcode auf GitHub erstellen](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#build-from-source-code).
### Bildvergleich
Zwei vorgefertigte Images sind verfügbar. Das standardmäßige Alpine-basierte Image ist nur etwa 19 MB groß.
| | Alpine-basiert | Debian-basiert |
| ----------------- | ------------------------ | ------------------------------ |
| Image-Name | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| Komprimierte Größe | ~ 19 MB | ~ 62 MB |
| Basis-Image | Alpine Linux 3.23 | Debian Linux 12 |
| Plattformen | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Libreswan-Version | 5.4 | 5.4 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**Hinweis:** Um das Debian-basierte Image zu verwenden, ersetzen Sie in dieser README jedes `hwdsl2/ipsec-vpn-server` durch `hwdsl2/ipsec-vpn-server:debian`. Diese Images sind derzeit nicht mit Synology-NAS-Systemen kompatibel.
<details>
<summary>
Ich möchte die ältere Libreswan-Version 4 verwenden.
</summary>
Es wird generell empfohlen, die neueste [Libreswan](https://libreswan.org/)-Version 5 zu verwenden, die die Standardversion in diesem Projekt ist. Wenn Sie jedoch die ältere Libreswan-Version 4 verwenden möchten, können Sie das Docker-Image aus dem Quellcode erstellen:```bash
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server
cd docker-ipsec-vpn-server
# Specify Libreswan version 4
sed -i 's/SWAN_VER=5\..*/SWAN_VER=4.15/' Dockerfile Dockerfile.debian
# To build Alpine-based image
docker build -t hwdsl2/ipsec-vpn-server .
# To build Debian-based image
docker build -f Dockerfile.debian -t hwdsl2/ipsec-vpn-server:debian .
So verwenden Sie dieses Image
Umgebungsvariablen
Hinweis: Alle Variablen für dieses Image sind optional, d. h. Sie müssen keine Variable eingeben und können sofort einen IPsec-VPN-Server nutzen! Erstellen Sie dazu eine leere env-Datei mit touch vpn.env und fahren Sie mit dem nächsten Abschnitt fort.
Dieses Docker-Image verwendet die folgenden Variablen, die in einer env-Datei deklariert werden können (siehe Beispiel):```
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
Dies erstellt ein Benutzerkonto für den VPN-Login, das von mehreren Ihrer Geräte genutzt werden kann[\*](#important-notes). Der IPsec-PSK (Pre-Shared Key) wird über die Umgebungsvariable `VPN_IPSEC_PSK` festgelegt. Der VPN-Benutzername wird in `VPN_USER` definiert, und das VPN-Passwort wird über `VPN_PASSWORD` angegeben.
Zusätzliche VPN-Benutzer werden unterstützt und können optional in Ihrer `env`-Datei wie folgt deklariert werden. Benutzernamen und Passwörter müssen durch Leerzeichen getrennt sein, und Benutzernamen dürfen keine Duplikate enthalten. Alle VPN-Benutzer teilen sich denselben IPsec-PSK.```
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
Die obigen Variablen gelten nur für die IPsec/L2TP- und IPsec/XAuth-("Cisco IPsec")-Modi. Für IKEv2 siehe IKEv2-VPN konfigurieren und verwenden.
Hinweis: Setzen Sie in Ihrer env-Datei KEINE "" oder '' um Werte und fügen Sie KEINE Leerzeichen um = hinzu. Verwenden Sie KEINE dieser Sonderzeichen innerhalb von Werten: \ " '. Ein sicheres IPsec-PSK sollte aus mindestens 20 zufälligen Zeichen bestehen.
Hinweis: Wenn Sie die env-Datei ändern, nachdem der Docker-Container bereits erstellt wurde, müssen Sie den Container entfernen und neu erstellen, damit die Änderungen wirksam werden. Siehe Docker-Image aktualisieren.
Zusätzliche Umgebungsvariablen
Fortgeschrittene Benutzer können optional einen DNS-Namen, einen Client-Namen und/oder benutzerdefinierte DNS-Server angeben.
Erfahren Sie, wie Sie einen DNS-Namen, einen Client-Namen und/oder benutzerdefinierte DNS-Server angeben.
Fortgeschrittene Benutzer können optional einen DNS-Namen für die IKEv2-Serveradresse angeben. Der DNS-Name muss ein vollqualifizierter Domänenname (FQDN) sein. Beispiel:``` VPN_DNS_NAME=vpn.example.com
Sie können einen Namen für den ersten IKEv2-Client angeben. Verwenden Sie nur ein Wort, ohne Sonderzeichen außer `-` und `_`. Der Standardwert ist `vpnclient`, falls nichts angegeben wird.```
VPN_CLIENT_NAME=your_client_name
Standardmäßig sind Clients so eingestellt, dass sie bei aktiver VPN-Verbindung Google Public DNS verwenden. Sie können für alle VPN-Modi benutzerdefinierte DNS-Server angeben. Beispiel:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
Für weitere Details und eine Liste einiger beliebter öffentlicher DNS-Anbieter siehe [Alternative DNS-Server verwenden](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md).
Standardmäßig ist beim Importieren der IKEv2-Clientkonfiguration kein Passwort erforderlich. Sie können wahlweise die Client-Konfigurationsdateien mit einem zufälligen Passwort schützen.```
VPN_PROTECT_CONFIG=yes
Hinweis: Die oben genannten Variablen haben keine Auswirkung auf den IKEv2-Modus, wenn IKEv2 bereits im Docker-Container eingerichtet ist. In diesem Fall können Sie IKEv2 entfernen und es mit benutzerdefinierten Optionen erneut einrichten. Siehe IKEv2-VPN konfigurieren und verwenden.
IPsec-VPN-Server starten
Erstellen Sie einen neuen Docker-Container aus diesem Image (ersetzen Sie ./vpn.env durch Ihre eigene env-Datei):```bash
docker run
--name ipsec-vpn-server
--env-file ./vpn.env
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
In diesem Befehl verwenden wir die Option `-v` von `docker run`, um ein neues [Docker-Volume](https://docs.docker.com/storage/volumes/) mit dem Namen `ikev2-vpn-data` zu erstellen und es im Container in `/etc/ipsec.d` einzuhängen. IKEv2-bezogene Daten wie Zertifikate und Schlüssel bleiben im Volume erhalten. Wenn Sie später den Docker-Container neu erstellen müssen, geben Sie einfach dasselbe Volume erneut an.
Es wird empfohlen, IKEv2 bei Verwendung dieses Images zu aktivieren. Wenn Sie IKEv2 jedoch nicht aktivieren möchten und nur die IPsec/L2TP- und IPsec/XAuth-Modi („Cisco IPsec") zur Verbindung mit dem VPN verwenden möchten, entfernen Sie die erste Option `-v` aus dem obigen Befehl `docker run`.
**Hinweis:** Fortgeschrittene Benutzer können auch [ohne privilegierten Modus ausführen](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#run-without-privileged-mode).
### VPN-Anmeldedaten abrufen
Wenn Sie im obigen Befehl `docker run` keine `env`-Datei angegeben haben, wird `VPN_USER` standardmäßig auf `vpnuser` gesetzt und sowohl `VPN_IPSEC_PSK` als auch `VPN_PASSWORD` werden zufällig generiert. Um sie abzurufen, sehen Sie sich die Container-Logs an:```bash
docker logs ipsec-vpn-server
Suchst du nach diesen Zeilen in der Ausgabe:``` Connect to your new VPN with these details:
Server IP: your_vpn_server_ip IPsec PSK: your_ipsec_pre_shared_key Username: your_vpn_username Password: your_vpn_password
Die Ausgabe enthält auch Details für den IKEv2-Modus, sofern dieser aktiviert ist.
(Optional) Sichern Sie die generierten VPN-Anmeldedaten (falls vorhanden) im aktuellen Verzeichnis:```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
Verwenden von docker-compose```bash
cp vpn.env.example vpn.env
Edit vpn.env if needed, then:
docker compose up -d docker logs ipsec-vpn-server
Beispiel `docker-compose.yml` (bereits enthalten):```yaml
volumes:
ikev2-vpn-data:
services:
vpn:
image: hwdsl2/ipsec-vpn-server
restart: always
env_file:
- ./vpn.env
ports:
- "500:500/udp"
- "4500:4500/udp"
privileged: true
hostname: ipsec-vpn-server
container_name: ipsec-vpn-server
volumes:
- ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro
Nächste Schritte
In anderen Sprachen lesen: Englisch, 简体中文, 繁體中文, Русский.
Lassen Sie Ihren Computer oder Ihr Gerät das VPN verwenden. Siehe dazu:
IKEv2-VPN konfigurieren und verwenden (empfohlen)
IPsec/L2TP-VPN-Clients konfigurieren
IPsec/XAuth-("Cisco IPsec")-VPN-Clients konfigurieren
Lesen Sie 📖 VPN-Buch, um auf zusätzliche Inhalte zuzugreifen.
Genießen Sie Ihr eigenes VPN! ✨🎉🚀✨
Wichtige Hinweise
Windows-Benutzer: Für den IPsec/L2TP-Modus ist eine einmalige Registrierungsänderung erforderlich, wenn sich der VPN-Server oder -Client hinter NAT befindet (z. B. Heimrouter).
Dasselbe VPN-Konto kann von mehreren Ihrer Geräte verwendet werden. Aufgrund einer IPsec/L2TP-Einschränkung müssen Sie jedoch den IKEv2- oder IPsec/XAuth-Modus verwenden, wenn Sie mehrere Geräte hinter demselben NAT (z. B. Heimrouter) verbinden möchten.
Wenn Sie VPN-Benutzerkonten hinzufügen, bearbeiten oder entfernen möchten, aktualisieren Sie zuerst Ihre env-Datei und entfernen Sie dann den Docker-Container und erstellen Sie ihn gemäß den Anweisungen im nächsten Abschnitt neu. Fortgeschrittene Benutzer können die env-Datei per Bind-Mount einbinden.
Für Server mit einer externen Firewall (z. B. EC2/GCE) öffnen Sie die UDP-Ports 500 und 4500 für das VPN. Aliyun-Benutzer siehe #433.
Clients sind so eingestellt, dass sie bei aktivem VPN Google Public DNS verwenden. Wenn ein anderer DNS-Anbieter bevorzugt wird, lesen Sie diesen Abschnitt.
Docker-Image aktualisieren
Um das Docker-Image und den Container zu aktualisieren, laden Sie zuerst die neueste Version herunter:```bash docker pull hwdsl2/ipsec-vpn-server
Wenn das Docker-Image bereits auf dem neuesten Stand ist, sollten Sie Folgendes sehen:```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
Andernfalls wird die neueste Version heruntergeladen. Um Ihren Docker-Container zu aktualisieren, notieren Sie sich zunächst Ihre VPN-Anmeldedaten. Entfernen Sie dann den Docker-Container mit docker rm -f ipsec-vpn-server. Erstellen Sie ihn schließlich mit den Anweisungen aus So verwenden Sie dieses Image neu.
IKEv2-VPN konfigurieren und verwenden
Der IKEv2-Modus bietet Verbesserungen gegenüber IPsec/L2TP und IPsec/XAuth ("Cisco IPsec") und benötigt kein IPsec-PSK, keinen Benutzernamen und kein Passwort. Lesen Sie mehr hier.
Überprüfen Sie zunächst die Container-Logs, um Details für IKEv2 anzuzeigen:```bash docker logs ipsec-vpn-server
**Hinweis:** Wenn Sie keine IKEv2-Details finden, ist IKEv2 möglicherweise nicht im Container aktiviert. Versuchen Sie, das Docker-Image und den Container mithilfe der Anweisungen im Abschnitt [Docker-Image aktualisieren](#update-docker-image) zu aktualisieren.
Während der IKEv2-Einrichtung wird ein IKEv2-Client (mit dem Standardnamen `vpnclient`) erstellt, dessen Konfiguration nach `/etc/ipsec.d` **innerhalb des Containers** exportiert wird. Um die Konfigurationsdatei(en) auf den Docker-Host zu kopieren:```bash
# Check contents of /etc/ipsec.d in the container
docker exec -it ipsec-vpn-server ls -l /etc/ipsec.d
# Example: Copy a client config file from the container
# to the current directory on the Docker host
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ./
Nächste Schritte: Konfigurieren Sie Ihre Geräte, um das IKEv2-VPN zu verwenden.
Erfahren Sie, wie Sie IKEv2-Clients verwalten.
Sie können IKEv2-Clients mithilfe des Hilfsskripts verwalten. Beispiele finden Sie unten. Um Client-Optionen anzupassen, führen Sie das Skript ohne Argumente aus.```bash
Add a new client (using default options)
docker exec -it ipsec-vpn-server ikev2.sh --addclient [client name]
Export configuration for an existing client
docker exec -it ipsec-vpn-server ikev2.sh --exportclient [client name]
List existing clients
docker exec -it ipsec-vpn-server ikev2.sh --listclients
Show usage
docker exec -it ipsec-vpn-server ikev2.sh -h
**Hinweis:** Wenn der Fehler "executable file not found" auftritt, ersetzen Sie `ikev2.sh` oben durch `/opt/src/ikev2.sh`.
</details>
<details>
<summary>
Erfahren Sie, wie Sie die IKEv2-Serveradresse ändern.
</summary>
Unter bestimmten Umständen müssen Sie möglicherweise die IKEv2-Serveradresse ändern. Zum Beispiel, um auf einen DNS-Namen umzustellen oder nach einer Änderung der Server-IP. Um die IKEv2-Serveradresse zu ändern, öffnen Sie zunächst [eine Bash-Shell innerhalb des Containers](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#bash-shell-inside-container) und [befolgen Sie dann diese Anweisungen](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#change-ikev2-server-address). Beachten Sie, dass die Container-Logs die neue IKEv2-Serveradresse erst anzeigen, nachdem Sie den Docker-Container neu gestartet haben.
</details>
<details>
<summary>
IKEv2 entfernen und mit benutzerdefinierten Optionen neu einrichten.
</summary>
Unter bestimmten Umständen müssen Sie möglicherweise IKEv2 entfernen und es mit benutzerdefinierten Optionen neu einrichten.
**Warnung:** Die gesamte IKEv2-Konfiguration einschließlich Zertifikaten und Schlüsseln wird **dauerhaft gelöscht**. Dies **kann nicht rückgängig gemacht werden**!
**Option 1:** Entfernen Sie IKEv2 und richten Sie es mit dem Hilfsskript neu ein.
Beachten Sie, dass dadurch Variablen überschrieben werden, die Sie in der `env`-Datei angegeben haben, wie z. B. `VPN_DNS_NAME` und `VPN_CLIENT_NAME`, und die Container-Logs zeigen keine aktuellen Informationen für IKEv2 mehr an.```bash
# Remove IKEv2 and delete all IKEv2 configuration
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# Set up IKEv2 again using custom options
docker exec -it ipsec-vpn-server ikev2.sh
Option 2: Entfernen Sie ikev2-vpn-data und erstellen Sie den Container neu.
- Notieren Sie sich alle Ihre VPN-Anmeldedaten.
- Entfernen Sie den Docker-Container:
docker rm -f ipsec-vpn-server. - Entfernen Sie das Volume
ikev2-vpn-data:docker volume rm ikev2-vpn-data. - Aktualisieren Sie Ihre
env-Datei und fügen Sie benutzerdefinierte IKEv2-Optionen wieVPN_DNS_NAMEundVPN_CLIENT_NAMEhinzu, und erstellen Sie dann den Container neu. Siehe Verwendung dieses Images.
Erweiterte Nutzung
Siehe Erweiterte Nutzung.
- Alternative DNS-Server verwenden
- Ohne privilegierten Modus ausführen
- VPN-Modi auswählen
- Perfect Forward Secrecy für IKEv2 aktivieren
- Auf andere Container auf dem Docker-Host zugreifen
- Öffentliche IP des VPN-Servers angeben
- Statische IPs für VPN-Clients zuweisen
- VPN-Subnetze anpassen
- IPv6-Unterstützung
- Split Tunneling
- Über den Host-Netzwerkmodus
- Libreswan-Protokolle aktivieren
- Serverstatus prüfen
- Aus dem Quellcode erstellen
- Bash-Shell im Container
- Die env-Datei per Bind Mount einbinden
- Google BBR-Überlastungskontrolle bereitstellen
Technische Details
Es laufen zwei Dienste: Libreswan (pluto) für das IPsec-VPN und xl2tpd für die L2TP-Unterstützung.
Die Standard-IPsec-Konfiguration unterstützt:
- IPsec/L2TP mit PSK
- IKEv1 mit PSK und XAuth („Cisco IPsec")
- IKEv2
Erforderliche Ports: 500/udp und 4500/udp (IPsec)
Lizenz
Hinweis: Die Softwarekomponenten im vorgefertigten Image (wie Libreswan und xl2tpd) unterliegen den jeweiligen Lizenzen, die von ihren jeweiligen Urheberrechtsinhabern gewählt wurden. Wie bei jeder Verwendung eines vorgefertigten Images liegt es in der Verantwortung des Image-Nutzers, sicherzustellen, dass jede Verwendung dieses Images mit allen relevanten Lizenzen für alle darin enthaltenen Softwarekomponenten übereinstimmt.
Copyright (C) 2016-2026 Lin Song 
Basierend auf der Arbeit von Thomas Sarlandie (Copyright 2012)

Dieses Werk ist lizenziert unter der Creative Commons Attribution-ShareAlike 3.0 Unported License
Namensnennung erforderlich: Bitte nennen Sie meinen Namen in jedem abgeleiteten Werk und lassen Sie mich wissen, wie Sie es verbessert haben!