
Docker IPsec VPN Server — Updated!
Server VPN IPsec basato su Docker con supporto per IPsec/L2TP, Cisco IPsec e IKEv2, generazione automatica delle credenziali e configurazione client multi-piattaforma.
English | 简体中文 | 繁體中文 | Русский
Server IPsec VPN su Docker
Immagine Docker per eseguire un server VPN IPsec, con IPsec/L2TP, Cisco IPsec e IKEv2.
Basata su Alpine 3.23 o Debian 12 con Libreswan (software VPN IPsec) e xl2tpd (demone L2TP).
Una VPN IPsec crittografa il tuo traffico di rete, così che nessuno tra te e il server VPN possa intercettare i tuoi dati mentre viaggiano su Internet. Questo è particolarmente utile quando si utilizzano reti non sicure, ad esempio in bar, aeroporti o camere d'albergo.
Caratteristiche:
- Genera automaticamente le credenziali VPN e la configurazione IKEv2 al primo avvio
- Supporta IKEv2 con cifrari forti e veloci (es. AES-GCM)
- Genera profili VPN per configurare automaticamente dispositivi iOS, macOS e Android
- Supporta Windows, macOS, iOS, Android, Chrome OS e Linux come client VPN
- Include uno script di supporto per gestire utenti e certificati IKEv2
- Compilata e pubblicata automaticamente tramite GitHub Actions
- Dati persistenti tramite un volume Docker
- Multi-architettura:
linux/amd64,linux/arm64,linux/arm/v7
Disponibile anche:
- VPN: IPsec senza Docker, WireGuard, OpenVPN, Headscale
- AI: Self-Hosted AI Stack per LLM locali, chat, RAG, voce e strumenti AI
- 📚 Libri: The Self-Hosted AI Builder’s Guide, Privacy Tools in the Age of AI
Avvio rapido
Usa questo comando per configurare un server VPN IPsec su Docker:```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
I tuoi dati di accesso VPN verranno generati casualmente. Vedi [Recupera i dati di accesso VPN](#retrieve-vpn-login-details).
In alternativa, puoi [configurare IPsec VPN senza Docker](https://github.com/hwdsl2/setup-ipsec-vpn). Per saperne di più su come utilizzare questa immagine, leggi le sezioni seguenti.
## Community
- 📬 [Iscriviti per aggiornamenti sul progetto](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (1–2 email al mese) — ricevi guide gratuite su VPN e AI (PDF)
- 💬 Unisciti alla community [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) per discussioni
- ⭐ Metti una stella al repository se lo trovi utile — aiuta altri a scoprirlo
## Requisiti
- Un server Linux con un indirizzo IP pubblico o un nome DNS
- Docker installato
- Porte VPN aperte nel firewall (UDP 500 e 4500)
- Puoi anche usare [Podman](https://docs.podman.io) per eseguire questa immagine, dopo aver creato un alias per `docker`
**Nota:** Gli utenti avanzati possono usare questa immagine su macOS con [Docker for Mac](https://docs.docker.com/desktop/setup/install/mac-install/). Prima di usare la modalità IPsec/L2TP, potrebbe essere necessario riavviare il container una volta con `docker restart ipsec-vpn-server`. Questa immagine non supporta Docker for Windows.
## Download
Ottieni la build affidabile dal [registro Docker Hub](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/):```bash
docker pull hwdsl2/ipsec-vpn-server
In alternativa, puoi scaricare da Quay.io:```bash docker pull quay.io/hwdsl2/ipsec-vpn-server docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
Piattaforme supportate: `linux/amd64`, `linux/arm64` e `linux/arm/v7`.
Gli utenti avanzati possono [compilare dal codice sorgente](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#build-from-source-code) su GitHub.
### Confronto delle immagini
Sono disponibili due immagini precompilate. L'immagine predefinita basata su Alpine è di soli ~19 MB.
| | Basata su Alpine | Basata su Debian |
| ----------------- | ------------------------ | ------------------------------ |
| Nome immagine | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| Dimensione compressa | ~ 19 MB | ~ 62 MB |
| Immagine base | Alpine Linux 3.23 | Debian Linux 12 |
| Piattaforme | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Versione Libreswan | 5.4 | 5.4 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**Nota:** Per utilizzare l'immagine basata su Debian, sostituisci ogni `hwdsl2/ipsec-vpn-server` con `hwdsl2/ipsec-vpn-server:debian` in questo README. Queste immagini non sono attualmente compatibili con i sistemi Synology NAS.
<details>
<summary>
Voglio usare la versione precedente di Libreswan 4.
</summary>
In generale si consiglia di utilizzare l'ultima versione di [Libreswan](https://libreswan.org/) 5, che è la versione predefinita in questo progetto. Tuttavia, se desideri utilizzare la versione precedente di Libreswan 4, puoi compilare l'immagine Docker dal codice sorgente:```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 .
Come usare questa immagine
Variabili d'ambiente
Nota: Tutte le variabili di questa immagine sono opzionali, il che significa che non devi inserire alcuna variabile e puoi avere un server VPN IPsec pronto all'uso! Per farlo, crea un file env vuoto usando touch vpn.env e passa alla sezione successiva.
Questa immagine Docker utilizza le seguenti variabili, che possono essere dichiarate in un file env (vedi esempio):```
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
Questo creerà un account utente per l'accesso VPN, che potrà essere utilizzato dai tuoi più dispositivi[\*](#note-importanti). Il PSK IPsec (chiave pre-condivisa) è specificato dalla variabile d'ambiente `VPN_IPSEC_PSK`. Il nome utente VPN è definito in `VPN_USER`, e la password VPN è specificata da `VPN_PASSWORD`.
Sono supportati utenti VPN aggiuntivi, che possono essere opzionalmente dichiarati nel tuo file `env` in questo modo. I nomi utente e le password devono essere separati da spazi, e i nomi utente non possono contenere duplicati. Tutti gli utenti VPN condivideranno lo stesso PSK IPsec.```
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
Le variabili sopra si applicano solo alle modalità IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"). Per IKEv2, consulta Configurare e utilizzare la VPN IKEv2.
Nota: Nel tuo file env, NON inserire "" o '' attorno ai valori, né aggiungere spazi attorno a =. NON utilizzare questi caratteri speciali all'interno dei valori: \ " '. Una PSK IPsec sicura dovrebbe essere composta da almeno 20 caratteri casuali.
Nota: Se modifichi il file env dopo che il container Docker è già stato creato, devi rimuovere e ricreare il container affinché le modifiche abbiano effetto. Fai riferimento a Aggiornare l'immagine Docker.
Variabili d'ambiente aggiuntive
Gli utenti avanzati possono opzionalmente specificare un nome DNS, un nome client e/o server DNS personalizzati.
Scopri come specificare un nome DNS, un nome client e/o server DNS personalizzati.
Gli utenti avanzati possono opzionalmente specificare un nome DNS per l'indirizzo del server IKEv2. Il nome DNS deve essere un nome di dominio completamente qualificato (FQDN). Esempio:``` VPN_DNS_NAME=vpn.example.com
Puoi specificare un nome per il primo client IKEv2. Usa una sola parola, senza caratteri speciali tranne `-` e `_`. Il valore predefinito è `vpnclient` se non specificato.```
VPN_CLIENT_NAME=your_client_name
Di default, i client sono configurati per utilizzare Google Public DNS quando la VPN è attiva. Puoi specificare uno o più server DNS personalizzati per tutte le modalità VPN. Esempio:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
Per maggiori dettagli e un elenco di alcuni popolari provider DNS pubblici, consulta [Usare server DNS alternativi](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md).
Per impostazione predefinita, non è richiesta alcuna password quando si importa la configurazione del client IKEv2. Puoi scegliere di proteggere i file di configurazione del client utilizzando una password casuale.```
VPN_PROTECT_CONFIG=yes
Nota: Le variabili sopra non hanno effetto per la modalità IKEv2, se IKEv2 è già configurato nel container Docker. In questo caso, puoi rimuovere IKEv2 e configurarlo di nuovo utilizzando opzioni personalizzate. Fare riferimento a Configurare e utilizzare la VPN IKEv2.
Avviare il server VPN IPsec
Crea un nuovo container Docker da questa immagine (sostituisci ./vpn.env con il tuo file env):```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 questo comando, usiamo l'opzione `-v` di `docker run` per creare un nuovo [volume Docker](https://docs.docker.com/storage/volumes/) chiamato `ikev2-vpn-data` e montarlo in `/etc/ipsec.d` nel container. I dati relativi a IKEv2, come certificati e chiavi, verranno conservati nel volume e, in seguito, quando dovrai ricreare il container Docker, ti basterà specificare di nuovo lo stesso volume.
Si consiglia di abilitare IKEv2 quando si utilizza questa immagine. Tuttavia, se preferisci non abilitare IKEv2 e utilizzare solo le modalità IPsec/L2TP e IPsec/XAuth ("Cisco IPsec") per connetterti alla VPN, rimuovi la prima opzione `-v` dal comando `docker run` sopra.
**Nota:** Gli utenti avanzati possono anche [eseguire senza modalità privilegiata](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#run-without-privileged-mode).
### Recuperare i dettagli di accesso VPN
Se non hai specificato un file `env` nel comando `docker run` sopra, `VPN_USER` sarà impostato di default su `vpnuser` e sia `VPN_IPSEC_PSK` che `VPN_PASSWORD` verranno generati casualmente. Per recuperarli, visualizza i log del container:```bash
docker logs ipsec-vpn-server
Cerca queste righe nell'output:``` 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
L'output includerà anche i dettagli per la modalità IKEv2, se abilitata.
(Facoltativo) Esegui il backup dei dettagli di accesso VPN generati (se presenti) nella directory corrente:```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
Utilizzo di docker-compose```bash
cp vpn.env.example vpn.env
Edit vpn.env if needed, then:
docker compose up -d docker logs ipsec-vpn-server
Esempio `docker-compose.yml` (già incluso):```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
Passaggi successivi
Leggi questo in altre lingue: English, 简体中文, 繁體中文, Русский.
Configura il tuo computer o dispositivo per utilizzare la VPN. Fai riferimento a:
Configurare e utilizzare la VPN IKEv2 (consigliata)
Configurare i client VPN IPsec/L2TP
Configurare i client VPN IPsec/XAuth ("Cisco IPsec")
Leggi 📖 VPN book per accedere a contenuti extra.
Goditi la tua VPN personale! ✨🎉🚀✨
Note importanti
Utenti Windows: per la modalità IPsec/L2TP, è necessaria una modifica una tantum al registro se il server o il client VPN si trova dietro NAT (es. router domestico).
Lo stesso account VPN può essere utilizzato da più dispositivi. Tuttavia, a causa di una limitazione di IPsec/L2TP, se desideri connettere più dispositivi da dietro lo stesso NAT (es. router domestico), devi utilizzare la modalità IKEv2 o IPsec/XAuth.
Se desideri aggiungere, modificare o rimuovere account utente VPN, aggiorna prima il tuo file env, quindi devi rimuovere e ricreare il contenitore Docker utilizzando le istruzioni della sezione successiva. Gli utenti avanzati possono montare il file env.
Per i server con firewall esterno (es. EC2/GCE), apri le porte UDP 500 e 4500 per la VPN. Utenti Aliyun, vedere #433.
I client sono configurati per utilizzare Google Public DNS quando la VPN è attiva. Se preferisci un altro provider DNS, leggi questa sezione.
Aggiornare l'immagine Docker
Per aggiornare l'immagine e il contenitore Docker, prima scarica la versione più recente:```bash docker pull hwdsl2/ipsec-vpn-server
Se l'immagine Docker è già aggiornata, dovresti vedere:```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
Altrimenti, scaricherà l'ultima versione. Per aggiornare il tuo container Docker, annota prima i tuoi dettagli di accesso VPN. Quindi rimuovi il container Docker con docker rm -f ipsec-vpn-server. Infine, ricrealo utilizzando le istruzioni in Come usare questa immagine.
Configurare e usare la VPN IKEv2
La modalità IKEv2 presenta miglioramenti rispetto a IPsec/L2TP e IPsec/XAuth ("Cisco IPsec") e non richiede una PSK IPsec, un nome utente o una password. Leggi di più qui.
Per prima cosa, controlla i log del container per visualizzare i dettagli per IKEv2:```bash docker logs ipsec-vpn-server
**Nota:** Se non riesci a trovare i dettagli IKEv2, potrebbe non essere abilitato nel container. Prova ad aggiornare l'immagine Docker e il container seguendo le istruzioni nella sezione [Aggiornare l'immagine Docker](#update-docker-image).
Durante la configurazione di IKEv2, viene creato un client IKEv2 (con nome predefinito `vpnclient`), la cui configurazione viene esportata in `/etc/ipsec.d` **all'interno del container**. Per copiare i file di configurazione sull'host Docker:```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 ./
Passaggi successivi: Configura i tuoi dispositivi per utilizzare la VPN IKEv2.
Scopri come gestire i client IKEv2.
Puoi gestire i client IKEv2 utilizzando lo script di supporto. Vedi gli esempi di seguito. Per personalizzare le opzioni del client, esegui lo script senza argomenti.```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
**Nota:** Se riscontri l'errore "executable file not found", sostituisci `ikev2.sh` sopra con `/opt/src/ikev2.sh`.
</details>
<details>
<summary>
Scopri come cambiare l'indirizzo del server IKEv2.
</summary>
In determinate circostanze, potresti dover cambiare l'indirizzo del server IKEv2. Ad esempio, per passare all'uso di un nome DNS, o dopo che l'IP del server è cambiato. Per cambiare l'indirizzo del server IKEv2, prima [apri una shell bash all'interno del container](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#bash-shell-inside-container), poi [segui queste istruzioni](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#change-ikev2-server-address). Nota che i log del container non mostreranno il nuovo indirizzo del server IKEv2 finché non riavvii il container Docker.
</details>
<details>
<summary>
Rimuovi IKEv2 e configuralo di nuovo utilizzando opzioni personalizzate.
</summary>
In determinate circostanze, potresti dover rimuovere IKEv2 e configurarlo di nuovo utilizzando opzioni personalizzate.
**Avvertenza:** Tutta la configurazione IKEv2, inclusi certificati e chiavi, verrà **eliminata definitivamente**. Questa operazione **non può essere annullata**!
**Opzione 1:** Rimuovi IKEv2 e configuralo di nuovo utilizzando lo script di supporto.
Nota che questo sovrascriverà le variabili specificate nel file `env`, come `VPN_DNS_NAME` e `VPN_CLIENT_NAME`, e i log del container non mostreranno più informazioni aggiornate per IKEv2.```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
Opzione 2: Rimuovi ikev2-vpn-data e ricrea il container.
- Annota tutti i tuoi dettagli di accesso VPN.
- Rimuovi il container Docker:
docker rm -f ipsec-vpn-server. - Rimuovi il volume
ikev2-vpn-data:docker volume rm ikev2-vpn-data. - Aggiorna il tuo file
enve aggiungi opzioni IKEv2 personalizzate comeVPN_DNS_NAMEeVPN_CLIENT_NAME, quindi ricrea il container. Fai riferimento a Come usare questa immagine.
Utilizzo avanzato
Vedi Utilizzo avanzato.
- Usa server DNS alternativi
- Esegui senza modalità privilegiata
- Seleziona le modalità VPN
- Abilita la segretezza perfetta in avanti IKEv2
- Accedi ad altri container sull'host Docker
- Specifica l'IP pubblico del server VPN
- Assegna IP statici ai client VPN
- Personalizza le sottoreti VPN
- Supporto IPv6
- Split tunneling
- Informazioni sulla modalità rete host
- Abilita i log di Libreswan
- Controlla lo stato del server
- Compila dal codice sorgente
- Shell Bash all'interno del container
- Monta il file env con bind mount
- Distribuisci il controllo della congestione Google BBR
Dettagli tecnici
Sono in esecuzione due servizi: Libreswan (pluto) per la VPN IPsec e xl2tpd per il supporto L2TP.
La configurazione IPsec predefinita supporta:
- IPsec/L2TP con PSK
- IKEv1 con PSK e XAuth ("Cisco IPsec")
- IKEv2
Porte richieste: 500/udp e 4500/udp (IPsec)
Licenza
Nota: I componenti software all'interno dell'immagine precompilata (come Libreswan e xl2tpd) sono soggetti alle rispettive licenze scelte dai rispettivi detentori del copyright. Come per qualsiasi utilizzo di immagini precompilate, è responsabilità dell'utente dell'immagine garantire che qualsiasi utilizzo di questa immagine sia conforme a tutte le licenze pertinenti per tutti i software in essa contenuti.
Copyright (C) 2016-2026 Lin Song 
Basato su il lavoro di Thomas Sarlandie (Copyright 2012)

Quest'opera è distribuita con licenza Creative Commons Attribuzione - Condividi allo stesso modo 3.0 Unported
È richiesta l'attribuzione: includi il mio nome in qualsiasi opera derivata e fammi sapere come l'hai migliorata!