How to use VPN in Docker?

VPN en Docker: La Guía Completa de Seguridad

18/10/2022

Valoración: 4.31 (16645 votos)

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.

Can I run WireGuard in Docker?
Can I run WireGuard inside any Docker container? Yes, but the container needs NET_ADMIN capabilities and access to the WireGuard kernel module.

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.

Índice de Contenido

¿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_ADMIN y --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_data por 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.

How to use VPN in Docker?
FOR YOUR DEVICES TO PROPERLY CONNECT TO YOUR VPN SERVER, YOU NEED TO UPDATE THE DOMAIN OR PUBLIC IP ADDRESS: , Sign in to the Admin Web UI. , Click Configuration > Network Settings. , Change the Hostname or IP Address field to a public IP address or your domain name. Note. ... , Click Save Settings and Update Running Server.

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ísticaOpenVPN Access ServerWireGuard
Facilidad de UsoMuy 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.
RendimientoBueno 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íaMuy 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.
FlexibilidadAltamente 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 IdealEntornos 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.

Subir