Guía Paso a Paso: Compartir NordVPN en Docker con Gluetun

Guía Paso a Paso: Compartir NordVPN en Docker con Gluetun
Photo by Petter Lagson / Unsplash

Hace un par de semanas cambié de VPN, pasé de PIA a NordVPN. Una de las razones principales del cambio es que quería poder compartir la VPN entre contenedores de docker, vi que había bastante documentación para NordVPN y casi nula para PIA.

Y bueno... ayer encontré gluetun, un proyecto que funciona para ambas 😅. Acá escribo el proceso que hice para poder compartir la VPN entre contenedores docker 😛. Bueno... hagámosle.

Requisitos

Sólo se me ocurren dos:

  • El contenedor que quieres que use la VPN, por ejemplo, un contenedor ejecutando algún cliente torrent como Transmission.
  • Para facilidad, el contenedor de Transmission debe estar en un stack.

Dejo un ejemplo de mi configuración:

services:
  transmission:
    image: lscr.io/linuxserver/transmission:latest
    container_name: transmission
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /tu/ruta/transmission/data:/config
      - /tu/ruta/transmission/downloads:/downloads
      - /tu/ruta/transmission/watch:/watch
    restart: unless-stopped
    ports:
      - 9091:9091

Paso 1: Agregar gluetun

Ahora agregamos el contenedor de gluetun, en este ejemplo usaremos NordVPN pero si revisas la documentación, encontrarás que gluetun tiene soporte para muchos proveedores más.

  gluetun:
    image: qmcgaw/gluetun
    container_name: gluetun
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      - VPN_SERVICE_PROVIDER=nordvpn
      - VPN_TYPE=wireguard
      - WIREGUARD_PRIVATE_KEY=...
      - SERVER_COUNTRIES=United States
      - SERVER_CITIES=Miami

Si vas a los logs del contenedor encontrarás que efectivamente se conectó alguno de los países que escogiste:

2025-03-14T01:18:06Z INFO [dns] ready
2025-03-14T01:18:07Z INFO [ip getter] Public IP address is 1.2.3.44 (United States, Florida, Miami - source: ipinfo)
2025-03-14T01:18:07Z INFO [vpn] You are running 1 commit behind the most recent latest

Paso 2: Conectar los contenedores

Ahora vamos a permitir que el contenedor de transmission use la VPN que se encuentra en el contenedor de gluetun. Para esto, debemos cambiar el modo de red del contenedor de transmission a network_mode: "service:gluetun". Este sería el yaml completo.

services:
  transmission:
    image: lscr.io/linuxserver/transmission:latest
    container_name: transmission
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /tu/ruta/transmission/data:/config
      - /tu/ruta/transmission/downloads:/downloads
      - /tu/ruta/transmission/watch:/watch
    restart: unless-stopped
    network_mode: "service:gluetun"

  gluetun:
    image: qmcgaw/gluetun
    container_name: gluetun
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      - VPN_SERVICE_PROVIDER=nordvpn
      - VPN_TYPE=wireguard
      - WIREGUARD_PRIVATE_KEY=...
      - SERVER_COUNTRIES=United States
      - SERVER_CITIES=Miami
    ports:
      - 9091:9091
      

Ah, una última cosa, la exposición de puertos se elimina del contenedor de transmission y pasa ahora al contenedor de gluetun.

Paso 3: Probar

Por último, sólo debemos probar que el contenedor de transmission esta conectado a la VPN. Para esto ingresaremos al contenedor y haremos una petición a un servicio público.

$ docker exec -ti transmission sh

root@ddee87fa4a26:/# curl ifconfig.me
1.2.3.44

Y listo! Te dejo link de NordVPN por si quieres usar mi código de referido, https://refer-nordvpn.com/VqwuTSzghfS.