Guía completa: Jellyfin + NordVPN en WSL2 con enrutamiento selectivo desde Windows
Objetivo: ejecutar Jellyfin dentro de WSL2 (Ubuntu) saliendo a Internet por NordVPN, y desde Windows enrutar solo las apps que quieras a través de ese túnel mediante un proxy SOCKS5 (Dante) y herramientas como ProxyCap/Proxifier o alternativas.
Escenario recomendado: Windows 10 Home/Pro (build ≥ 19045), WSL2 con Ubuntu 22.04 (Jammy), cliente NordVPN para Linux, Dante como SOCKS5, y (opcional) Caddy en Windows como reverse proxy hacia Jellyfin.
0) Topología (visión rápida)
-
WSL2/Ubuntu
-
nordvpn→ interfaz nordlynx (WireGuard) → Internet -
jellyfin→ escucha en0.0.0.0:8096 -
dante-server(SOCKS5) → escucha en WSLWSL_IP:1080 -
(opcional)
socatonetsh portproxy→ expone 127.0.0.1:10800 en Windows → redirige aWSL_IP:1080
-
-
Windows
-
Apps con ProxyCap/Proxifier → usan
SOCKS5 127.0.0.1:10800→ salen por la VPN de WSL -
(opcional) Caddy reverse proxy →
https://jellyfin.tudominio/→WSL_IP:8096
-
Nota importante sobre "bridged": El modo bridged de WSL2 exige el servicio de conmutador de Hyper‑V (
vmswitch), disponible en Windows Pro/Enterprise. En Windows Home, WSL2 usa NAT y bridged no funcionará (error0x8037010d). Esta guía asume NAT (lo más estable), con portproxy/socat para exponer servicios.
1) Preparación de WSL
1.1. Comprobar WSL y versiones
En PowerShell (admin):
wsl -l -v # Distros y versión (1/2)
wsl --status # Info del motor y versión por defecto
1.2. Activar WSL2 como versión por defecto
wsl --set-default-version 2
Para convertir una distro existente (ej. Ubuntu):
wsl --set-version Ubuntu 2
Si tu Ubuntu era muy antiguo (18.04), actualiza a 22.04. Puedes crear una distro nueva desde Microsoft Store (Ubuntu 22.04) o hacer
do-release-upgrade(ver 1.4).
1.3. Actualizar el motor WSL (recomendado)
wsl --update
1.4. Actualizar Ubuntu (si venías de 18.04/20.04)
Dentro de WSL/Ubuntu:
sudo apt update && sudo apt -y dist-upgrade
sudo apt -y install update-manager-core
sudo do-release-upgrade
# Sigue el asistente hasta llegar a 22.04 (jammy)
Tras el upgrade, reinicia WSL:
wsl --shutdown
1.5. Activar systemd en WSL (imprescindible para servicios)
Dentro de WSL:
echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf
Reinicia WSL desde Windows:
wsl --shutdown
Vuelve a entrar y comprueba:
systemctl --version # debe responder
2) Instalar y configurar NordVPN en WSL
2.1. Instalación
sudo apt update
sudo apt install -y curl apt-transport-https
sh <(curl -sSf https://downloads.nordcdn.com/apps/linux/install.sh)
2.2. Servicio y login
# Arrancar el servicio del demonio
sudo systemctl enable --now nordvpnd
# Login (abre navegador en Windows). Si no abre, copia/pega el enlace en Windows.
nordvpn login
Si el login del navegador te da problemas (p.ej. bloqueo Cloudflare):
-
Ejecuta el login normal
nordvpn loginy, cuando veas la página de “Continue”, copia la URL del botón y usa:
nordvpn login --callback "PEGAR_AQUI_LA_URL_DEL_BOTON_CONTINUE"
2.3. Conexión y ajustes útiles
nordvpn connect # país/servidor automático
# Sugerencias:
# nordvpn set technology nordlynx # suele ser el predeterminado y el más rápido
# nordvpn set autoconnect on # reconexión automática
# nordvpn settings # revisar flags disponibles (LAN discovery, etc.)
Comprueba IP pública desde WSL:
curl -s https://ifconfig.me ; echo
3) Instalar Jellyfin en WSL (Ubuntu 22.04)
3.1. Repositorio oficial e instalación
curl -fsSL https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/jellyfin.gpg
echo "deb [signed-by=/usr/share/keyrings/jellyfin.gpg] https://repo.jellyfin.org/ubuntu jammy main" \
| sudo tee /etc/apt/sources.list.d/jellyfin.list
sudo apt update
sudo apt install -y jellyfin
3.2. Servicio Jellyfin
sudo systemctl enable --now jellyfin
sudo systemctl status jellyfin
Jellyfin escucha por defecto en http://0.0.0.0:8096. Prueba local:
curl -s http://localhost:8096 | head -n 5
3.3. Usar bibliotecas desde Windows
Tus discos de Windows están en /mnt/<letra>:
-
C:\Users\<user>\Videos→/mnt/c/Users/<user>/Videos -
D:\Peliculas→/mnt/d/Peliculas
En el asistente web de Jellyfin añade estas rutas como bibliotecas.
Permisos: normalmente basta lectura. Si necesitas escribir carátulas/metadata, asegúrate de que el usuario
jellyfintenga permisos (o usa una carpeta de datos en el propio WSL para metadata).
Rendimiento: grandes scans sobre
/mnt/cpueden ser algo más lentos que en el FS nativo de WSL. Si notas lentitud, considera mover solo la metadata al FS de WSL (/var/lib/jellyfin) y dejar el contenido en/mnt/c.
4) Crear un proxy SOCKS5 en WSL (Dante) y exponerlo a Windows
4.1. Instalar Dante y Socat
sudo apt update
sudo apt install -y dante-server socat
4.2. Configurar Dante (/etc/danted.conf)
Ejemplo mínimo (abre el fichero):
sudo nano /etc/danted.conf
Contenido sugerido:
# /etc/danted.conf
logoutput: /var/log/danted.log
# Escucha en la IP de WSL (ajústala si quieres solo local). Obténla con: hostname -I
internal: 0.0.0.0 port = 1080
# Saca el tráfico por la interfaz VPN de NordVPN (nordlynx)
external: nordlynx
# Sin autenticación local (puedes añadir user/pass si lo necesitas)
method: none
clientmethod: none
user.notprivileged: nobody
# Permitir clientes de la máquina local y red LAN
client pass {
from: 127.0.0.1/8 to: 0.0.0.0/0
log: connect disconnect error
}
client pass {
from: 192.168.0.0/16 to: 0.0.0.0/0
}
# Permitir todo por defecto (solo CONNECT)
pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: connect
}
4.3. Arrancar el servicio
sudo systemctl enable --now danted
sudo ss -tuln | grep 1080 # debería mostrar LISTEN en 0.0.0.0:1080
4.4. Exponer el proxy a Windows como 127.0.0.1:10800
Con WSL en NAT, a veces Windows no alcanza
WSL_IP:1080directamente. Lo más fiable es crear un portproxy en Windows.
En PowerShell (admin) en Windows:
# Obtén la IP de WSL desde Windows
$WSLIP = wsl.exe hostname -I | ForEach-Object { $_.Split(' ')[0] }
# Crea el portproxy localhost:10800 -> WSL_IP:1080
netsh interface portproxy add v4tov4 `
listenaddress=127.0.0.1 listenport=10800 `
connectaddress=$WSLIP connectport=1080
# (Opcional) Regla de firewall (no suele hacer falta para loopback, pero por si acaso)
netsh advfirewall firewall add rule name="WSL SOCKS5 10800" dir=in action=allow protocol=TCP localport=10800
Comprobar desde Windows:
Test-NetConnection -ComputerName 127.0.0.1 -Port 10800
curl.exe https://ifconfig.me --proxy socks5://127.0.0.1:10800
La IP devuelta debe ser la de NordVPN.
Alternativa con socat: puedes correr en WSL
socat -T10 TCP-LISTEN:10800,fork,reuseaddr TCP:$WSLIP:1080y luego apuntar desde Windows aWSL_IP:10800. Los mensajesBroken pipeen el log son normales al cerrar clientes.
5) Enrutar solo las apps que quieras desde Windows
5.1. ProxyCap
-
Añade un Proxy Server:
SOCKS5 127.0.0.1:10800(sin auth). -
Crea Reglas por aplicación (por ejemplo,
game.exe,steam.exe,filezilla.exe, etc.). -
Marca “Resolve DNS through proxy” para evitar filtraciones DNS locales.
-
Excluye la red local (192.168.0.0/16) si no quieres tunelizar dispositivos de tu LAN.
-
Activa el log para comprobar qué conexiones pasan por el proxy.
5.2. Proxifier
Configuración similar a ProxyCap (servidor SOCKS5 + reglas por app + DNS remoto).
5.3. ProxyBridge
Libre, de código abierto. Permite redirigir tráfico TCP (y en versiones recientes UDP) de aplicaciones seleccionadas hacia un proxy SOCKS5 o HTTP.
5.4. FreeCap / WideCap
Versiones históricas gratuitas que también actúan como “proxificadores” de aplicaciones en Windows.
5.5. WinDivert
Más técnica y menos “plug-and-play”, pero permite interceptar/modificar tráfico de red a nivel de paquete, lo cual abre muchas posibilidades de redirección.
5.6. SocksCap64 (gratuito, más básico)
Lanza apps a través del proxy, pero con menos granularidad.
5.7. ForceBindIP (para apps que usan UDP o ignoran proxy)
Fuerza que un proceso use una IP local concreta (p.ej. la del adaptador virtual). Útil para juegos/UDP:
C:\Tools\ForceBindIP\ForceBindIP.exe 127.0.0.1 "C:\Ruta\App\app.exe" # ejemplo
Requiere probar con la IP que más te convenga (puede ser la del host o la del adaptador WSL si lo expones). No “inyecta” sobre procesos ya en marcha: debes lanzar la app con ForceBindIP.
5.8. (Avanzado) Rutas por destino
Si conoces IPs de servidores y quieres forzar solo esos destinos por el gateway de WSL, usa route add (no por proceso, sí por destino):
route -p add 203.0.113.45 mask 255.255.255.255 192.168.75.53
Suele ser frágil con juegos que usan CDNs/direcciones variables.
6) Caddy (Windows) como reverse proxy hacia Jellyfin (WSL)
Si quieres acceder a Jellyfin con un dominio local o con TLS desde Windows/red local, configura Caddy en Windows:
Caddyfile ejemplo:
jellyfin.localhost {
reverse_proxy 192.168.75.53:8096
header_up X-Forwarded-Host {host}
header_up X-Forwarded-Proto {scheme}
}
Si publicas Jellyfin en Internet, no olvides seguridad (usuario/contraseña fuertes, geobloqueo, rate-limit) y considera TLS válido (Let’s Encrypt) y access controls adicionales.
7) Automatización (todo listo al iniciar)
7.1. Script de arranque en WSL
Crea /usr/local/bin/start_vpn_proxy.sh:
#!/bin/bash
set -euo pipefail
echo "[WSL] Arranque NordVPN + Dante + portbridge"
# Asegurar demonio de NordVPN
sudo systemctl start nordvpnd || true
# Conectar VPN si no está conectada
if ! nordvpn status | grep -q "Connected"; then
nordvpn connect || true
fi
# Iniciar Dante si no está en ejecución
if ! pgrep -x danted >/dev/null; then
sudo systemctl start danted || sudo /usr/sbin/danted -D || true
fi
# (Opcional) generar un bridge local con socat (si prefieres en WSL en vez de netsh)
WSL_IP=$(hostname -I | awk '{print $1}')
if ! pgrep -x socat >/dev/null; then
sudo socat -T10 TCP-LISTEN:10800,fork,reuseaddr TCP:${WSL_IP}:1080 \
2>>/var/log/socat_bridge.log &
fi
# Mostrar IP pública vía proxy (desde WSL)
echo -n "IP pública via VPN: "
curl -s https://ifconfig.me || true
echo
Permisos y prueba:
sudo chmod +x /usr/local/bin/start_vpn_proxy.sh
sudo /usr/local/bin/start_vpn_proxy.sh
7.2. Servicio systemd (WSL)
/etc/systemd/system/wsl-vpn-proxy.service:
[Unit]
Description=NordVPN + Dante + Socat bridge
After=network-online.target nordvpnd.service
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/start_vpn_proxy.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Activar:
sudo systemctl daemon-reload
sudo systemctl enable --now wsl-vpn-proxy.service
Recuerda que WSL solo arranca cuando algo lo invoca. Para dejarlo activo al inicio de Windows, usa una tarea programada.
7.3. Tarea programada en Windows (al arrancar, sin sesión)
En PowerShell (admin):
$action = New-ScheduledTaskAction -Execute "wsl.exe" -Argument "-d Ubuntu -u root /usr/local/bin/start_vpn_proxy.sh"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest
Register-ScheduledTask -TaskName "WSL_VPN_Proxy" -Action $action -Trigger $trigger -Principal $principal -Description "Arranca NordVPN + Dante + bridge en WSL al iniciar Windows"
Probar manualmente:
Start-ScheduledTask -TaskName "WSL_VPN_Proxy"
Verificar desde Windows:
Test-NetConnection 127.0.0.1 -Port 10800
curl.exe https://ifconfig.me --proxy socks5://127.0.0.1:10800
8) Solución de problemas (FAQ)
A. nordvpn login no te reconoce
-
Usa
nordvpn loginy, tras loguearte, copia la URL del botón “Continue” de la página de éxito. -
Ejecuta:
nordvpn login --callback "PEGAR_URL_CONTINUE".
B. systemctl no funciona
-
Activa systemd en
/etc/wsl.conf:[boot] systemd=trueReinicia WSL:
wsl --shutdown.
C. danted.service no existe
-
Asegúrate de estar en Ubuntu 22.04 y que el paquete
dante-serveresté instalado. -
Alternativa: lanza Dante directamente:
/usr/sbin/danted -D.
D. Windows no conecta al proxy de WSL
-
Usa portproxy:
# volver a crear por si cambia la IP de WSL netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=10800 $WSLIP = wsl.exe hostname -I | % { $_.Split(' ')[0] } netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=10800 connectaddress=$WSLIP connectport=1080
E. socat muestra "Broken pipe"
-
Son cierres abruptos de cliente; añade
-T10y redirige stderr a log (ver script) para que no molesten.
F. DNS dentro de WSL falla con VPN
-
Fija
resolv.conf:echo -e "[network]\ngenerateResolvConf = false" | sudo tee /etc/wsl.conf sudo rm -f /etc/resolv.conf echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf sudo chattr +i /etc/resolv.conf
G. Quiero tunelizar todo Windows temporalmente por WSL
-
No recomendado (puede dejarte sin Internet). Si lo haces, añade y luego borra la ruta por defecto:
# FORZAR (temporal): route add 0.0.0.0 mask 0.0.0.0 <WSL_IP> metric 1 # REVERTIR: route delete 0.0.0.0
H. Windows Home y modo bridged
-
No está soportado (falta
vmswitch). Mantén WSL en NAT y usa portproxy/socat.
9) Chuleta rápida (cheat‑sheet)
-
Estado WSL:
wsl -l -v, wsl --status, wsl --shutdown -
IP WSL:
hostname -I -
NordVPN:
sudo systemctl start nordvpnd, nordvpn login, nordvpn connect, nordvpn status -
Jellyfin:
sudo systemctl enable --now jellyfin, web: http://WSL_IP:8096 -
Dante:
sudo systemctl enable --now danted, log: /var/log/danted.log -
Puente a Windows:
$WSLIP = wsl.exe hostname -I | % { $_.Split(' ')[0] } netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=10800 connectaddress=$WSLIP connectport=1080 Test-NetConnection 127.0.0.1 -Port 10800 -
Probar salida por VPN desde Windows:
curl.exe https://ifconfig.me --proxy socks5://127.0.0.1:10800
Epílogo
Con esta guía, Jellyfin queda dentro de WSL2 (bajo NordVPN), tus librerías siguen en Windows, y desde el lado Windows puedes redirigir selectivamente aplicaciones via SOCKS5 (127.0.0.1:10800). Es una solución estable en Windows Home y muy flexible. Si más adelante pasas a Windows Pro, podrás valorar bridged networking para escenarios más avanzados.
¿Quieres que añadamos una sección con reglas de ProxyCap “listas para importar” (incluyendo exclusiones LAN y buckets por aplicación), u otra con Caddy + TLS para exponer Jellyfin por dominio? Pídelo y lo anexamos. 😊