
Docker IPsec VPN Server — Actualizado!
Servidor VPN IPsec basado en Docker compatible con IPsec/L2TP, Cisco IPsec e IKEv2 con generación automática de credenciales y configuración de clientes multiplataforma.
English | 简体中文 | 繁體中文 | Русский
Servidor VPN IPsec en Docker
Imagen de Docker para ejecutar un servidor VPN IPsec, con IPsec/L2TP, Cisco IPsec e IKEv2.
Basado en Alpine 3.23 o Debian 12 con Libreswan (software VPN IPsec) y xl2tpd (demonio L2TP).
Una VPN IPsec cifra tu tráfico de red, de modo que nadie entre tú y el servidor VPN pueda espiar tus datos mientras viajan por Internet. Esto es especialmente útil al usar redes no seguras, p. ej. en cafeterías, aeropuertos u hoteles.
Características:
- Genera automáticamente credenciales VPN y configuración IKEv2 en el primer inicio
- Compatible con IKEv2 con cifrados fuertes y rápidos (p. ej. AES-GCM)
- Genera perfiles VPN para configurar automáticamente dispositivos iOS, macOS y Android
- Compatible con Windows, macOS, iOS, Android, Chrome OS y Linux como clientes VPN
- Incluye un script auxiliar para gestionar usuarios y certificados IKEv2
- Compilado y publicado automáticamente mediante GitHub Actions
- Datos persistentes mediante un volumen de Docker
- Multi-arquitectura:
linux/amd64,linux/arm64,linux/arm/v7
También disponible:
- VPN: IPsec sin Docker, WireGuard, OpenVPN, Headscale
- IA: Self-Hosted AI Stack para LLM locales, chat, RAG, voz y herramientas de IA
- 📚 Libros: The Self-Hosted AI Builder’s Guide, Privacy Tools in the Age of AI
Inicio rápido
Usa este comando para configurar un servidor VPN IPsec en 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
Tus datos de acceso a la VPN se generarán aleatoriamente. Consulta [Recuperar datos de acceso a la VPN](#retrieve-vpn-login-details).
Alternativamente, puedes [configurar IPsec VPN sin Docker](https://github.com/hwdsl2/setup-ipsec-vpn). Para obtener más información sobre cómo usar esta imagen, lee las secciones a continuación.
## Comunidad
- 📬 [Suscríbete para recibir actualizaciones del proyecto](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (1–2 correos al mes) — obtén guías gratuitas de despliegue de VPN e IA (PDF)
- 💬 Únete a la comunidad [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) para debates
- ⭐ Marca el repositorio con una estrella si te resulta útil — ayuda a que otros lo descubran
## Requisitos
- Un servidor Linux con una dirección IP pública o un nombre DNS
- Docker instalado
- Puertos de VPN abiertos en tu cortafuegos (UDP 500 y 4500)
- También puedes usar [Podman](https://docs.podman.io) para ejecutar esta imagen, después de crear un alias para `docker`
**Nota:** Los usuarios avanzados pueden usar esta imagen en macOS con [Docker para Mac](https://docs.docker.com/desktop/setup/install/mac-install/). Antes de usar el modo IPsec/L2TP, es posible que debas reiniciar el contenedor una vez con `docker restart ipsec-vpn-server`. Esta imagen no es compatible con Docker para Windows.
## Descarga
Obtén la compilación confiable desde el [registro de Docker Hub](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/):```bash
docker pull hwdsl2/ipsec-vpn-server
Alternativamente, puedes descargar desde Quay.io:```bash docker pull quay.io/hwdsl2/ipsec-vpn-server docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
Plataformas compatibles: `linux/amd64`, `linux/arm64` y `linux/arm/v7`.
Los usuarios avanzados pueden [compilar desde el código fuente](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#build-from-source-code) en GitHub.
### Comparación de imágenes
Hay dos imágenes precompiladas disponibles. La imagen predeterminada basada en Alpine tiene solo ~19 MB.
| | Basada en Alpine | Basada en Debian |
| ----------------- | ------------------------ | ------------------------------ |
| Nombre de la imagen | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| Tamaño comprimido | ~ 19 MB | ~ 62 MB |
| Imagen base | Alpine Linux 3.23 | Debian Linux 12 |
| Plataformas | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Versión de Libreswan | 5.4 | 5.4 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**Nota:** Para usar la imagen basada en Debian, reemplace cada `hwdsl2/ipsec-vpn-server` por `hwdsl2/ipsec-vpn-server:debian` en este README. Estas imágenes no son actualmente compatibles con los sistemas Synology NAS.
<details>
<summary>
Quiero usar la versión anterior de Libreswan 4.
</summary>
Generalmente se recomienda usar la última versión de [Libreswan](https://libreswan.org/) 5, que es la versión predeterminada en este proyecto. Sin embargo, si desea usar la versión anterior de Libreswan 4, puede compilar la imagen de Docker desde el código fuente:```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 .
Cómo usar esta imagen
Variables de entorno
Nota: Todas las variables de esta imagen son opcionales, lo que significa que no tienes que escribir ninguna variable y puedes tener un servidor VPN IPsec listo para usar. Para ello, crea un archivo env vacío usando touch vpn.env y pasa a la siguiente sección.
Esta imagen de Docker utiliza las siguientes variables, que pueden declararse en un archivo env (consulta el ejemplo):```
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
Esto creará una cuenta de usuario para el inicio de sesión de VPN, que puede ser utilizada por tus múltiples dispositivos[\*](#notas-importantes). La PSK de IPsec (clave precompartida) se especifica mediante la variable de entorno `VPN_IPSEC_PSK`. El nombre de usuario de VPN se define en `VPN_USER`, y la contraseña de VPN se especifica mediante `VPN_PASSWORD`.
Se admiten usuarios de VPN adicionales, y pueden declararse opcionalmente en tu archivo `env` de esta manera. Los nombres de usuario y las contraseñas deben estar separados por espacios, y los nombres de usuario no pueden contener duplicados. Todos los usuarios de VPN compartirán la misma PSK de IPsec.```
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
Las variables anteriores son solo para los modos IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"). Para IKEv2, consulte Configurar y usar VPN IKEv2.
Nota: En su archivo env, NO ponga "" o '' alrededor de los valores, ni agregue espacios alrededor de =. NO use estos caracteres especiales dentro de los valores: \ " '. Una PSK IPsec segura debe consistir en al menos 20 caracteres aleatorios.
Nota: Si modifica el archivo env después de que el contenedor Docker ya esté creado, debe eliminar y volver a crear el contenedor para que los cambios surtan efecto. Consulte Actualizar imagen Docker.
Variables de entorno adicionales
Los usuarios avanzados pueden especificar opcionalmente un nombre DNS, un nombre de cliente y/o servidores DNS personalizados.
Aprenda cómo especificar un nombre DNS, un nombre de cliente y/o servidores DNS personalizados.
Los usuarios avanzados pueden especificar opcionalmente un nombre DNS para la dirección del servidor IKEv2. El nombre DNS debe ser un nombre de dominio completamente calificado (FQDN). Ejemplo:``` VPN_DNS_NAME=vpn.example.com
Puede especificar un nombre para el primer cliente IKEv2. Use una sola palabra, sin caracteres especiales excepto `-` y `_`. El valor predeterminado es `vpnclient` si no se especifica.```
VPN_CLIENT_NAME=your_client_name
Por defecto, los clientes están configurados para usar Google Public DNS cuando la VPN está activa. Puedes especificar servidores DNS personalizados para todos los modos de VPN. Ejemplo:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
Para obtener más detalles y una lista de algunos proveedores públicos de DNS populares, consulte [Usar servidores DNS alternativos](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md).
De forma predeterminada, no se requiere contraseña al importar la configuración del cliente IKEv2. Puede optar por proteger los archivos de configuración del cliente con una contraseña aleatoria.```
VPN_PROTECT_CONFIG=yes
Nota: Las variables anteriores no tienen efecto para el modo IKEv2, si IKEv2 ya está configurado en el contenedor Docker. En este caso, puede eliminar IKEv2 y configurarlo nuevamente usando opciones personalizadas. Consulte Configurar y usar VPN IKEv2.
Iniciar el servidor VPN IPsec
Cree un nuevo contenedor Docker a partir de esta imagen (reemplace ./vpn.env con su propio archivo 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
En este comando, usamos la opción `-v` de `docker run` para crear un nuevo [volumen de Docker](https://docs.docker.com/storage/volumes/) llamado `ikev2-vpn-data`, y montarlo en `/etc/ipsec.d` dentro del contenedor. Los datos relacionados con IKEv2, como certificados y claves, se conservarán en el volumen, y más adelante, cuando necesites volver a crear el contenedor de Docker, solo especifica el mismo volumen nuevamente.
Se recomienda habilitar IKEv2 al usar esta imagen. Sin embargo, si prefieres no habilitar IKEv2 y usar solo los modos IPsec/L2TP e IPsec/XAuth ("Cisco IPsec") para conectarte a la VPN, elimina la primera opción `-v` del comando `docker run` anterior.
**Nota:** Los usuarios avanzados también pueden [ejecutar sin modo privilegiado](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#run-without-privileged-mode).
### Obtener los detalles de inicio de sesión de la VPN
Si no especificaste un archivo `env` en el comando `docker run` anterior, `VPN_USER` tendrá como valor predeterminado `vpnuser` y tanto `VPN_IPSEC_PSK` como `VPN_PASSWORD` se generarán aleatoriamente. Para obtenerlos, consulta los registros del contenedor:```bash
docker logs ipsec-vpn-server
Busca estas líneas en la salida:``` 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
La salida también incluirá detalles para el modo IKEv2, si está habilitado.
(Opcional) Realiza una copia de seguridad de los detalles de inicio de sesión de VPN generados (si los hay) en el directorio actual:```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
Usando docker-compose```bash
cp vpn.env.example vpn.env
Edit vpn.env if needed, then:
docker compose up -d docker logs ipsec-vpn-server
Ejemplo de `docker-compose.yml` (ya incluido):```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
Próximos pasos
Lea esto en otros idiomas: English, 简体中文, 繁體中文, Русский.
Haga que su computadora o dispositivo use la VPN. Consulte:
Configurar y usar VPN IKEv2 (recomendado)
Configurar clientes VPN IPsec/L2TP
Configurar clientes VPN IPsec/XAuth ("Cisco IPsec")
Lea 📖 VPN book para acceder a contenido adicional.
¡Disfrute de su propia VPN! ✨🎉🚀✨
Notas importantes
Usuarios de Windows: Para el modo IPsec/L2TP, se requiere un cambio de registro único si el servidor o cliente VPN está detrás de NAT (p. ej. router doméstico).
La misma cuenta VPN puede ser utilizada por varios de sus dispositivos. Sin embargo, debido a una limitación de IPsec/L2TP, si desea conectar varios dispositivos desde detrás del mismo NAT (p. ej. router doméstico), debe usar el modo IKEv2 o IPsec/XAuth.
Si desea agregar, editar o eliminar cuentas de usuario VPN, primero actualice su archivo env y luego debe eliminar y volver a crear el contenedor Docker siguiendo las instrucciones de la siguiente sección. Los usuarios avanzados pueden montar enlazado el archivo env.
Para servidores con un firewall externo (p. ej. EC2/GCE), abra los puertos UDP 500 y 4500 para la VPN. Usuarios de Aliyun, consulte #433.
Los clientes están configurados para usar Google Public DNS cuando la VPN está activa. Si prefiere otro proveedor de DNS, lea esta sección.
Actualizar imagen Docker
Para actualizar la imagen y el contenedor Docker, primero descargue la última versión:```bash docker pull hwdsl2/ipsec-vpn-server
Si la imagen de Docker ya está actualizada, deberías ver:```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
De lo contrario, descargará la última versión. Para actualizar su contenedor Docker, primero anote sus datos de inicio de sesión de VPN. Luego elimine el contenedor Docker con docker rm -f ipsec-vpn-server. Finalmente, vuelva a crearlo usando las instrucciones de Cómo usar esta imagen.
Configurar y usar VPN IKEv2
El modo IKEv2 tiene mejoras sobre IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"), y no requiere una PSK de IPsec, nombre de usuario o contraseña. Lea más aquí.
Primero, revise los registros del contenedor para ver los detalles de IKEv2:```bash docker logs ipsec-vpn-server
**Nota:** Si no puedes encontrar los detalles de IKEv2, es posible que IKEv2 no esté habilitado en el contenedor. Intenta actualizar la imagen de Docker y el contenedor usando las instrucciones de la sección [Actualizar imagen de Docker](#update-docker-image).
Durante la configuración de IKEv2, se crea un cliente IKEv2 (con el nombre predeterminado `vpnclient`), cuya configuración se exporta a `/etc/ipsec.d` **dentro del contenedor**. Para copiar los archivos de configuración al host de 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 ./
Próximos pasos: Configura tus dispositivos para usar la VPN IKEv2.
Aprende cómo gestionar los clientes IKEv2.
Puedes gestionar los clientes IKEv2 usando el script auxiliar. Consulta los ejemplos a continuación. Para personalizar las opciones del cliente, ejecuta el script sin argumentos.```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:** Si encuentras el error "executable file not found", reemplaza `ikev2.sh` arriba con `/opt/src/ikev2.sh`.
</details>
<details>
<summary>
Aprende cómo cambiar la dirección del servidor IKEv2.
</summary>
En ciertas circunstancias, es posible que necesites cambiar la dirección del servidor IKEv2. Por ejemplo, para cambiar a un nombre DNS, o después de que cambie la IP del servidor. Para cambiar la dirección del servidor IKEv2, primero [abre un shell bash dentro del contenedor](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#bash-shell-inside-container), luego [sigue estas instrucciones](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#change-ikev2-server-address). Ten en cuenta que los registros del contenedor no mostrarán la nueva dirección del servidor IKEv2 hasta que reinicies el contenedor Docker.
</details>
<details>
<summary>
Elimina IKEv2 y configúralo de nuevo usando opciones personalizadas.
</summary>
En ciertas circunstancias, es posible que necesites eliminar IKEv2 y configurarlo de nuevo usando opciones personalizadas.
**Advertencia:** Toda la configuración de IKEv2, incluidos certificados y claves, se **eliminará permanentemente**. ¡Esto **no se puede deshacer**!
**Opción 1:** Elimina IKEv2 y configúralo de nuevo usando el script auxiliar.
Ten en cuenta que esto sobrescribirá las variables que especificaste en el archivo `env`, como `VPN_DNS_NAME` y `VPN_CLIENT_NAME`, y los registros del contenedor ya no mostrarán información actualizada para 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
Opción 2: Eliminar ikev2-vpn-data y volver a crear el contenedor.
- Anota todos tus datos de acceso a la VPN.
- Elimina el contenedor Docker:
docker rm -f ipsec-vpn-server. - Elimina el volumen
ikev2-vpn-data:docker volume rm ikev2-vpn-data. - Actualiza tu archivo
envy añade opciones personalizadas de IKEv2 comoVPN_DNS_NAMEyVPN_CLIENT_NAME, y luego vuelve a crear el contenedor. Consulta Cómo usar esta imagen.
Uso avanzado
Consulta Uso avanzado.
- Usar servidores DNS alternativos
- Ejecutar sin modo privilegiado
- Seleccionar modos de VPN
- Habilitar el secreto perfecto hacia adelante de IKEv2
- Acceder a otros contenedores en el host de Docker
- Especificar la IP pública del servidor VPN
- Asignar IPs estáticas a los clientes VPN
- Personalizar las subredes de la VPN
- Soporte IPv6
- Tunelización dividida
- Acerca del modo de red del host
- Habilitar los registros de Libreswan
- Comprobar el estado del servidor
- Compilar desde el código fuente
- Shell Bash dentro del contenedor
- Montar el archivo env mediante bind mount
- Implementar el control de congestión Google BBR
Detalles técnicos
Hay dos servicios en ejecución: Libreswan (pluto) para la VPN IPsec, y xl2tpd para el soporte L2TP.
La configuración IPsec predeterminada admite:
- IPsec/L2TP con PSK
- IKEv1 con PSK y XAuth ("Cisco IPsec")
- IKEv2
Puertos requeridos: 500/udp y 4500/udp (IPsec)
Licencia
Nota: Los componentes de software dentro de la imagen precompilada (como Libreswan y xl2tpd) están sujetos a las respectivas licencias elegidas por sus respectivos titulares de derechos de autor. En cuanto al uso de cualquier imagen precompilada, es responsabilidad del usuario de la imagen asegurarse de que cualquier uso de esta imagen cumpla con las licencias pertinentes de todo el software incluido en ella.
Copyright (C) 2016-2026 Lin Song 
Basado en el trabajo de Thomas Sarlandie (Copyright 2012)

Esta obra está bajo la Licencia Creative Commons Atribución-CompartirIgual 3.0 Unported
Se requiere atribución: incluye mi nombre en cualquier obra derivada y házmelo saber cómo la has mejorado.