información y artículos tecnológicos
November 13, 2025, 25 minutos

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 en 0.0.0.0:8096

    • dante-server (SOCKS5) → escucha en WSL WSL_IP:1080

    • (opcional) socat o netsh portproxy → expone 127.0.0.1:10800 en Windows → redirige a WSL_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á (error 0x8037010d). 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 login y, 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 jellyfin tenga permisos (o usa una carpeta de datos en el propio WSL para metadata).

Rendimiento: grandes scans sobre /mnt/c pueden 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:1080 directamente. 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:1080 y luego apuntar desde Windows a WSL_IP:10800. Los mensajes Broken pipe en 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 login y, 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=true

    Reinicia WSL:

     
    wsl --shutdown.

C. danted.service no existe

  • Asegúrate de estar en Ubuntu 22.04 y que el paquete dante-server esté 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 -T10 y 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. 😊

October 30, 2025, 51 minutos

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:

  1. Enable Allow remote access while connected to VPN in the Nord app,

  2. Exclude Caddy from the tunnel (split tunnelling),

  3. Force Caddy to listen only on your physical interface (bind),

  4. 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

  1. Open the NordVPN app → cog (Settings).

  2. 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

  3. 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:

:: 1. Disable NordLynx (WireGuard)
nordvpn set technology openvpn

:: 2. Choose UDP protocol
nordvpn set protocol udp

:: 3. Disable auto-connect (prevents switching back to NordLynx)
nordvpn set autoconnect off

:: 4. Disconnect
nordvpn -d

:: 5. Connect with OpenVPN UDP
nordvpn -c
  • If you see the TLS handshake and a response from Caddy/Jellyfin, remote access is allowed and working.

Then raise the metric of Nord’s TAP and lower that of your physical NIC (e.g. “Ethernet 6”):

netsh interface ipv4 set interface "Ethernet 6" metric=1
netsh interface ipv4 set interface "TAP-NordVPN Windows Adapter" metric=300

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

  1. Open NordVPN → cog icon (Settings).

  2. Go to Options → Connection & security.

  3. 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):

    curl -vk https://YOUR_DOMAIN --resolve YOUR_DOMAIN:443:YOUR_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):

New-NetFirewallRule -DisplayName "BLOCK Caddy → NordVPN (10.0.0.0/8 + 172.16.0.0/12)" `
  -Direction Outbound -Action Block `
  -Program "C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe" `
  -RemoteAddress 10.0.0.0/8,172.16.0.0/12 `
  -Profile Any -Enabled True

5.2 INBOUND block (prevents incoming connections to 80/443 from “landing” on the IP of the Nord adapter):

New-NetFirewallRule -DisplayName "BLOCK Caddy IN on NordVPN (10.0.0.0/8)" `
  -Direction Inbound -Action Block `
  -LocalPort 80,443 -Protocol TCP `
  -LocalAddress 10.0.0.0/8 `
  -Profile Any -Enabled True

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:

route delete 192.168.1.0
route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 metric 1 -p

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):

{
  email [email protected]
  storage file_system {
    root C:\ProgramData\chocolatey\lib\caddy\tools\data
  }
}

sampledomain.ddns.net {
bind 192.168.1.50        # <-- your static LAN IP
encode zstd gzip
@http    { protocol http }
redir @http https://{host}{uri} 308

reverse_proxy 127.0.0.1:8096
} 

If you don’t want port 80, and only 443, for https (recommended).

{
    email [email protected]
    storage file_system {
        root C:\ProgramData\chocolatey\lib\caddy\tools\data
    }
}

sampledomain.ddns.net {
tls {
issuer acme {
disable_http_challenge
}
}
bind 192.168.1.50
reverse_proxy 127.0.0.1:8096
} 
  • The bind forces 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:

curl -vk https://sampledomain.ddns.net/ --resolve sampledomain.ddns.net:443:YOUR_PUBLIC_IP

9) (Optional) Run Caddy as a service and have the split apply to it

If you use NSSM:

nssm install Caddy "C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe" run --config Caddyfile
nssm set Caddy AppDirectory "C:\ProgramData\chocolatey\lib\caddy\tools"
nssm set Caddy AppStdout "C:\ProgramData\caddy\logs\caddy.out.log"
nssm set Caddy AppStderr "C:\ProgramData\caddy\logs\caddy.err.log"

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)

  1. Listening

netstat -ano | findstr :80
netstat -ano | findstr :443

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.

  1. Local

curl http://192.168.1.50:8096  (Jellyfin)
curl -k https://192.168.1.50   (Caddy -> Jellyfin, internal cert if you set it)
  1. From outside (4G or another network)

curl -vk https://sampledomain.ddns.net/
  1. Public IP for general traffic (it should be Nord’s)

curl ifconfig.me

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.exe to 10.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/24 via your gateway.

  • Caddy:


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

October 29, 2025, 51 minutos

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:

  1. Habilitar Permitir acceso remoto mientras estás conectado a la VPN en la app de Nord,

  2. Excluir Caddy del túnel (split tunneling),

  3. Forzar que Caddy escuche solo en tu interfaz física (bind),

  4. 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

  1. Abre la app de NordVPN → engranaje (Settings).

  2. 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

  3. 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:

:: 1. Desactivar NordLynx (WireGuard)
nordvpn set technology openvpn

:: 2. Elegir protocolo UDP
nordvpn set protocol udp

:: 3. Desactivar auto-conexión (evita que vuelva a NordLynx)
nordvpn set autoconnect off

:: 4. Desconectar
nordvpn -d

:: 5. Conectar con OpenVPN UDP
nordvpn -c
  • Si ves el handshake TLS y respuesta de Caddy/Jellyfin, el acceso remoto está permitido y funcionando.

Luego sube la métrica del TAP de Nord y baja la de tu NIC física (ej. “Ethernet 6”):

netsh interface ipv4 set interface "Ethernet 6" metric=1
netsh interface ipv4 set interface "TAP-NordVPN Windows Adapter" metric=300

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

  1. Abre NordVPN → icono de engranaje (Ajustes).

  2. Entra en Opciones → Conexión y seguridad.

  3. 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):

    curl -vk https://TU_DOMINIO --resolve TU_DOMINIO:443:TU_IP_PUBLICA
    

    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):

New-NetFirewallRule -DisplayName "BLOCK Caddy → NordVPN (10.0.0.0/8 + 172.16.0.0/12)" `
  -Direction Outbound -Action Block `
  -Program "C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe" `
  -RemoteAddress 10.0.0.0/8,172.16.0.0/12 `
  -Profile Any -Enabled True

5.2 Bloqueo INBOUND (evita que entradas a 80/443 “caigan” por la IP del adaptador de Nord):

New-NetFirewallRule -DisplayName "BLOCK Caddy IN en NordVPN (10.0.0.0/8)" `
  -Direction Inbound -Action Block `
  -LocalPort 80,443 -Protocol TCP `
  -LocalAddress 10.0.0.0/8 `
  -Profile Any -Enabled True

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:

route delete 192.168.1.0
route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 metric 1 -p

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):

{
  email [email protected]
  storage file_system {
    root C:\ProgramData\chocolatey\lib\caddy\tools\data
  }
}

sampledomain.ddns.net {
  bind 192.168.1.50        # <-- tu IP LAN estática
  encode zstd gzip
  @http    { protocol http }
  redir @http https://{host}{uri} 308

  reverse_proxy 127.0.0.1:8096
}

Si no quieres puerto 80, y solo 443, para https (recomendable).

{
    email [email protected]
    storage file_system {
        root C:\ProgramData\chocolatey\lib\caddy\tools\data
    }
}

sampledomain.ddns.net {
    tls {
        issuer acme {
            disable_http_challenge  
        }
    }
    bind 192.168.1.50
    reverse_proxy 127.0.0.1:8096
}
  • El bind fuerza 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:

curl -vk https://sampledomain.ddns.net/ --resolve sampledomain.ddns.net:443:TU_IP_PUBLICA

9) (Opcional) Ejecutar Caddy como servicio y que le aplique el split

Si usas NSSM:

nssm install Caddy "C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe" run --config Caddyfile
nssm set Caddy AppDirectory "C:\ProgramData\chocolatey\lib\caddy\tools"
nssm set Caddy AppStdout "C:\ProgramData\caddy\logs\caddy.out.log"
nssm set Caddy AppStderr "C:\ProgramData\caddy\logs\caddy.err.log"

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)

  1. Escucha

netstat -ano | findstr :80
netstat -ano | findstr :443

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.

  1. Local

curl http://192.168.1.50:8096  (Jellyfin)
curl -k https://192.168.1.50   (Caddy -> Jellyfin, cert interno si lo pones)
  1. Desde fuera (4G u otra red)

curl -vk https://sampledomain.ddns.net/
  1. IP pública para tráfico general (debería ser la de Nord)

curl ifconfig.me

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.exe a 10.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/24 por tu gateway.

  • Caddy:


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

October 29, 2025, 26 minutos

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)

  1. Entra a Panel admin → Plugins → Repositories.

  2. Pulsa + para añadir un repositorio:

    • Name: Jellyfin.Xtream

    • URL: https://kevinjil.github.io/Jellyfin.Xtream/repository.json

    • Save. GitHub

  3. Ve a Plugins → Catalog → sección Live TV → Jellyfin Xtream → Install.

  4. (Opcional) Elige la versión que prefieras antes de instalar.

  5. 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)

  1. Abre la pestaña Live TV.

  2. Selecciona categorías o canales concretos que quieras exponer.

  3. (Opcional) En TV Overrides ajusta número de canal, nombre e iconos.

  4. 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

October 29, 2025, 37 minutos

Objetivo: que puedas entrar a tu Jellyfin desde internet por HTTPS con certificado válido (Let’s Encrypt) en https://sampledomain.ddns.net, terminando TLS en Caddy y sin tocar el TLS interno de Jellyfin.


0) Requisitos previos (resumen)

  • Windows 10/11 con permisos de administrador.

  • Jellyfin Server instalado y escuchando en http://127.0.0.1:8096. jellyfin.org+1

  • Una cuenta No-IP con el hostname sampledomain.ddns.net, más su Dynamic Update Client (DUC) instalado para mantener la IP actualizada. noip.com+1

  • Reenvío de puertos en tu router:

    • TCP 443 (WAN) → PC:443 (obligatorio para HTTPS y validación TLS-ALPN-01).

  • 443 libre en Windows (que no esté ocupado por IIS/Apache/etc.).


1) Instalar Jellyfin (si aún no lo tienes)

  1. Descarga el instalador para Windows desde la web oficial. jellyfin.org

  2. Ejecuta el instalador y completa el asistente. Guía oficial de Windows aquí. jellyfin.org

  3. Abre Jellyfin (normalmente en http://localhost:8096) y completa el asistente inicial.

  4. No actives HTTPS en Jellyfin (lo hará Caddy).

  5. En Dashboard → Networking → Known proxies añade 127.0.0.1 (y ::1).


2) Crear y mantener el DDNS sampledomain.ddns.net (No-IP)

  1. Crea el hostname sampledomain.ddns.net en tu cuenta No-IP.

  2. Instala el Dynamic Update Client (DUC) para Windows y entra con tu usuario. Marca el hostname para que se actualice automáticamente cuando cambie tu IP. noip.com+1

  3. Otra opción es si tu router lo permite activar la opción de dns dinamico y así no es necesario instalar ningún programa.
  4. Verificación rápida:

    nslookup sampledomain.ddns.net

    Debe resolver a tu IP pública actual.


3) Instalar Caddy (elige A o B)

A) Con Chocolatey (rápido)

  1. Instala Chocolatey (PowerShell como Administrador):

    Set-ExecutionPolicy Bypass -Scope Process -Force; `
    [System.Net.ServicePointManager]::SecurityProtocol = `
      [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
    iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
    
    Instrucciones oficiales. Chocolatey Software
  2. Instala Caddy:

    choco install caddy -y
    

    (También puedes consultar la página de instalación/descarga oficial de Caddy.) Caddy Web Server+1

B) Instalación manual

  1. Descarga el binario de Caddy para Windows (amd64) desde la página oficial o desde Releases en GitHub.

  2. Crea C:\caddy\ y coloca caddy.exe ahí. Caddy Web Server+1

  3. Si lo instalas con chocolatey a mi se me instalo en C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe

4) Configurar Caddyfile

Crea el archivo Caddyfile (en C:\caddy\Caddyfile si instalaste manual; con Chocolatey puedes usar la carpeta donde esté caddy.exe, p. ej. C:\ProgramData\chocolatey\lib\caddy\tools\Caddyfile) con este contenido mínimo:

{
    email [email protected]
    # guarda los certificados en una ruta conocida (ajusta si quieres)
    storage file_system {
        root C:\caddy\data
    }
}

sampledomain.ddns.net {
    # si NO vas a abrir el puerto 80 externo, desactiva el desafío HTTP-01
    tls {
        issuer acme {
            disable_http_challenge
        }
    }

    reverse_proxy 127.0.0.1:8096
}

Notas:

  • Si sí abres el puerto 80 → puedes quitar el bloque tls { ... } y dejar que Caddy use tanto HTTP-01 como TLS-ALPN-01 automáticamente.

  • Caddy gestiona Let’s Encrypt automáticamente (emisión y renovación). Caddy Web Server


5) Abrir Windows Firewall (solo 443)

Permite la entrada al 443 para caddy.exe (ajusta la ruta si usaste Chocolatey):

netsh advfirewall firewall add rule name="Caddy IN 443" dir=in action=allow protocol=TCP localport=443 program="C:\caddy\caddy.exe"
(Si usaste Chocolatey y ejecutas desde su ruta: cambia C:\caddy\caddy.exe por la ruta real, p. ej. C:\ProgramData\chocolatey\lib\caddy\tools\caddy.exe.)

6) Reenvío de puertos en el router

  • TCP 443 (WAN) → IP_del_PC:443 (obligatorio).

  • (Opcional) TCP 80 (WAN) → IP_del_PC:80.

Si estás detrás de CGNAT (la IP WAN de tu router no coincide con tu IP pública), las conexiones entrantes no funcionarán; en ese caso necesitarías un servidor intermedio o un cambio de plan/ISP.


7) Arrancar Caddy y emitir el certificado

Prueba en primer plano

cd C:\caddy
caddy run --config Caddyfile
Verás en el log mensajes tipo “enabling automatic TLS certificate management” y la obtención del certificado. (Si algo falla, Caddy lo dirá claro: puertos ocupados, validación ACME, etc.). Caddy Web Server

Prueba desde fuera

  • Navegador en 4G (o desde otra red): https://sampledomain.ddns.net/

  • También puedes forzar hacia tu IP pública:

    curl -vk https://sampledomain.ddns.net/ --resolve sampledomain.ddns.net:443:TU_IP_PUBLICA
    

8) Ejecutar Caddy como servicio (opcional, recomendado)

En Windows, Caddy no trae “service manager” propio. Usa NSSM:

  1. Descarga NSSM. nssm.cc

  2. Instala el servicio (ajusta rutas si usaste Chocolatey):

nssm install Caddy "C:\caddy\caddy.exe" run --config Caddyfile
nssm set Caddy AppDirectory "C:\caddy"
nssm set Caddy Start SERVICE_AUTO_START
nssm start Caddy

Página oficial de NSSM y alternativa de releases por si la principal te descarga más lento. nssm.cc+1


9) Ajustes útiles de Jellyfin

  • Known proxies: 127.0.0.1 y/o ::1.

  • Base URL vacía si sirves en raíz (/). Si algún día quieres https://sampledomain.ddns.net/jellyfin, pon Base URL = /jellyfin y cambia el reverse_proxy o usa handle_path/route en Caddy.

  • Prioriza Direct Play en los clientes para evitar transcodificar; si tienes que transcodificar, habilita aceleración por hardware (Quick Sync / NVENC).


10) Problemas comunes (y cómo reconocerlos)

  • El navegador avisa “sitio no seguro”:

    • Usaste staging de ACME (cert de pruebas) o la validación falló y Caddy sirvió autofirmado. Revisa logs y abre 443→PC:443 correctamente. Caddy Web Server

  • Caddy no arranca en 443:

    • netstat -ano | findstr :443

       otro proceso ocupa el puerto (Apache/IIS). Muévelo o para ese servicio.

  • Let’s Encrypt no puede validar:

    • Timeout al conectar a 443/80 → falla de router/ISP/firewall. El log de Caddy lo indicará. Caddy Web Server

  • El hostname no resuelve a tu IP:

    • Revisa el DUC de No-IP o configura DDNS en tu router. noip.com+1


11) Resumen de comandos clave

:: Jellyfin: (instalador desde web oficial)  ── ver paso 1
:: Chocolatey (opción A)
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
 "Set-ExecutionPolicy Bypass -Scope Process -Force; ^
  [System.Net.ServicePointManager]::SecurityProtocol = ^
  [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; ^
  iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))"

choco install caddy -y

:: Firewall (entrada 443 para Caddy)
netsh advfirewall firewall add rule name="Caddy IN 443" dir=in action=allow protocol=TCP localport=443 program="C:\caddy\caddy.exe"

:: Arrancar en primer plano
cd C:\caddy
caddy run --config Caddyfile

Enlaces oficiales que usarás

Acerca de

Este es el blog donde poner guías para ciertas cosas así como contar novedades sobre webtool.es
Powered by BS5 Simply Blog and Bludit
Navigation