18/10/2022
En el mundo actual de la infraestructura como código y los despliegues ágiles, Docker se ha convertido en una herramienta indispensable para desarrolladores y administradores de sistemas. Sin embargo, a medida que más aplicaciones críticas se ejecutan dentro de contenedores, la seguridad se vuelve una prioridad absoluta. Exponer puertos o servicios directamente a internet puede ser arriesgado. Aquí es donde entra en juego una Red Privada Virtual o VPN, una solución robusta para crear túneles de comunicación cifrados y seguros. Integrar una VPN directamente en tu entorno Docker no solo protege tus datos, sino que también te brinda un control granular sobre el acceso a tus servicios.

Este artículo es una guía exhaustiva diseñada para enseñarte cómo implementar una solución de VPN dentro de Docker. Exploraremos dos de las opciones más populares y potentes del mercado: el consolidado OpenVPN Access Server y el moderno y veloz WireGuard. Te llevaremos de la mano desde los conceptos básicos y los requisitos previos hasta la configuración detallada, la resolución de problemas y una comparación directa para que puedas elegir la mejor opción para tus necesidades.
¿Por Qué Implementar una VPN en tu Entorno Docker?
Antes de sumergirnos en los detalles técnicos, es fundamental entender los beneficios que una VPN puede aportar a tu infraestructura de contenedores. No se trata solo de un capricho de seguridad, sino de una estrategia inteligente con ventajas tangibles:
- Comunicación Segura entre Contenedores: Permite que contenedores, incluso en diferentes hosts o redes, se comuniquen a través de un túnel cifrado, como si estuvieran en la misma red local.
- Acceso Remoto Seguro: Ofrece a los desarrolladores y administradores un método seguro para acceder a los servicios internos de la red Docker desde cualquier lugar del mundo, sin exponer puertos sensibles a la red pública.
- Aislamiento de Entornos: Puedes crear redes completamente aisladas para entornos de desarrollo, pruebas o producción, asegurando que solo el personal autorizado pueda acceder a cada una.
- Gestión Centralizada del Acceso: Una VPN te permite gestionar usuarios y políticas de acceso desde un único punto, simplificando la administración de la seguridad.
- Protección contra Ataques: Al ocultar tus servicios detrás de una VPN, reduces drásticamente la superficie de ataque expuesta a posibles amenazas en internet.
Opción 1: Desplegando OpenVPN Access Server en Docker
OpenVPN es una de las soluciones de VPN más veteranas y confiables. Su Access Server simplifica enormemente la gestión a través de una interfaz web, convirtiéndolo en una excelente opción para quienes buscan una solución robusta y con soporte completo.
Prerrequisitos
Antes de comenzar, asegúrate de tener lo siguiente:
- Docker Engine instalado: Ya sea Docker CE en un servidor Linux o Docker Desktop para Windows, macOS o Linux.
- Una dirección IP pública o un nombre de dominio: El servidor debe ser accesible desde internet para que los clientes VPN puedan conectarse.
Paso 1: Obtener la Imagen de OpenVPN Access Server
El primer paso es descargar la imagen oficial desde Docker Hub. Abre tu terminal y ejecuta el siguiente comando:
docker pull openvpn/openvpn-as
Este comando descargará la última versión de la imagen y la almacenará localmente en tu sistema. Puedes verificar que la imagen se ha descargado correctamente con docker images.
Paso 2: Ejecutar el Contenedor de OpenVPN
Para que OpenVPN funcione correctamente dentro de un contenedor, necesita permisos especiales para interactuar con la pila de red del host. El siguiente comando incluye todos los parámetros necesarios para un despliegue exitoso:
docker run -d \
--name=openvpn-as \
--device /dev/net/tun \
--cap-add=MKNOD \
--cap-add=NET_ADMIN \
-p 943:943 -p 443:443 -p 1194:1194/udp \
-v /ruta/en/tu/host/openvpn_data:/openvpn \
--restart=unless-stopped \
openvpn/openvpn-as
Analicemos los parámetros clave de este comando:
--name=openvpn-as: Asigna un nombre fácil de recordar al contenedor.--device /dev/net/tun: Proporciona al contenedor acceso al dispositivo TUN del host, esencial para el tráfico de la VPN.--cap-add=NET_ADMINy--cap-add=MKNOD: Otorgan las capacidades de Linux necesarias para administrar la red y crear nodos de dispositivo.-p 943:943 ...: Mapea los puertos necesarios. El 943 para la interfaz de administración web, el 443 para el tráfico VPN sobre TCP y el 1194 para el tráfico VPN sobre UDP (el más común).-v /ruta/en/tu/host/openvpn_data:/openvpn: Este es un paso crucial. Monta un volumen del host en el contenedor. Aquí es donde se almacenarán todos los archivos de configuración. Reemplaza/ruta/en/tu/host/openvpn_datapor una ruta real en tu sistema. Esto garantiza que tu configuración persista incluso si el contenedor se elimina y se vuelve a crear.--restart=unless-stopped: Asegura que el contenedor se inicie automáticamente con el sistema, a menos que lo detengas manualmente.
Paso 3: Acceder a la Interfaz de Administración
Una vez que el contenedor esté en funcionamiento, debes obtener la contraseña temporal para el usuario administrador por defecto, que es openvpn. Puedes encontrarla en los logs del contenedor:
docker logs -f openvpn-as
Busca una línea que diga algo como Auto-generated pass = "<contraseña>". Copia esa contraseña.
Ahora, abre tu navegador web y ve a https://TU_IP_PUBLICA:943/admin. Verás una advertencia de seguridad porque el servidor utiliza un certificado SSL autofirmado. Puedes ignorarla por ahora e iniciar sesión con el usuario openvpn y la contraseña que acabas de obtener. ¡Felicidades, ya estás dentro del panel de administración de OpenVPN Access Server!
Opción 2: Configurando WireGuard con Docker Compose
WireGuard es una alternativa más moderna a OpenVPN. Es conocido por su simplicidad, su base de código mínima y, sobre todo, su increíble rendimiento. Usar Docker Compose para desplegarlo hace que el proceso sea aún más sencillo y declarativo.
¿Qué es WireGuard en Docker?
Ejecutar WireGuard en Docker significa encapsular el servidor o cliente VPN dentro de un contenedor. Esto crea un túnel cifrado ligero que es perfecto para conectar contenedores entre sí, enlazar servidores remotos o simplemente enrutar el tráfico de una aplicación de forma segura.
Configuración con Docker Compose
Docker Compose te permite definir toda tu aplicación, incluyendo redes y volúmenes, en un único archivo YAML. Esto hace que la configuración sea reproducible y fácil de gestionar. Aquí tienes un ejemplo de un archivo docker-compose.yml para un servidor WireGuard:
version: "3"
services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
- SERVERURL=auto
- SERVERPORT=51820
- PEERS=1
- PEERDNS=auto
- INTERNAL_SUBNET=10.13.13.0
volumes:
- ./config:/config
- /lib/modules:/lib/modules
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
Para desplegarlo, simplemente guarda este contenido en un archivo llamado docker-compose.yml y ejecuta docker-compose up -d en la misma carpeta. El contenedor se iniciará y generará automáticamente los archivos de configuración para los clientes (peers) en la carpeta config que has montado.

La imagen linuxserver/wireguard es muy popular y simplifica enormemente la configuración a través de variables de entorno, como el número de clientes (PEERS) que deseas generar.
Tabla Comparativa: OpenVPN vs. WireGuard para Docker
Ambas soluciones son excelentes, pero tienen fortalezas diferentes. La elección correcta dependerá de tus prioridades.
| Característica | OpenVPN Access Server | WireGuard |
|---|---|---|
| Facilidad de Uso | Muy fácil gracias a su interfaz de administración web (Admin Web UI). Ideal para principiantes. | Más simple a nivel de protocolo, pero requiere gestionar archivos de configuración manualmente. Imágenes como la de linuxserver lo facilitan. |
| Rendimiento | Bueno y fiable, pero generalmente más lento y con mayor latencia que WireGuard. | Excepcionalmente rápido, con un rendimiento cercano al de la red nativa. Utiliza menos recursos de CPU. |
| Seguridad y Criptografía | Muy seguro, utiliza la biblioteca OpenSSL. Ha sido auditado extensamente durante años. | Utiliza criptografía moderna y de última generación. Su base de código pequeña facilita las auditorías de seguridad. |
| Flexibilidad | Altamente configurable, soporta TCP y UDP, y una gran cantidad de opciones de autenticación. | Más opinionado y menos flexible. Solo funciona sobre UDP. |
| Caso de Uso Ideal | Entornos corporativos, usuarios que necesitan una interfaz gráfica, y donde la máxima compatibilidad es clave. | Usuarios que priorizan el máximo rendimiento y la simplicidad, conexiones de sitio a sitio, y entornos automatizados. |
Preguntas Frecuentes (FAQ)
¿Es seguro ejecutar una VPN dentro de un contenedor Docker?
Sí, es una práctica muy segura siempre que se sigan las recomendaciones. Lo más importante es otorgar al contenedor solo los privilegios estrictamente necesarios (como NET_ADMIN) y asegurarse de que la configuración de la VPN (cifrado, claves, etc.) sea robusta. Además, utilizar volúmenes para la configuración persistente es fundamental.
¿Qué pasa con el rendimiento al usar una VPN en Docker?
Toda VPN introduce una pequeña sobrecarga debido al cifrado. Sin embargo, en la práctica, esta degradación puede ser mínima. WireGuard es conocido por tener un impacto casi insignificante en el rendimiento. OpenVPN puede tener un impacto ligeramente mayor. La documentación de OpenVPN Access Server menciona que el despliegue en Docker puede causar una degradación del rendimiento en instalaciones de alta carga debido a la capa de abstracción adicional.
¿Cómo reinicio la contraseña de administrador en OpenVPN Access Server?
Si pierdes u olvidas la contraseña del usuario `openvpn`, puedes restablecerla fácilmente desde la línea de comandos del host. Primero, abre un shell interactivo dentro del contenedor:
docker exec -it openvpn-as /bin/bash
Una vez dentro, ejecuta los siguientes comandos para establecer una nueva contraseña:
sacli --user "openvpn" --new_pass 'NUEVA_CONTRASEÑA' SetLocalPassword
sacli start
¿Puedo usar WireGuard como un cliente VPN dentro de un contenedor?
¡Absolutamente! Una configuración muy común es tener un contenedor (por ejemplo, un cliente de descargas) que enrute todo su tráfico a través de otro contenedor que actúa como cliente de WireGuard. Esto asegura que toda la actividad de ese contenedor específico pase por la VPN, mejorando la privacidad y la seguridad.
En conclusión, integrar una VPN en tu flujo de trabajo de Docker es un paso fundamental para fortalecer la seguridad de tu infraestructura. Tanto OpenVPN Access Server como WireGuard ofrecen soluciones potentes y fiables. OpenVPN destaca por su facilidad de gestión a través de una interfaz web, mientras que WireGuard brilla por su simplicidad y rendimiento superior. Al seguir los pasos de esta guía, estarás bien equipado para desplegar la solución que mejor se adapte a tus necesidades y llevar la seguridad de tus contenedores al siguiente nivel.
Si quieres conocer otros artículos parecidos a VPN en Docker: La Guía Completa de Seguridad puedes visitar la categoría Automovilismo.
