En este post enseñaremos cómo crear un contenedor que se conecte a NordVPN y nos permita definir otros que se conecten a Internet usando dicha conexión.
En GitHub el usuario bubuntux ya se ha encargado de realizar el trabajo difícil y se encarga del mantenimiento de la imagen del contenedor, por lo que simplemente necesitaremos crear un archivo con la receta, tal como se especifica en las siguientes líneas:
version: "3"
services:
nordvpn-service:
image: ghcr.io/bubuntux/nordvpn
container_name: nordvpn-service
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TOKEN=f6f2bb45...
- CONNECT=es
- TECHNOLOGY=NordLynx
- NETWORK=192.168.1.0/24
sysctls:
- net.ipv6.conf.all.disable_ipv6=1 # Recomended if using ipv4 only
Las variables de entorno CONNECT y TECHNOLOGY nos permiten decidir a qué país nos conectaremos y con qué tecnología (recomendamos NordLynx, que es la versión de NordVPN del protocolo Wireguard).
En cuanto al TOKEN, hay que generarlo desde la cuenta de NordVPN y es esencial mantenerlo en secreto, como es lógico.
Siempre que sea posible es una buena práctica generarse uno mismo las imágenes y no usar las que otro ha generado y que podrían ser algún caballo de Troya más o menos importante.
En este caso, podríamos hacerlo fácilmente usando la receta a continuación:
services:
nordvpn-service:
build:
context: nordvpn/nordvpn-service
dockerfile: dockerfile
container_name: nordvpn-service
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TOKEN=f6f2bb45...
- CONNECT=es
- TECHNOLOGY=NordLynx
- TOKEN=f6f2bb45...
sysctls:
- net.ipv6.conf.all.disable_ipv6=1 # Recomended if using ipv4 only
Y descomprimiendo los archivos necesarios en el directorio nordvpn/nordvpn-service.
Recuerda que para generar la imagen tendrás que ejecutar el comando docker compose -f nordvpn.yaml build y para encender el contenedor el comando es docker compose -f nordvpn.yaml up -d –force-recreate (asumiendo que nordvpn.yaml es el archivo en el que has guardado la receta docker).
Finalmente indicar que el servicio está configurado para comprobar la conexión cada cierto tiempo, procediendo a la reconexión en caso de detectarse algún error, así como para bloquear la conexión a Internet fuera de la VPN (killswitch).
Aplicaciones prácticas
A modo de ejemplo, indicaremos varias aplicaciones prácticas y cómo configurarlas para que se conecten a Internet usando la conexión VPN descrita anteriormente.
Para que todo funcione correctamente es necesario tener en cuenta 2 consideraciones:
a) Debido a las referencias que realizaremos, las definiciones de los contenedores correspondientes tendrán que estar forzosamente en el mismo archivo yaml en el que definamos la receta del servicio nordvpn.
b) La descripción de puertos de los diferentes contenedores deberá realizarse en el contenedor nordvpn, ya que es éste el que define la conectividad.
Proxy
Un proxy es un puente o pasarela que nos permite conectarnos a Internet de forma indirecta y que, en nuestro caso, nos permitirá usar la conexión VPN establecida anteriormente para conectar cualquiera de nuestros dispositivos, lo que puede ser útil para evitar la limitación de conexiones simultáneas que establece NordVPN y, en general, cualquier servicio VPN.
La parte de la receta docker correspondiente a este servicio es la siguiente:
nordvpn-proxy:
build:
context: nordvpn/nordvpn-proxy
dockerfile: dockerfile
container_name: nordvpn-proxy
network_mode: service:nordvpn-service
depends_on:
- nordvpn-service
restart: unless-stopped
Y aquí los archivos que permiten la generación de la imagen.
Notad que, en la configuración del servicio, referenciamos al contenedor nordvpn-service, indicando que este nuevo contenedor depende de aquel y, sobretodo, que debe usarse para establecer la conexión a Internet.
El proxy está configurado para dar servicio en el puerto 3128, así que habrá que añadir ese puerto en la lista de puertos del contenedor nordvpn-service, como habíamos indicado antes, que quedaría de la siguiente manera:
services:
nordvpn-service:
build:
context: nordvpn/nordvpn-service
dockerfile: dockerfile
container_name: nordvpn-service
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TOKEN=f6f2bb45...
- CONNECT=es
- TECHNOLOGY=NordLynx
- TOKEN=f6f2bb45...
ports:
- 3128:3128
sysctls:
- net.ipv6.conf.all.disable_ipv6=1 # Recomended if using ipv4 only
qbittorrent
Modificaremos ligeramente la receta docker descrita en Github para definir un servicio que nos permita descargar archivos torrent a través de la VPN.
Notad que también podríamos hacerlo usando la conexión proxy descrita en el apartado anterior.
qbittorrent:
image: ghcr.io/linuxserver/qbittorrent
container_name: qbittorrent
network_mode: service:nordvpn-service
volumes:
- ../dockers-data-extra/qbittorrent/downloads:/downloads
environment:
- WEBUI_PORT=8099
depends_on:
- nordvpn-service
restart: unless-stopped
Recordad añadir el puerto 8099 a la lista de puertos del servicio nordvpn-service, ya que será el que nos permita acceder a la UI de qbittorrent (http://localhost:8099) y el puerto del protocolo torrent (51413).
soulseek
Soulseek es un servicio p2p que permite compartir archivos, sobretodo archivos de música, entre los usuarios, y fue bastante popular hace algunos años, al abrigo de Napster y similares.
Igual que con qbittorrent, simplemente usaremos el servicio descrito en Github modificándolo para que use la conexión VPN.
soulseek:
image: slskd/slskd
container_name: soulseek
network_mode: service:nordvpn-service
volumes:
- ../dockers-data-extra/soulseek:/app
environment:
- SLSKD_REMOTE_CONFIGURATION=true
restart: unless-stopped
Los puertos que hay que añadir son el 5030 (para conectar por http con la UI de Soulseek), el 5031 (para conectar por https con la UI de Soulseek) y el 50300 (el puerto de servicio de Soulseek).
Por último, indicar que la primera vez que accedáis a la UI (usuario slskd y contraseña slskd) deberéis configurar vuestro usuario/password de acceso al servicio:
-
clic en el icono system (arriba a la derecha)
-
clic en la pestaña options
-
clic en edit
-
buscar web y descomentar todo lo que cuelga, estableciendo además un usuario/contraseña (ambos inventados)
-
clic en save
-
reiniciar el servicio
Nota: Los archivos tar se han construído con las configuraciones indicadas en los repositorios de cada uno de los proyectos relacionados.