🌐 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:
- SSL Termination: Solo il proxy gestisce i certificati Let’s Encrypt. I container interni possono restare in HTTP, riducendo il carico computazionale.
- Single Port Entry: Sul router di casa/ufficio è necessario aprire solo la porta 443 verso il proxy.
- 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:
- Docker Side: Assicurati che il container sia nella rete
proxy_net. - 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.
- 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*