Skip to main content
  1. Comandi/

traefik

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Edge router e reverse proxy che legge i label dei container Docker e configura automaticamente il routing HTTP/HTTPS. Quando un container viene avviato con i label corretti, Traefik lo rende immediatamente raggiungibile senza toccare nessun file di configurazione.


Come funziona — architettura
#

graph TD
    Internet -->|porta 80/443| T[Traefik]
    T -->|legge label| D[Docker API]
    D -->|restituisce metadati container| T
    T -->|Host chat.dominio.it| C1[Chatwoot :3000]
    T -->|Host n8n.dominio.it| C2[n8n :5678]
    T -->|Host portainer.dominio.it| C3[Portainer :9000]

Traefik interroga continuamente Docker per sapere quali container sono attivi e quali label hanno. Ogni volta che avvii o spegni un container, il routing si aggiorna automaticamente.


Configurazione via Docker labels
#

Tutti i parametri di routing si definiscono come label nel docker-compose.yml del servizio:

LabelSignificatoCosa fa
traefik.enable=trueenable — abilita gestioneDice a Traefik di gestire questo container
traefik.http.routers.X.rulerouter rule — regola di routingDefinisce il dominio (Host(\chat.dominio.it`)`)
traefik.http.services.X.loadbalancer.server.portloadbalancer port — porta internaIndica la porta su cui ascolta il container
traefik.http.routers.X.tls=truetls — Transport Layer SecurityAbilita HTTPS su questo router
traefik.http.routers.X.tls.certresolvercertresolver — risolutore certificatiUsa Let's Encrypt per il certificato SSL

exposedByDefault e il label traefik.enable
#

Traefik nel compose del progetto AntonellAI e' configurato con:

- "--providers.docker.exposedbydefault=false"
# exposedbydefault = esponi automaticamente tutti i container
# false = non farlo — ogni container deve dichiararsi esplicitamente

Con questa opzione attiva, Traefik ignora tutti i container sulla rete web a meno che non abbiano il label:

labels:
  - "traefik.enable=true"

Senza exposedbydefault=false, qualsiasi container aggiunto alla rete web verrebbe esposto automaticamente — un rischio di sicurezza in produzione.

Note

Un container puo' essere sulla rete web e non essere raggiungibile da Traefik se non ha il label traefik.enable=true. Questo e' il comportamento corretto: la rete web e' il canale di comunicazione, il label e' il permesso esplicito.


Esempio docker-compose.yml
#

services:
  chatwoot:
    image: chatwoot/chatwoot
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.chat.rule=Host(`chat.example.it`)"
      - "traefik.http.routers.chat.tls=true"
      - "traefik.http.routers.chat.tls.certresolver=letsencrypt"
      - "traefik.http.services.chat.loadbalancer.server.port=3000"

Flusso di una richiesta HTTPS
#

sequenceDiagram
    participant U as Utente
    participant T as Traefik :443
    participant C as Chatwoot :3000

    U->>T: GET https://chat.example.it
    T->>T: legge Host header
    T->>T: cerca router con rule Host(chat.example.it)
    T->>T: trova → service chat → porta 3000
    T->>C: GET http://chatwoot:3000 (rete interna Docker)
    C->>T: 200 OK + HTML
    T->>U: 200 OK + HTML (cifrato TLS)

Scenario Reale — Blue Team
#

Traefik centralizza i log di accesso di tutti i servizi in un unico punto. Un analista SOC puo' cercare pattern di attacco su tutti i servizi con un solo comando invece di controllare i log di ogni container separatamente:

# Log di tutti i servizi in tempo reale
docker logs traefik -f

# Cerca tentativi di accesso a path sospetti
docker logs traefik 2>&1 | grep -E "wp-admin|\.env|etc/passwd"

# Conta richieste per IP (potenziale brute force)
docker logs traefik 2>&1 | awk '{print $1}' | sort | uniq -c | sort -rn | head
Tip

Traefik e' il punto ideale dove installare CrowdSec o Fail2Ban — tutti gli accessi passano da li', quindi un singolo blocco protegge tutti i servizi dietro il proxy.


Certificati Let's Encrypt — acme.json
#

Traefik salva i certificati SSL in un file acme.json dentro il volume mappato:

volumes:
  - traefik_letsencrypt:/letsencrypt   # volume named
  # dentro /letsencrypt ci sara' acme.json con tutti i certificati

Il file acme.json contiene i certificati per tutti i domini gestiti da Traefik. Se il volume viene perso o ricreato, Traefik genera nuovi certificati — ma Let's Encrypt ha un rate limit:

Rate limit Let's Encrypt: 5 certificati per dominio ogni 7 giorni

Se si supera il limite, il dominio rimane senza certificato valido e il browser mostra "tls: unknown certificate" per diversi giorni.

# Verifica il contenuto del volume certificati
sudo ls /var/lib/docker/volumes/traefik_traefik_letsencrypt/_data/
# acme.json

# Verifica che acme.json non sia vuoto
sudo cat /var/lib/docker/volumes/traefik_traefik_letsencrypt/_data/acme.json | python3 -m json.tool | grep -c "certificate"
Warning

Il volume traefik_letsencrypt deve essere incluso nel backup. Se si perde acme.json e si e' gia vicini al rate limit di Let's Encrypt, i domini restano irraggiungibili via HTTPS per giorni. Includilo nello script backup.sh.


Collegato a
#

  • system — categoria
  • docker — Traefik legge i metadati Docker
  • reverse-proxy — Traefik e' un'implementazione di reverse proxy

Related