Networking Docker Sicurezza Zero-Trust ⏱️ 10 min lettura

Cloudflare Tunnel & Docker: Esporre Servizi Senza Aprire Porte sul Router

Come pubblicare applicazioni web self-hosted, API e container Docker su Internet con SSL automatico, mitigazione DDoS e protezione Zero Trust, bypassando CGNAT e router residenziali.

⚠️ I rischi del Port Forwarding tradizionale: Aprire le porte 80 e 443 sul router di casa espone il tuo IP pubblico residenziale alle scansioni automatizzate di Shodan, Censys e botnet di brute-force. Con Cloudflare Tunnel (cloudflared), la connessione è solo in uscita: nessuna porta in ingresso è mai aperta sul firewall domestico.

1. Architettura di Cloudflare Tunnel

Il componente centrale è il demone open-source cloudflared, che gira come container Docker nel tuo homelab. All'avvio, il demone crea quattro tunnel crittografici ridondanti verso i server edge di Cloudflare via protocollo QUIC (UDP 7844).

Quando un utente naviga su app.tuodominio.it:

  1. Cloudflare termina la sessione TLS con certificato valido e filtra gli attacchi DDoS.
  2. La richiesta viene inoltrata attraverso il tunnel crittografico direttamente al tuo container.
  3. Il tuo indirizzo IP domestico rimane 100% invisibile al mondo esterno.

2. Configurazione del Docker Compose

Ecco la composizione ottimizzata per far comunicare cloudflared con i tuoi container applicativi (es. un server web Nginx o un'applicazione Node/Python) sulla stessa rete virtuale di Docker:

version: '3.8'

services:
  tunnel:
    image: cloudflare/cloudflared:latest
    container_name: cloudflare_tunnel
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=eyJhIjoiYTM0...IlTuoTokenCloudflare...
    networks:
      - web_network

  my_app:
    image: nginx:alpine
    container_name: web_service
    restart: unless-stopped
    volumes:
      - ./html:/usr/share/nginx/html:ro
    networks:
      - web_network

networks:
  web_network:
    name: internal_web_network
    driver: bridge

Avvia il container in background:

docker compose up -d

3. Configurazione del Routing (Public Hostname)

Nella dashboard web di Cloudflare Zero Trust (sezione Networks → Tunnels):

  1. Seleziona il tuo tunnel attivo e clicca su Configure.
  2. Vai alla scheda Public Hostname e clicca su Add a public hostname.
  3. Subdomain: app (diventerà app.tuodominio.it).
  4. Service Type: HTTP
  5. URL: web_service:80 (grazie al DNS interno di Docker, puoi usare direttamente il nome del container!).

4. Protezione con Cloudflare Access (Zero Trust)

Per pannelli di controllo critici (come Portainer, Proxmox o dashboard amministrative), puoi anteporre una schermata di login aziendale senza scrivere una riga di codice:

  • In Cloudflare Zero Trust, crea una nuova Access Application.
  • Associa l'URL app.tuodominio.it.
  • Imposta una policy che consenta l'accesso unicamente a utenti con la tua email verificata tramite codice OTP o login Google/GitHub.

❓ Domande Frequenti (FAQ Tecniche)

Cloudflare Tunnel funziona se la connessione è sotto CGNAT?

Sì, perfettamente. Poiché la connessione è aperta dall'interno del tuo server verso i server Cloudflare (outbound), bypassa completamente qualsiasi CGNAT, Starlink o connessione 4G/5G senza richiedere IP pubblico.

Qual è il limite di upload sui file con Cloudflare Tunnel?

Sul piano Free di Cloudflare, la dimensione massima di una singola richiesta HTTP in upload è di 100 MB. Per carichi di file massivi oltre i 100 MB è preferibile utilizzare una VPN WireGuard/Tailscale privata.

Il mio IP domestico è visibile a chi visita il sito?

No, l'IP residenziale non viene mai rivelato nei record DNS o negli header HTTP. Il traffico è filtrato dai nodi edge globali di Cloudflare, proteggendo il tuo homelab da attacchi DDoS.