Nginx Proxy Manager: exponiendo tus servicios al público
Instalación y configuración de un proxy inverso para tener acceso externo a tus servicios
En tu homelab, tarde o temprano te pasa: montas varios servicios chulos (Home Assistant, un par de webs, algún contenedor más) y sólo puedes acceder a ellos dentro de tu red local.
Si quieres usarlos desde fuera de casa, compartirlos con alguien o simplemente no andar peleándote con puertos raros, necesitas un proxy inverso decente por delante. Nginx es una de esas piezas que encajan muy bien en el puzzle homelab: te centraliza el acceso, te pone HTTPS con un clic y te obliga (para bien) a pensar qué quieres exponer y cómo.
En este artículo vamos a ver cómo hacer justo eso con Nginx Proxy Manager (NPM), usando Docker, certificados TLS de Let’s Encrypt y unas cuantas buenas prácticas para no dejar la casa abierta de par en par.
¿Qué es Nginx Proxy Manager y por qué te interesa?
Nginx Proxy Manager es una capa amigable por encima de Nginx que te da:
- Panel web para crear proxies inversos sin escribir configuraciones a mano. Básicamente, poder crear subdominios y paths que lleguen a tus servicios de forma fácil y sencilla.
- Gestión de certificados TLS, incluyendo Let’s Encrypt con renovación automática. Olvídate de certificados caducados y el dolor de gestionarlos.
- Listas de acceso, autenticación básica y redirecciones HTTP→HTTPS con un par de clics. Que la seguridad hay que tenerla siempre en cuenta, y más si expones algo públicamente.
Dejas de pelearte con ficheros de configuración llenos de directivas raras y te quedas con una interfaz web donde sólo tienes que indicar:
- Qué dominio quieres exponer.
- A qué IP/puerto interno debe apuntar.
- Con qué certificados y qué reglas de acceso.
¿Y qué pasa cuando alguien hace una petición a tu dominio para, por ejemplo, ver este blog? Pues que hay toda una secuencia de llamadas entre sistemas para conseguir llegar donde el usuario necesita:
sequenceDiagram
autonumber
actor Usuario as Navegador del usuario
participant DNS as Servidor DNS
participant Proxy as Nginx Proxy Manager<br/>(proxy inverso)
participant Servicio as Servicio interno<br/>(p.ej. este blog)
Usuario->>DNS: 1. Resuelve dominio (www.y-segura.com)
DNS-->>Usuario: 2. Devuelve IP pública del proxy
Usuario->>Proxy: 3. Petición HTTPS a www.y-segura.com
Proxy->>Proxy: 4. Selecciona proxy host según dominio y ruta
Proxy->>Servicio: 5. Reenvía petición a IP:PUERTO interno
Servicio-->>Proxy: 6. Respuesta HTTP del servicio
Proxy-->>Usuario: 7. Devuelve respuesta al navegador (HTTPS)
Instalación básica
Requisitos previos
Antes de desplegar Nginx Proxy Manager vamos a asumir que ya tienes:
- Una máquina encendida 24/7 (servidor, mini PC, NAS o similar) donde correr Docker.
- Docker y Docker Compose instalados y funcionando.
- Acceso al router para abrir y redirigir puertos (búscalo en la sección NAT).
- Uno o varios dominios/subdominios que puedas gestionar (DNS).
Si no tienes dominio propio, puedes usar uno barato o incluso alguno de los servicios que permiten subdominios gratuitos; lo importante es que puedas crear registros A/AAAA o CNAME hacia tu IP pública.
Desplegando Nginx Proxy Manager con Docker
La forma más sencilla de desplegar NPM es con un docker-compose.yml.
En el directorio donde quieras dejar la configuración, crea un fichero parecido a este:
version: "3.8"
services: npm: image: jc21/nginx-proxy-manager:latest restart: unless-stopped ports: - "80:80" # HTTP - "81:81" # Panel de administración - "443:443" # HTTPS volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt # Opcional, sólo si sabes lo que haces: # network_mode: "host"Con esto:
- El puerto 81 es el que usarás para entrar al panel de NPM. Aquí establecerás toda la configuración de hosts, redirecciones, certificados, políticas, etc.
- Los datos y certificados quedan persistidos en
./datay./letsencrypt.
Levanta el servicio:
docker compose up -dComprueba que el contenedor está sano:
docker psSi ves el contenedor jc21/nginx-proxy-manager en estado Up, buena señal.
Primer acceso al panel
Abre el navegador desde tu red local y entra en:
http://IP_DE_TU_SERVIDOR:81
Las credenciales por defecto suelen ser algo del estilo:
- Usuario:
[email protected] - Contraseña:
changeme
(Revísalo siempre en la documentación o en la página del proyecto, por si cambian en futuras versiones).
En cuanto entres, cambia inmediatamente:
- Correo de administrador.
- Contraseña de acceso.
No dejes nunca las credenciales por defecto; este panel va a controlar todo el tráfico que expones.
Abrir puertos en el router
Para que Internet llegue hasta tu Nginx Proxy Manager necesitas redirecciones de puertos (port forwarding) en el router:
- Puerto externo 80 → IP del servidor NPM, puerto 80.
- Puerto externo 443 → IP del servidor NPM, puerto 443.
Con eso, cualquier petición que entre desde fuera a tu IP pública en HTTP/HTTPS acabará en el contenedor de NPM, y él decidirá a qué servicio interno reenviarla. Es el GPS de tu dominio, diciéndole a todo el tráfico que entra cómo llegar al destino.
Si tu operador bloquea el puerto 80, puedes:
- Usar sólo 443 y forzar HTTPS.
- Usar un puerto externo distinto redirigido a 443 y jugar con tu configuración DNS/cliente.
- Tirar de algún túnel tipo Cloudflare Tunnel, aunque eso ya es otro tema.
Como recomendación, todo dominio que expongas debería estar securizado con TLS y su correspondiente certificado, así que sólo deberías recibir tráfico por el puerto 443. Además, con buen criterio, la mayoría de navegadores al introducir una url automáticamente fuerzan https e incluso algunos se niegan a funcionar por http.
Gestionando los dominios
Preparar el DNS: dominios y subdominios
Cada servicio que quieras exponer tendrá su propio dominio o subdominio, algo como:
ha.mi-dominio.com→ Home Assistantmedia.mi-dominio.com→ tu servidor multimediagrafana.mi-dominio.com→ Grafana- …
En el panel de tu proveedor DNS crea registros A (o AAAA si usas IPv6):
- Tipo: A
- Nombre:
ha(o el subdominio que quieras) - Valor: tu IP pública
Repite para cada servicio que quieras publicar.
Si tu proveedor te permite utilizar wildcards, podrías definir *.mi-dominio.com y mi-dominio.com apuntando a tu IP pública, y controlar todos los subdominios directamente desde NPM sin tener que darlos de alta en el DNS
Si tu IP es dinámica y cambia de vez en cuando, plantéate configurar:
- Un cliente de DNS dinámico (DDNS) que actualice los registros.
- O algún servicio tipo Cloudflare + script para ir ajustando la IP.
Y por “plantéate” no me refiero a que lo pienses, sino a que te mentalices de que es algo cuasi obligatorio. No quieres que en el momento que más falta te haga no puedas acceder porque tu proveedor te ha actualizado la IP y te has quedado fuera.
Crear tu primer Proxy Host
Ahora viene lo divertido: decirle a Nginx Proxy Manager que cuando alguien vaya a ha.mi-dominio.com lo mande a tu Home Assistant interno.
En el panel de NPM:
- Ve a “Proxy Hosts” y pulsa “Add Proxy Host”.
- En “Domain Names” pon el subdominio completo, por ejemplo
ha.mi-dominio.com. - En “Scheme” elige
httpohttpssegún cómo sirva tu servicio interno (normalmente http y se delega el https a NPM). - En “Forward Hostname / IP” pon la IP local del servicio (p.ej.
192.168.1.50). - En “Forward Port” el puerto interno (p.ej.
8123para Home Assistant).
Marca además:
- Block Common Exploits para que filtre algunos patrones maliciosos habituales.
- Websockets Support si tu servicio usa websockets (Home Assistant, muchas UIs modernas, etc.).
Guarda y, en principio, ya tendrías un proxy básico funcionando en HTTP accesible desde el exterior.
Seguridad y accesos
Añadiendo certificados TLS (HTTPS)
Tener tus servicios expuestos sólo en HTTP no es buena idea; el siguiente paso es activar HTTPS con certificados válidos. Nginx Proxy Manager se integra con Let’s Encrypt y puedes emitir y renovar certificados automáticamente. Quien no ha tenido que gestionar certificados antes de que llegasen estas herramientas no las valora lo suficiente.
En el proxy que acabas de crear:
- Edita el Proxy Host y ve a la pestaña “SSL”.
- En “SSL Certificate” selecciona “Request a new SSL Certificate”.
- Marca la casilla de “Force SSL” para redirigir todo a HTTPS.
- Acepta los términos de Let’s Encrypt y guarda.
Si el DNS está bien configurado y el puerto 80/443 llegan a NPM, la emisión del certificado debería completarse en unos segundos.
A partir de ese momento, tu servicio será accesible en https://ha.mi-dominio.com con candadito verde. Los navegadores no se quejarán, el usuario verá que las comunicaciones están protegidas y tú serás feliz sabiendo que lo has hecho como hay que hacerlo.
También se puede solicitar un certificado con wildcard de forma que te sirva para todos tus subdominios. Lo veremos en otro artículo.
Autenticación y listas de acceso
Publicar servicios directamente a Internet tiene un riesgo evidente: cualquiera que descubra la URL puede intentar entrar. NPM te permite añadir varias capas de control sin tocar el servicio por debajo.
Tienes dos herramientas básicas:
- Listas de acceso (basadas en IP y/o autenticación).
- Autenticación básica HTTP (usuario/contraseña).
En el panel:
- Ve a “Access Lists” y crea una nueva.
- Puedes definir usuarios con nombre de usuario y contraseña para proteger el acceso.
- También puedes indicar IPs o rangos permitidos/denegados para limitar quién puede llegar.
Después, en tu Proxy Host:
- Asigna la Access List que acabas de crear.
Esto es muy útil, por ejemplo, para:
- Dejar un servicio accesible sólo desde ciertas IPs (trabajo, VPN, etc.).
- Añadir un usuario/contraseña genérico delante de un servicio que no trae autenticación propia o que quieres “tapar” con una capa extra.
Ajustes avanzados: pestaña “Advanced”
Para la mayoría de casos domésticos no necesitas tocar nada más, pero la pestaña “Advanced” de cada Proxy Host te deja escribir directivas personalizadas de Nginx.
Ejemplos típicos:
- Ajustar tamaños máximos de subida.
- Añadir cabeceras de seguridad (HSTS, Content Security Policy, etc.).
- Bloquear ciertos agentes de usuario o patrones de URL.
- Integrar autenticación con otros servicios como Authelia o similares.
Si vienes del mundo Nginx “a pelo”, esto es donde puedes volcar tus bloques location o reglas especiales sin perder la comodidad del panel.
Algunos consejos de seguridad
Exponer servicios desde casa siempre conlleva algo de riesgo, pero puedes minimizarlo con unas cuantas costumbres básicas:
- Mantén NPM al día: actualiza la imagen Docker cada cierto tiempo.
- No abras más servicios de los necesarios; mejor menos cosas expuestas y bien controladas.
- Usa Access Lists y autenticación siempre que el servicio sea sensible.
- Revisa los logs de acceso de vez en cuando para detectar patrones raros.
- Para cosas muy críticas, valora usar una VPN en lugar de exponerlas directamente.
- Integra monitorización y alertado para no depender de que recuerdes revisar logs (patrones raros, intentos de acceso fallidos, etc).
Qué más puedes hacer con NPM
Una vez que le pillas el truco al panel, puedes ir un poco más allá:
- Definir redirecciones simples (por ejemplo, de un dominio antiguo a uno nuevo).
- Usar “Redirection Hosts” para gestionar cambios de infraestructura.
- Montar varios servicios detrás del mismo dominio usando rutas (
/app1,/app2) con reglas avanzadas.
Y todo esto con una interfaz web razonablemente amigable, sin necesidad de editar un solo archivo de configuración en el servidor.