En ocasiones, no queda más remedio que conectar contenedores Docker al servidor VPN para obtener conexión desde y hacia ellos. Una opción es instalar el cliente o servidor Wireguard directamente sobre el servidor; sin embargo, puede que lo hayamos instalado como contenedor Docker para facilitar su gestión.
En ese caso, no tendríamos acceso a los contenedores que también están instalados en el servidor VPN, ya que estarían aislados. La solución aquí pasa por crear un contenedor Gluetun que hará de cliente VPN y al que se «adjuntarán» los contenedores Docker a los que queramos facilitar el acceso.
Así, en mi caso, he instalado Nginx Proxy Manager en el servidor VPN (dos contenedores: Nginx Proxy Manager y Wireguard Easy). Una opción sería abrir los puertos de Nginx Proxy Manager, pero entonces quedarían expuestos todos los servicios conectados a la VPN, y yo lo que quiero es facilitar la resolución de nombres, pero requiriendo de conexión a la VPN.
Gluetun es la solución para conectar contenedores Docker a Wireguard
El primer paso es acceder al servidor Wireguard y generar un nuevo cliente, que luego usaremos para conectar el contenedor Gluetun al servidor VPN.
Para ello, iniciamos sesión en Wireguard y pulsamos en «New». Le daremos un nombre descriptivo al nuevo cliente.
Después, pulsamos en el icono de descarga para obtener el fichero de configuración que nos dará los parámetros necesarios.
Del fichero de configuración vamos a necesitar los siguientes datos: Address, PrivateKey, PublicKey, PresharedKey y el Endpoint.
El siguiente paso es crear un Stack, que no deja de ser una forma de crear contenedores de forma masiva con el código de Docker Compose. Para esto, vamos a Portainer > Stacks y pulsamos en «Add stack».
Con el siguiente código, vamos a crear el contenedor Gluetun. Después, lo complicaremos algo más para añadir los servicios que irán conectados a la VPN a través de Gluetun (en este caso, Nginx Proxy Manager). Tendréis que usar los valores que hemos recopilado del archivo de configuración para reemplazarlos en el siguiente código:
version: "3"
services:
gluetun:
image: qmcgaw/gluetun
cap_add:
- NET_ADMIN
environment:
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=wireguard
- VPN_ENDPOINT_IP=<IP del servidor VPN>
- VPN_ENDPOINT_PORT=51820
- WIREGUARD_PUBLIC_KEY=<PublicKey>
- WIREGUARD_PRIVATE_KEY=<PrivateKey>
- WIREGUARD_PRESHARED_KEY=<PresharedKey>
- WIREGUARD_ADDRESSES=<IP del cliente>
Cuando finalicemos, solo tendremos que pulsar en «Deploy the stack» y veremos que aparece un nuevo contenedor en ejecución.
Si volvemos a la interfaz web de Wireguard Easy, veremos que el cliente está conectado.
Ahora, vamos a crear los dos volúmenes que necesitamos para instalar Nginx Proxy Manager: ngixn-proxy-manager-ssl_data y ngixn-proxy-manager_data. Para ello, en Portainer, vamos a Volumes y pulsamos en «Add volume».
Solo tenemos que darle un nombre y pulsar en «Create the volume».
Ahora, vamos a darle una vuelta de tuerca. Eliminamos el stack anterior y generamos uno nuevo con el siguiente código, que añadirá Nginx Proxy Manager al stack.
Aparte de los datos del fichero de configuración que hemos utilizado antes, tendremos que dedicar especial atención a los puertos que vamos a necesitar abrir. Estos puertos se añadirán al apartado «ports» de Gluetun (NO del servicio que vamos a añadir) especificando la IP 0.0.0.0 antes de ellos. Además, tendremos que incluir los puertos en la variable de entorno FIREWALL_VPN_INPUT_PORTS.
version: "3"
services:
gluetun:
image: qmcgaw/gluetun
cap_add:
- NET_ADMIN
environment:
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=wireguard
- VPN_ENDPOINT_IP=<IP del servidor>
- VPN_ENDPOINT_PORT=51820
- WIREGUARD_PUBLIC_KEY=<PublicKey>
- WIREGUARD_PRIVATE_KEY=<PrivateKey>
- WIREGUARD_PRESHARED_KEY=<PresharedKey>
- WIREGUARD_ADDRESSES=<IP del cliente>
- FIREWALL_VPN_INPUT_PORTS=80,81,443
ports:
- 0.0.0.0:80:80
- 0.0.0.0:81:81
- 0.0.0.0:443:443
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
volumes:
- nginx-proxy-manager_data:/data
- nginx-proxy-manager-ssl_data:/etc/letsencrypt
restart: unless-stopped
network_mode: service:gluetun
volumes:
nginx-proxy-manager_data:
nginx-proxy-manager-ssl_data:
Ahora, probamos la conexión accediendo a la IP del cliente VPN de Gluetun en el puerto que hemos abierto. En este caso, el puerto 81.