Reverse Proxy: Nginx Proxy Manager (NPM)

🌐 Reverse Proxy: Nginx Proxy Manager (NPM)

::: info Un Reverse Proxy è un server che si posiziona tra gli utenti esterni e i tuoi servizi interni. Riceve le richieste sulla porta standard HTTPS (443) e le instrada al container corretto all’interno della rete Docker, aggiungendo un layer di sicurezza e crittografia. :::

1. Architettura e Vantaggi

L’utilizzo di un proxy centralizzato offre tre vantaggi architetturali critici:

  1. SSL Termination: Solo il proxy gestisce i certificati Let’s Encrypt. I container interni possono restare in HTTP, riducendo il carico computazionale.
  2. Single Port Entry: Sul router di casa/ufficio è necessario aprire solo la porta 443 verso il proxy.
  3. Abstraction: Puoi spostare i container tra diversi server Proxmox o VM senza che l’utente finale se ne accorga, cambiando solo l’IP di destinazione nel proxy.

2. Deploy di Nginx Proxy Manager

Utilizziamo una rete Docker dedicata chiamata proxy_net. Tutti i container che devono essere visibili dall’esterno dovranno essere collegati a questa rete.

Configurazione docker-compose.yaml

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - '80:80'   # HTTP
      - '81:81'   # Dashboard di gestione (Admin UI)
      - '443:443' # HTTPS
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - proxy_net

networks:
  proxy_net:
    external: true

3. Workflow di Esposizione Servizio

Quando installi un nuovo servizio (es. Portainer o AnythingLLM), segui questo protocollo:

  1. Docker Side: Assicurati che il container sia nella rete proxy_net.
  2. NPM Side:
    • Vai su Proxy Hosts -> Add Proxy Host.
    • Domain Names: Inserisci il sottodominio (es. portainer.carrubanet.duckdns.org).
    • Forward Hostname/IP: Inserisci il nome del container o l’IP della VM.
    • Forward Port: La porta interna del servizio (es. 9000).
    • Websockets Support: Abilita sempre per dashboard dinamiche.
  3. SSL Side:
    • Seleziona “Request a new SSL Certificate”.
    • Accetta i termini di Let’s Encrypt.
    • Abilita Force SSL e HSTS.

📉 Topologia del Traffico (Mermaid)


🛡️ Hardening e Sicurezza (Advanced)

Security Headers

Un architetto deve garantire l’integrità dei dati. Nella tab Advanced di ogni Proxy Host, è consigliato iniettare questi header di sicurezza:

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "no-referrer-when-downgrade";

Access Lists

Se hai servizi che devono essere accessibili solo dalla tua rete locale o tramite VPN, NPM permette di creare Access Lists. Puoi definire una whitelist di indirizzi IP (es. 192.168.1.0/24) o richiedere una password aggiuntiva (Basic Auth) prima di mostrare la pagina di login del servizio.


💡 Note dell’Ingegnere (Critical Thinking)

  • DNS Resolution: Assicurati che il tuo record DNS (es. DuckDNS o Cloudflare) punti sempre all’IP pubblico del tuo router. Se l’IP è dinamico, usa un client DDNS.
  • Port 80: Non chiuderla sul router. Let’s Encrypt la usa per la validazione del dominio tramite la sfida “HTTP-01”. NPM gestirà automaticamente il reindirizzamento da 80 a 443 per gli utenti.

Tags: #Docker #Nginx #ReverseProxy #SSL #Security #DevOps*

Last updated on Thursday, March 5, 2026
Built with Hugo
Theme Stack designed by Jimmy