
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, IPsec de Cisco e IKEv2.
Basada 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 o habitaciones de hotel.
Características:
- Genera automáticamente las credenciales VPN y la configuración IKEv2 en el primer inicio
- Admite IKEv2 con cifrados fuertes y rápidos (p. ej. AES-GCM)
- Genera perfiles VPN para configurar automáticamente dispositivos iOS, macOS y Android
- Admite Windows, macOS, iOS, Android, Chrome OS y Linux como clientes VPN
- Incluye un script auxiliar para gestionar usuarios y certificados IKEv2
- Compilada y publicada 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 LLMs 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
Consulta [Cómo recuperar los datos de inicio de sesión de VPN](#retrieve-vpn-login-details).
Como alternativa, 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 siguientes.
## Comunidad
- 📬 [Suscríbete para recibir actualizaciones del proyecto](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (1–2 correos electrónicos al mes) — obtén guías gratuitas de implementación de VPN e IA (PDF)
- 💬 Únete a la comunidad de [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) para discusiones
- ⭐ 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 VPN abiertos en tu firewall (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 for 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 for Windows.
## Descarga
Obtén la compilación confiable del [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
Supported platforms: `linux/amd64`, `linux/arm64` and `linux/arm/v7`.
Advanced users can [build from source code](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md) on 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.3.2 | 5.3.2 |
| 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 5 de [Libreswan](https://libreswan.org/), 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 en la VPN, que podrá ser utilizada por tus múltiples dispositivos[\*](#important-notes). La PSK de IPsec (clave precompartida) se especifica mediante la variable de entorno `VPN_IPSEC_PSK`. El nombre de usuario de la VPN se define en `VPN_USER`, y la contraseña de la VPN se especifica mediante `VPN_PASSWORD`.
Se admiten usuarios adicionales de VPN, que 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 («IPsec de Cisco»). Para IKEv2, consulte Configurar y usar la VPN IKEv2.
Nota: En su archivo env, NO ponga "" ni '' alrededor de los valores, ni añada espacios alrededor de =. NO use estos caracteres especiales dentro de los valores: \ " '. Un PSK IPsec seguro debe consistir en al menos 20 caracteres aleatorios.
Nota: Si modifica el archivo env después de que el contenedor Docker ya se haya creado, debe eliminar y volver a crear el contenedor para que los cambios surtan efecto. Consulte Actualizar imagen de Docker.
Variables de entorno adicionales
Los usuarios avanzados pueden especificar opcionalmente un nombre DNS, un nombre de cliente y/o servidores DNS personalizados.
Aprenda a 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 totalmente calificado (FQDN). Ejemplo:``` VPN_DNS_NAME=vpn.example.com
Puede especificar un nombre para el primer cliente IKEv2. Use solo una 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 servidor(es) DNS personalizados para todos los modos VPN. Ejemplo:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
Para más detalles y una lista de algunos proveedores públicos de DNS populares, consulta [Usar servidores DNS alternativos](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md).
Por defecto, no se requiere contraseña al importar la configuración de cliente IKEv2. Puedes elegir 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, puedes eliminar IKEv2 y configurarlo de nuevo usando opciones personalizadas. Consulta Configurar y usar IKEv2 VPN.
Iniciar el servidor VPN IPsec
Crea un nuevo contenedor Docker a partir de esta imagen (reemplaza ./vpn.env con tu 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 necesite recrear el contenedor de Docker, solo especifique el mismo volumen nuevamente.
Se recomienda habilitar IKEv2 al usar esta imagen. Sin embargo, si prefiere no habilitar IKEv2 y usar solo los modos IPsec/L2TP e IPsec/XAuth ("Cisco IPsec") para conectarse a la VPN, elimine 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).
### Obtener los detalles de acceso a la VPN
Si no especificó 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, revise 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 `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
Lee esto en otros idiomas: Inglés, 简体中文, 繁體中文, Русский.
Haz que tu computadora o dispositivo use la VPN. Consulta:
Configurar y usar IKEv2 VPN (recomendado)
Configurar clientes VPN IPsec/L2TP
Configurar clientes VPN IPsec/XAuth ("Cisco IPsec")
Lee 📖 libro VPN para acceder a contenido extra.
¡Disfruta de tu 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 (por ejemplo, un router doméstico).
La misma cuenta VPN puede ser utilizada por varios dispositivos. Sin embargo, debido a una limitación de IPsec/L2TP, si deseas conectar varios dispositivos desde detrás del mismo NAT (por ejemplo, un router doméstico), debes usar el modo IKEv2 o IPsec/XAuth.
Si deseas añadir, editar o eliminar cuentas de usuario VPN, primero actualiza tu archivo env, luego debes eliminar y volver a crear el contenedor Docker siguiendo las instrucciones de la siguiente sección. Los usuarios avanzados pueden hacer un bind mount del archivo env.
Para servidores con un firewall externo (por ejemplo, EC2/GCE), abre los puertos UDP 500 y 4500 para la VPN. Los usuarios de Aliyun, consulten la #433.
Los clientes están configurados para usar Google Public DNS cuando la VPN está activa. Si se prefiere otro proveedor de DNS, lee esta sección.
Actualizar la imagen de Docker
Para actualizar la imagen y el contenedor Docker, primero descarga 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 utilizando las instrucciones de Cómo usar esta imagen.
Configurar y usar IKEv2 VPN
El modo IKEv2 tiene mejoras sobre IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"), y no requiere una PSK de IPsec, nombre de usuario ni 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 puede encontrar los detalles de IKEv2, es posible que IKEv2 no esté habilitado en el contenedor. Intente actualizar la imagen y el contenedor de Docker siguiendo 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 el/los archivo(s) 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 ./
Siguientes pasos: Configura tus dispositivos para usar la VPN IKEv2.
Aprende a gestionar los clientes IKEv2.
Puedes gestionar los clientes IKEv2 mediante 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` de 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 usar 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), 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>
Eliminar IKEv2 y configurarlo 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, será **eliminada 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: Elimina ikev2-vpn-data y vuelve a crear el contenedor.
- Anota todos tus datos de inicio de sesión de 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 IKEv2 personalizadas, 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 la confidencialidad perfecta hacia adelante para IKEv2
- Acceder a otros contenedores en el host Docker
- Especificar la IP pública del servidor VPN
- Asignar IPs estáticas a los clientes VPN
- Personalizar subredes VPN
- Soporte para IPv6
- Tunelado dividido
- Acerca del modo de red del host
- Habilitar 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 a cualquier uso de una 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.
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 si la has mejorado.