Abrir puertos detrás de NAT cuando el ISP bloquea UPnP y NAT-PMP

Written by

in

Un problema común en homelabs: quieres exponer un servicio P2P (un nodo, un servidor de juego, un servicio de mensajería descentralizada) a internet, pero el router del ISP tiene bloqueados los protocolos estándar de apertura automática de puertos. Este es el diagnóstico y las alternativas cuando eso pasa.

Diagnóstico del problema

Se intentó forzar al router del ISP a abrir el puerto de forma automática desde la terminal de la máquina local, pero ambos protocolos estándar fallaron porque el ISP los tiene bloqueados o desactivados:

  • UPnP: falló con el error No valid UPNP Internet Gateway Device found.
  • NAT-PMP: falló con el error Connection refused (errno=111), lo que confirma que el router rechaza las peticiones de reenvío de puertos.

Comandos utilizados para el diagnóstico

Instalación de herramientas de mapeo automático:

sudo apt install miniupnpc natpmpc

Intento de apertura con UPnP:

upnpc -a $(hostname -I | cut -d' ' -f1) 18080 18080 TCP

Intento de apertura con NAT-PMP:

natpmpc -a 18080 18080 tcp

Verificación local de que el servicio está escuchando en el puerto:

sudo ss -tulpn | grep :18080

Alternativas sin acceso al router

Al no tener las credenciales del router ni soporte de apertura automática, estas son las alternativas para saltarse el NAT del ISP de forma gratuita, de menor a mayor esfuerzo:

A. Usar el servicio en modo «privado» (la opción sin cambios)

No es necesario hacer nada. El servicio funcionará haciendo conexiones salientes (outbound) sin problema — se puede sincronizar, consultar y usar localmente. El único inconveniente es que otros nodos externos no podrán iniciar conexiones hacia el equipo (inbound).

B. Redes mesh (para conectar tus propios dispositivos)

Si el objetivo es conectar un celular o laptop propio al servicio de casa estando fuera, sin necesitar acceso público real, la solución más simple es usar Tailscale o ZeroTier. Ambas evitan el router usando UDP hole punching, sin necesidad de configurar nada en él.

Instalar ZeroTier:

curl -s https://install.zerotier.com | sudo bash
sudo zerotier-cli join [ID_DE_TU_RED]

C. Túnel SSH inverso (para exponer el servicio 100% público y gratis)

Se puede crear una cuenta en Oracle Cloud (Always Free Tier) para obtener un VPS gratuito con IP pública, y redirigir el tráfico desde ahí hacia el equipo local sin gastar dinero:

ssh -N -R 18080:localhost:18080 usuario@ip_vps_gratis

Con esto, cualquier conexión que llegue al puerto 18080 del VPS se reenvía automáticamente al puerto 18080 de la máquina local, sin que el router del ISP intervenga en absoluto.

D. Exposición temporal (pruebas rápidas)

Si solo se necesita exponer el puerto temporalmente, para una prueba puntual desde afuera:

sudo snap install ngrok
ngrok tcp 18080

Cuál elegir según el caso

  • Modo privado — suficiente si el servicio solo se necesita para uso propio, sin depender de conexiones entrantes de terceros.
  • Red mesh (Tailscale/ZeroTier) — ideal para acceso personal remoto (celular, laptop) sin exponer nada realmente a internet público.
  • Túnel SSH inverso — la opción más robusta y permanente si se necesita exposición pública real y gratuita, aprovechando un VPS con IP fija.
  • ngrok — el más rápido de levantar, pero pensado para pruebas puntuales, no para uso permanente (la URL/puerto cambia en el plan gratuito).