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. 😊
The main objective of this guide is to configure NordVPN, your router, and your Windows firewall to create a bypass for incoming connections and to be able to offer connections to your server from your router using port forwarding
If we do it correctly, we’ll be able to have services such as JellyFin with IPTV that can be accessed securely, Immich, Plex, or other services.

We’re going to assume that we’ve already installed JellyFin and Caddy, and configured the router by doing port forwarding to our server. See our guide to achieve a complete and secure installation of JellyFin.
We’re going to expose Jellyfin with Caddy on Windows 10 using the router’s port forwarding while NordVPN is active, integrating what you and I already tested + the key point from the thread you shared (the “Allow remote access…” toggle).
Basic idea: we’re not doing port forwarding “through NordVPN” (Nord doesn’t support it). Instead, you publish your server on your real public IP (router → your PC) and, at the same time, keep NordVPN for the rest of the traffic. For incoming connections to keep arriving even while the VPN is connected, you need to:
Enable Allow remote access while connected to VPN in the Nord app,
Exclude Caddy from the tunnel (split tunnelling),
Force Caddy to listen only on your physical interface (bind),
- A couple of firewall rules and interface metrics so that Windows doesn’t divert anything through Nord’s adapter.
0) Prerequisites (quick checklist)
-
Router with port forwarding 80→PC:80 and 443→PC:443.
-
Domain/DDNS pointing to your public IP (e.g.
sampledomain.ddns.net). -
Jellyfin installed and working on local HTTP (e.g.
127.0.0.1:8096). -
Caddy installed on Windows (Chocolatey or standalone binary).
-
NordVPN for Windows 10.
-
Important about Let’s Encrypt: if you use HTTP-01 you need port 80 to be accessible from the Internet; if you block 80, you can use TLS-ALPN-01 on 443. Official recommendation: leave 80 open and redirect to 443. Let's Encrypt+1
-
About NordVPN and port forwarding: Nord does not support port forwarding through its servers; that’s why you publish via your real IP and not through Nord. For remote access, Nord pushes Meshnet as an alternative. (We’re going down the router + app settings route). NordVPN+1
1) Configure NordVPN to allow incoming connections while the VPN is active
-
Open the NordVPN app → cog (Settings).
-
In Connection & security / Connection, enable “Allow remote access while connected to VPN” (Allow remote access while connected to VPN).
-
This option appears documented in the official guide (in Portuguese it shows the exact text: “Permitir acesso remoto ao se conectar à VPN… Desativado por padrão”). Turn it on. NordVPN Support
-
-
Practical tip (what you saw in the thread): if it has no effect, turn that toggle off and on again and reconnect the VPN. Several third-party articles document this setting for RDP/incoming connections when the VPN is active. help.bitlaunch.io+1
Note: If you’d rather never open ports, Meshnet gives you remote access without exposing 443/80, but here we’re continuing with classic port forwarding. NordVPN+1
2) Force the Nord protocol that does respect the bypass
On Windows, NordLynx (WireGuard) can “capture” inbound connections to 80/443 at kernel level; with OpenVPN (UDP) the bypass works because it uses TAP and respects bind, firewall and metrics. Switch to OpenVPN UDP:
Then raise the metric of Nord’s TAP and lower that of your physical NIC (e.g. “Ethernet 6”):
Check names with:
netsh interface ipv4 show interfaces
If you use NordLynx, the bypass may not work even if you tweak metrics. Switching to OpenVPN (UDP) was an important detail to get it working correctly. I disabled the NordLynx driver.
3) ESSENTIAL in NordVPN (Windows)
Enable the permission for remote access while the VPN is connected
-
Open NordVPN → cog icon (Settings).
-
Go to Options → Connection & security.
-
Enable “Allow remote access while connected to VPN”
Help text in the app: “Access this computer remotely, for example, via remote desktop applications”.
Trick that makes it kick in (what worked for you):
-
Turn that switch off, turn it back on, disconnect the VPN and reconnect it. Sometimes the app “forgets” to apply that policy and the toggle reset forces it to take effect.
Immediate test (with Nord connected):
-
Make sure the router forwards 443→PC:443 (and 80→80 if you use HTTP-01).
-
From another network/4G (or forcing public IP):
Immediate test (with Nord connected):
-
Make sure the router forwards 443→PC:443 (and 80→80 if you use HTTP-01).
-
From another network/4G (or forcing public IP):
If you see the TLS handshake and a response from Caddy/Jellyfin, remote access is allowed and working and you don’t need to do any more steps.
4) Exclude Caddy from the tunnel (Split tunnelling)
-
In the NordVPN app → Split tunnelling → Exclude/Disable VPN for selected apps → add
caddy.exe(path to your installation). NordVPN
This makes outbound traffic from Caddy (for example, ACME validations) not go through the VPN. It’s the first pillar of the bypass.
5) Firewall rules to isolate Caddy from Nord’s adapter
5.1 OUTBOUND block (prevents caddy.exe from going out via the tunnel’s private networks: 10/8 and 172.16/12):
5.2 INBOUND block (prevents incoming connections to 80/443 from “landing” on the IP of the Nord adapter):
These two rules are the ones you verified as OK.
6) Set route metrics and LAN route so Windows doesn’t prefer the tunnel
-
Lower the metric of your physical NIC (1–10) and raise that of Nord’s TAP (300).
-
Static LAN route so that all 192.168.1.0/24 goes via your real gateway:
With this, the routing table is consistent: by default it goes out via your real gateway, Nord’s TAP is “expensive” (high metric) and the LAN always uses the router.
7) Caddy: bind to your physical IP + reverse proxy to Jellyfin
Caddyfile (example):
-
The
bindforces Caddy to listen only on your physical interface, not on the VPN adapter. Caddy Web Server -
Automatic HTTPS: Caddy requests/renews the certificates. For HTTP-01, 80 must be open (recommended by Let’s Encrypt). Alternatively, TLS-ALPN-01 validates over 443 if you can’t open 80. Caddy Web Server+2Let's Encrypt+2
If validation returns “Timeout during connect (likely firewall problem)”, check that 80/443 on the router are open towards your PC and that Nord’s toggle from step 1 is active. That error is typical of port 80 blocked in HTTP-01. docs.flashpanel.io
8) Port forwarding on the router
-
WAN 80 →
192.168.1.50:80 -
WAN 443 →
192.168.1.50:443
Verify with mobile data (avoid hairpin NAT) and with:
9) (Optional) Run Caddy as a service and have the split apply to it
If you use NSSM:
Tip: run the service under your user (not LocalSystem) so that Nord’s Split tunnelling also applies to the service.
10) Quick tests (with NordVPN connected)
-
Listening
You should see 192.168.1.50:80 and :443 (not 0.0.0.0, not 10.x.x.x).
If you only do it on 443, check only that one. If more than one service appears, you’ll see the PID; you may have Apache or similar.
-
Local
-
From outside (4G or another network)
-
Public IP for general traffic (it should be Nord’s)
11) Troubleshooting (the most common things that “break”)
-
It doesn’t accept connections from outside when Nord is active
-
Confirm step 1 (Allow remote access…) and toggle it OFF/ON again if it “forgets” to apply (several users resolve it this way). help.bitlaunch.io+1
-
Make sure you’re on OpenVPN (UDP), not NordLynx.
-
Check the firewall rules OUT/IN (step 4).
-
Verify metrics and LAN route (step 5).
-
-
Caddy can’t obtain the certificate
-
Open 80 (recommended by Let’s Encrypt) or use TLS-ALPN on 443, but the validator must reach your host. Let's Encrypt+1
-
-
With NordLynx (WireGuard) it still doesn’t work even if I change metrics
-
Switch to OpenVPN (UDP): it’s the switch that worked consistently for you.
-
-
General connection drops due to Kill Switch
-
Disable Internet Kill Switch / App Kill Switch while testing. (The Kill Switch can block non-tunnelled inbound/outbound traffic).
-
12) (Advanced optional) Ensure ACME outbound traffic doesn’t go through the VPN
If you still see ACME going through the tunnel, add static routes to ranges used by Let’s Encrypt so they go via your real gateway:
route add 172.65.32.0 mask 255.255.255.0 192.168.1.1 -p
route add 104.18.14.0 mask 255.255.254.0 192.168.1.1 -p
13) (Advanced optional) Batch file to change VPN metrics
If necessary (between machine restarts) you can create this batch file to reconfigure everything. Remember that in the example the interface is Ethernet 6; in your case it may be a different one.
@echo off
echo.
echo STARTING EVERYTHING: NORDVPN + CADDY (BYPASS)
echo.
:: 1. Disconnect NordVPN
echo Disconnecting NordVPN...
nordvpn -d
:: 2. Kill Caddy
echo Killing Caddy...
taskkill /f /im caddy.exe >nul 2>&1
:: 3. Connect NordVPN
echo Connecting NordVPN...
nordvpn -c
:: 4. Wait and force metrics
echo Waiting 5 seconds...
timeout /t 5 >nul
netsh interface ipv4 set interface "Ethernet 6" metric=1
netsh interface ipv4 set interface "NordLynx" metric=300
:: 5. Start Caddy
echo Starting Caddy...
cd /d "C:\ProgramData\chocolatey\lib\caddy\tools"
caddy run
pause
Visual summary of the recipe
-
NordVPN:
-
✅ Allow remote access while connected to VPN → ON (and if it fails, toggle OFF/ON). NordVPN Support+1
-
✅ OpenVPN (UDP) (not NordLynx).
-
✅ Split tunnelling (exclude
caddy.exe). NordVPN
-
-
Windows:
-
✅ Firewall OUT: block
caddy.exeto10.0.0.0/8, 172.16.0.0/12. -
✅ Firewall IN: block 80/443 on LocalAddress
10.0.0.0/8. -
✅ Metrics: physical NIC 1; Nord’s TAP 300; LAN route
192.168.1.0/24via your gateway.
-
-
Caddy:
-
✅
bind 192.168.1.x+ reverse proxy to127.0.0.1:8096. Caddy Web Server -
✅ Automatic HTTPS (80 open recommended; or TLS-ALPN-01 on 443). Caddy Web Server+2Let's Encrypt+2
-
Final notes
-
Nord does not support port forwarding “through the VPN”, which is why this guide uses your public IP + adjustments so that Nord doesn’t interfere. If you don’t want to open 443/80, consider Meshnet (secure remote access with no ports). NordVPN+1
El objetivo principal de esta guía es configurar NordVPN, tu router y tu firewall de Windows para hacer ByPass para conexiones entrantes y poder ofrecer conexiones a tu servidor desde tu router usando port fordwarding
Si lo hacemos correctamente podremos disponer de servicios como JellyFin con IPTV a la que acceder de forma segura, Immich, Plex u otros servicios.

Vamos a asumir que ya hemos instalado JellyFin y Caddy, y configurado el router, haciendo port fordwarding a nuestro servidor. Consulte nuestra guía para conseguir una instalación completa y segura de JellyFin.
Vamos a exponer Jellyfin con Caddy en Windows 10 usando port forwarding del router mientras NordVPN está activo, integrando lo que ya probamos tú y yo + lo clave del hilo que compartiste (el toggle de “Permitir acceso remoto…”).
Idea base: no hacemos port forwarding “a través de NordVPN” (Nord no lo soporta). En su lugar, publicas tu servidor en tu IP pública real (router → tu PC) y, al mismo tiempo, mantienes NordVPN para el resto del tráfico. Para que las conexiones entrantes sigan llegando aunque la VPN esté conectada, necesitas:
Habilitar Permitir acceso remoto mientras estás conectado a la VPN en la app de Nord,
Excluir Caddy del túnel (split tunneling),
Forzar que Caddy escuche solo en tu interfaz física (bind),
- Un par de reglas de firewall y métricas de interfaz para que Windows no desvíe nada por el adaptador de Nord.
0) Requisitos previos (checklist rápido)
-
Router con port forwarding 80→PC:80 y 443→PC:443.
-
Dominio/DDNS apuntando a tu IP pública (ej.
sampledomain.ddns.net). -
Jellyfin instalado y funcionando en HTTP local (ej.
127.0.0.1:8096). -
Caddy instalado en Windows (Chocolatey o binario suelto).
-
NordVPN para Windows 10.
-
Importante sobre Let’s Encrypt: si usas HTTP‑01 necesitas que puerto 80 sea accesible desde Internet; si bloqueas el 80, puedes usar TLS‑ALPN‑01 en 443. Recomendación oficial: deja 80 abierto y redirige a 443. Let's Encrypt+1
-
Sobre NordVPN y el port forwarding: Nord no soporta port forwarding a través de sus servidores; por eso publicas por tu IP real y no a través de Nord. Para acceso remoto, Nord empuja Meshnet como alternativa. (Nosotros vamos por la vía router + ajustes de app). NordVPN+1
1) Configura NordVPN para permitir entradas cuando la VPN está activa
-
Abre la app de NordVPN → engranaje (Settings).
-
En Conexión y seguridad / Connection, activa “Permitir acceso remoto al conectarse a la VPN” (Allow remote access while connected to VPN).
-
Esta opción aparece documentada en la guía oficial (en portugués muestra el texto exacto: “Permitir acesso remoto ao se conectar à VPN… Desativado por padrão”). Actívala. NordVPN Support
-
-
Consejo práctico (lo que viste en el hilo): si no surte efecto, apaga y vuelve a encender ese toggle y reconecta la VPN. Varios artículos de terceros documentan este ajuste para RDP/entradas cuando la VPN está activa. help.bitlaunch.io+1
Nota: Si prefirieras no abrir puertos jamás, Meshnet te da acceso remoto sin exponer 443/80, pero aquí seguimos con port forwarding clásico. NordVPN+1
2) Fuerza el protocolo de Nord que sí respeta el bypass
En Windows, NordLynx (WireGuard) puede “capturar” entradas a 80/443 a nivel de kernel; con OpenVPN (UDP) el bypass funciona porque usa TAP y respeta bind, firewall y métricas. Cambia a OpenVPN UDP:
Luego sube la métrica del TAP de Nord y baja la de tu NIC física (ej. “Ethernet 6”):
Comprueba nombres con:
netsh interface ipv4 show interfaces
Si usas NordLynx, el bypass puede no funcionar aunque ajustes métricas. Cambiar a OpenVPN (UDP) fue un detalle importante para conseguir que funcionara correctamente. Yo deshabilite el controlador de NordLynx
3) IMPRESCINDIBLE en NordVPN (windows)
Activa el permiso de acceso remoto mientras la VPN está conectada
-
Abre NordVPN → icono de engranaje (Ajustes).
-
Entra en Opciones → Conexión y seguridad.
-
Activa “Permitir acceso remoto mientras te conectas a la VPN”
Texto de ayuda en la app: “Accede a este ordenador de forma remota, por ejemplo, mediante aplicaciones de escritorio remoto”.
Truco que lo hace arrancar (lo que te funcionó):
-
Desactiva ese interruptor, vuelve a activarlo, desconecta la VPN y reconéctala. A veces la app “olvida” aplicar esa política y el toggle reset la fuerza a tomar efecto.
Prueba inmediata (con Nord conectado):
-
Asegúrate de que el router reenvía 443→PC:443 (y 80→80 si usas HTTP-01).
-
Desde otra red/4G (o forzando IP pública):
Prueba inmediata (con Nord conectado):
-
Asegúrate de que el router reenvía 443→PC:443 (y 80→80 si usas HTTP-01).
-
Desde otra red/4G (o forzando IP pública):
Si ves el handshake TLS y respuesta de Caddy/Jellyfin, el acceso remoto está permitido y funcionando y no tienes que hacer más pasos.
4) Excluye Caddy del túnel (Split tunneling)
-
En la app de NordVPN → Split tunneling → Exclude/Disable VPN for selected apps → añade
caddy.exe(ruta de tu instalación). NordVPN
Esto hace que el tráfico saliente de Caddy (por ejemplo, validaciones ACME) no pase por la VPN. Es el primer pilar del bypass.
5) Reglas de Firewall para aislar Caddy del adaptador de Nord
5.1 Bloqueo OUTBOUND (evita que caddy.exe salga por redes privadas del túnel Nord: 10/8 y 172.16/12):
5.2 Bloqueo INBOUND (evita que entradas a 80/443 “caigan” por la IP del adaptador de Nord):
Estas dos reglas son las que verificaste con OK.
6) Fija métricas de ruta y ruta LAN para que Windows no prefiera el túnel
-
Baja la métrica de tu NIC física (1–10) y sube la del TAP de Nord (300).
-
Ruta LAN estática para que todo 192.168.1.0/24 vaya por tu gateway real:
Con esto, la tabla de rutas queda consistente: por defecto sale por tu gateway real, el TAP de Nord queda “caro” (métrica alta) y la LAN siempre usa el router.
7) Caddy: bind a tu IP física + reverse proxy a Jellyfin
Caddyfile (ejemplo):
-
El
bindfuerza a Caddy a escuchar solo en tu interfaz física, no en el adaptador VPN. Caddy Web Server -
Automático HTTPS: Caddy solicita/renueva los certificados. Para HTTP‑01, el 80 debe estar abierto (recomendado por Let’s Encrypt). Alternativamente, TLS‑ALPN‑01 valida por 443 si no puedes abrir 80. Caddy Web Server+2Let's Encrypt+2
Si la validación da “Timeout during connect (likely firewall problem)”, revisa que 80/443 del router están abiertos hacia tu PC y que el toggle de Nord del paso 1 está activo. Ese error es típico de puerto 80 bloqueado en HTTP‑01. docs.flashpanel.io
8) Port forwarding en el router
-
WAN 80 →
192.168.1.50:80 -
WAN 443 →
192.168.1.50:443
Verifica con datos móviles (evita hairpin NAT) y con:
9) (Opcional) Ejecutar Caddy como servicio y que le aplique el split
Si usas NSSM:
Consejo: ejecuta el servicio bajo tu usuario (no LocalSystem) para que Split tunneling de Nord te aplique también al servicio.
10) Pruebas rápidas (con NordVPN conectado)
-
Escucha
Debe salir 192.168.1.50:80 y :443 (no 0.0.0.0, no 10.x.x.x).
Si solo lo haces sobre el 443, comprueba únicamente este. Si te sale más de un servicio, podrás ver el pid, es posible que tengas apache o similar.
-
Local
-
Desde fuera (4G u otra red)
-
IP pública para tráfico general (debería ser la de Nord)
11) Solución de problemas (lo que más vimos que “rompe”)
-
No entra desde fuera cuando Nord está activo
-
Confirma paso 1 (Permitir acceso remoto…) y vuelve a alternarlo OFF/ON si se “olvida” de aplicarlo (varios usuarios lo resuelven así). help.bitlaunch.io+1
-
Asegúrate de estar en OpenVPN (UDP), no NordLynx.
-
Revisa las reglas de firewall OUT/IN (paso 4).
-
Comprueba métricas y ruta LAN (paso 5).
-
-
Caddy no consigue el certificado
-
Abre 80 (recomendado por Let’s Encrypt) o usa TLS‑ALPN en 443, pero el validador debe alcanzar tu host. Let's Encrypt+1
-
-
Con NordLynx (WireGuard) sigue sin ir aunque toque métricas
-
Cambia a OpenVPN (UDP): es el switch que te funcionó de forma consistente.
-
-
Conexión general cae por Kill Switch
-
Desactiva Internet Kill Switch / App Kill Switch mientras pruebas. (El Kill Switch puede bloquear entradas/salidas no tuneladas).
-
12) (Opcional avanzado) Asegurar que las salidas de ACME no van por la VPN
Si aun así ves que ACME sale por el túnel, añade rutas estáticas hacia rangos usados por Let’s Encrypt para que vayan por tu gateway real:
route add 172.65.32.0 mask 255.255.255.0 192.168.1.1 -p
route add 104.18.14.0 mask 255.255.254.0 192.168.1.1 -p
13) (Opcional avanzado) Fichero bat para cambiar las metricas de VPN
Si fuera necesario (entre reinicios de la maquina) se puede crear este fichero bat para reconfigurar todo. Recuerda qeu en el ejemplo el interface es Ethernet 6 en tu caso puede ser otro.
@echo off
echo.
echo INICIANDO TODO: NORDVPN + CADDY (BYPASS)
echo.
:: 1. Desconectar NordVPN
echo Desconectando NordVPN...
nordvpn -d
:: 2. Matar Caddy
echo Matando Caddy...
taskkill /f /im caddy.exe >nul 2>&1
:: 3. Conectar NordVPN
echo Conectando NordVPN...
nordvpn -c
:: 4. Esperar y forzar métricas
echo Esperando 5 segundos...
timeout /t 5 >nul
netsh interface ipv4 set interface "Ethernet 6" metric=1
netsh interface ipv4 set interface "NordLynx" metric=300
:: 5. Iniciar Caddy
echo Iniciando Caddy...
cd /d "C:\ProgramData\chocolatey\lib\caddy\tools"
caddy run
pause
Resumen visual de la receta
-
NordVPN:
-
✅ Allow remote access while connected to VPN → ON (y si falla, toggle OFF/ON). NordVPN Support+1
-
✅ OpenVPN (UDP) (no NordLynx).
-
✅ Split tunneling (excluir
caddy.exe). NordVPN
-
-
Windows:
-
✅ Firewall OUT: bloquear
caddy.exea10.0.0.0/8, 172.16.0.0/12. -
✅ Firewall IN: bloquear 80/443 en LocalAddress
10.0.0.0/8. -
✅ Métricas: NIC física 1; TAP de Nord 300; Ruta LAN
192.168.1.0/24por tu gateway.
-
-
Caddy:
-
✅
bind 192.168.1.x+ reverse proxy a127.0.0.1:8096. Caddy Web Server -
✅ Automatic HTTPS (80 abierto recomendado; o TLS‑ALPN‑01 en 443). Caddy Web Server+2Let's Encrypt+2
-
Notas finales
-
Nord no soporta port forwarding “a través de la VPN”, por eso esta guía usa tu IP pública + ajustes para que Nord no interfiera. Si no quieres abrir 443/80, considera Meshnet (remoto seguro sin puertos). NordVPN+1
1) Requisitos
-
Jellyfin 10.8+ en marcha (con acceso de administrador).
-
Un endpoint Xtream compatible (URL base, usuario y contraseña).
-
Acceso al panel de administración de Jellyfin.
El plugin integra contenidos de una API Xtream-compatible dentro de Jellyfin. GitHub
2) Instalación del plugin (vía repositorio personalizado)
-
Entra a Panel admin → Plugins → Repositories.
-
Pulsa + para añadir un repositorio:
-
Name:
Jellyfin.Xtream -
URL:
https://kevinjil.github.io/Jellyfin.Xtream/repository.json -
Save. GitHub
-
-
Ve a Plugins → Catalog → sección Live TV → Jellyfin Xtream → Install.
-
(Opcional) Elige la versión que prefieras antes de instalar.
-
Reinicia el servidor Jellyfin para completar la instalación. Este paso es obligatorio. GitHub
La versión estable más reciente figura en Releases del repo (a fecha de hoy aparece v0.8.0). GitHub
3) Configuración del plugin
Después de reiniciar: Panel admin → Plugins → Jellyfin Xtream.
3.1 Credenciales (pestaña Credentials)
-
Base URL: URL del endpoint incluyendo protocolo (
http/https) y sin barra final.
Ejemplo:https://mi-servidor-xtream.com:8080 -
Username: tu usuario Xtream.
-
Password: tu contraseña Xtream. GitHub
3.2 TV en directo (Live TV)
-
Abre la pestaña Live TV.
-
Selecciona categorías o canales concretos que quieras exponer.
-
(Opcional) En TV Overrides ajusta número de canal, nombre e iconos.
-
Pulsa Save al final. GitHub
3.3 Películas/Series bajo demanda
-
Video On-Demand: Activa “Show this channel to users”, elige categorías/vídeos y Save. GitHub
-
Series: Activa “Show this channel to users”, elige categorías/series y Save. GitHub
3.4 Catch-up (TV a la carta)
-
En Live TV, activa “Show the catch-up channel to users” y Save. GitHub
4) Ajuste de red recomendado en Jellyfin
Para que clientes externos encuentren correctamente tu servidor y los enlaces funcionen fuera de tu LAN:
-
Panel admin → Networking → Published server URIs
Añade una línea tipo:all=https://tuservidor.ejemplo.com
(Ajusta a tu dominio/URL pública). GitHub+1
5) Dónde aparece el contenido
-
Live TV: los canales Xtream quedan disponibles como fuente de TV (sintonizador virtual).
-
Películas/Series: verás entradas según lo que hayas activado en Video On-Demand / Series dentro del plugin. (Si no aparecen, revisa el apartado de problemas.)
6) Seguridad importante (credenciales en rutas)
El formato Xtream incluye usuario/contraseña en las URLs remotas. Jellyfin muestra rutas remotas en su API y en algunas vistas, así que cualquiera con acceso al servidor podría verlas. Si compartes tu servidor con otros usuarios, úsalo con precaución (o limita el acceso). GitHub
7) Problemas comunes y soluciones
-
No aparece nada tras configurar
-
Asegúrate de haber hecho el reinicio del servidor Jellyfin tras instalar/actualizar el plugin. GitHub
-
Revisa Credentials (URL base correcta, usuario/clave).
-
En Live TV / VOD / Series, confirma que has marcado categorías o elementos y pulsado Save. GitHub
-
Comprueba Networking → Published server URIs cuando accedes desde fuera de la LAN. GitHub+1
-
-
Canales se ven, pero reproducción falla desde fuera
-
Verifica que tu servidor Jellyfin es accesible por la URL pública y que no hay bloqueo de puertos/cortafuegos (según tu despliegue).
-
-
Orden/íconos de canales
-
Usa TV Overrides para ordenar/renumerar y asignar logos. GitHub
-
8) Buenas prácticas
-
Reinicia Jellyfin tras instalar o actualizar el plugin y cuando hagas cambios grandes en la selección de categorías (si ves que no refresca). GitHub
-
Documenta tu Base URL / credenciales Xtream y guarda copia segura.
-
Si compartes tu Jellyfin, restringe qué usuarios ven las vistas de Xtream, dadas las advertencias de confidencialidad. GitHub