🚀 Module L16 – Traefik (reverse-proxy moderne)

📘 Cours complet ⏱ 3h 🎯 Bloc 2 – Administration Linux
Objectifs : installer Traefik en bare metal sur Debian 13, configurer avec des fichiers dynamiques, sécuriser avec TLS, exposer des services internes.

📖 Introduction

Traefik est un reverse-proxy et load balancer moderne, conçu pour les architectures conteneurisées mais également parfaitement adapté aux environnements bare metal. Sa configuration déclarative, son support natif de Let's Encrypt et sa facilité d'utilisation en font un outil de choix pour exposer des services internes de maniÚre sécurisée. Ce module vous apprend à l'installer et à le configurer sur Debian 13 avec des fichiers dynamiques.

🎯

À l'issue de ce module, vous serez capable de :

  • Installer Traefik en bare metal sur Debian 13.
  • Comprendre la diffĂ©rence entre configuration statique et dynamique.
  • Configurer un dashboard sĂ©curisĂ© avec authentification.
  • Exposer des services internes (Cockpit, applications web) via des fichiers dynamiques.
  • SĂ©curiser avec Let's Encrypt et les middlewares (headers, compression, TLS).

🔍 Qu'est-ce que Traefik ?

📐 Architecture Traefik

ComposantRĂŽle
EntryPointsPoints d'entrée (ports) comme HTTP (80) et HTTPS (443).
ProvidersSources de configuration (fichiers, Docker, etc.).
RoutersRĂšgles de routage (domaine, chemin, headers).
ServicesBackends vers lesquels router.
MiddlewaresFonctions intermédiaires (authentification, headers, compression).
CertificatesResolversGestion des certificats (Let's Encrypt).

đŸ–„ïž Partie 1 – Installation bare metal sur Debian 13

Cette section détaille l'installation de Traefik 3.6.11 en bare metal sur Debian 13.2, sans utiliser Docker. Toutes les étapes sont réalisées en ligne de commande.

📌 PrĂ©requis : Un serveur Debian 13.2 avec un nom de domaine pointant vers son IP publique, et les ports 80/443 ouverts dans le pare-feu.

1. Mise Ă  jour du systĂšme

sudo apt update && sudo apt full-upgrade -y

2. Installation de curl

sudo apt install curl -y

3. Création de l'utilisateur systÚme traefik

Ajouter l'utilisateur systĂšme (sans shell) :

sudo useradd --system --home /etc/traefik --shell /bin/false traefik
  • --system : crĂ©e un compte systĂšme (UID < 1000).
  • --home /etc/traefik : dĂ©finit le rĂ©pertoire personnel de l'utilisateur.
  • --shell /bin/false : interdit toute connexion interactive.

4. Création de l'arborescence

sudo mkdir -p /etc/traefik /var/lib/traefik
sudo chown traefik:traefik /etc/traefik /var/lib/traefik

Les répertoires accueilleront la configuration (/etc/traefik) et les données persistantes (/var/lib/traefik).

5. Téléchargement et installation du binaire

cd /tmp
wget https://github.com/traefik/traefik/releases/download/v3.6.11/traefik_v3.6.11_linux_amd64.tar.gz
tar -xvzf traefik_v3.6.11_linux_amd64.tar.gz -C /usr/local/bin traefik
chmod +x /usr/local/bin/traefik
  • wget : tĂ©lĂ©charge l'archive de la version 3.6.11.
  • tar -xzvf : extrait le binaire traefik dans /usr/local/bin.
  • chmod +x : rend le binaire exĂ©cutable.

6. Fichier de configuration statique (traefik.yml)

Créer /etc/traefik/traefik.yml :

log:
  level: INFO

api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  websecure:
    address: ":443"
    http3: {}            # active HTTP/3 (QUIC) sur 443

providers:
  file:
    directory: "/etc/traefik/dynamic"
    watch: true

certificatesResolvers:
  le:
    acme:
      email: "VOTRE_MAIL@domaine.fr"   # ← À MODIFIER !
      storage: "/var/lib/traefik/acme.json"
      tlsChallenge: {}
  • log.level : niveau de logs (INFO, DEBUG, ERROR).
  • api.dashboard : active le tableau de bord, sĂ©curisĂ© via insecure: false.
  • entryPoints : dĂ©finit les ports d'Ă©coute et redirige HTTP vers HTTPS.
  • http3: {} : active HTTP/3 (QUIC) sur le port 443.
  • providers.file : charge les fichiers dynamiques depuis /etc/traefik/dynamic.
  • certificatesResolvers : configure Let's Encrypt avec le challenge TLS.

7. Fichier ACME (stockage des certificats)

sudo touch /var/lib/traefik/acme.json
sudo chown traefik:traefik /var/lib/traefik/acme.json
sudo chmod 600 /var/lib/traefik/acme.json

Le fichier doit ĂȘtre accessible en Ă©criture par l'utilisateur traefik avec des droits stricts.

8. Génération du mot de passe chiffré pour le dashboard

sudo apt install apache2-utils -y
htpasswd -nbB admin VOTRE_MOT_DE_PASSE

Conservez le hash généré pour l'étape suivante.

9. Configuration dynamique – Dashboard

Créer le dossier des fichiers dynamiques :

sudo mkdir -p /etc/traefik/dynamic

Créer /etc/traefik/dynamic/dashboard.yml :

http:
  routers:
    dashboard:
      rule: "Host(`traefik.mon-domaine.fr`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
      entryPoints: ["websecure"]
      service: api@internal
      tls:
        certResolver: le
      middlewares:
        - auth
        - SecureHeaders
        - Compression

    dashboard-root:
      rule: "Host(`traefik.mon-domaine.fr`) && Path(`/`)"
      entryPoints: ["websecure"]
      service: api@internal
      tls:
        certResolver: le
      middlewares:
        - dash-redirect
        - SecureHeaders

  middlewares:
    auth:
      basicAuth:
        realm: "Traefik"
        users:
          - "admin:COLLER_ICI_LE_HASH_GÉNÉRÉ"   # ← À MODIFIER

    dash-redirect:
      redirectRegex:
        regex: "^/$"
        replacement: "/dashboard/"
        permanent: true
  • rule : redirige traefik.mon-domaine.fr vers le dashboard.
  • service: api@internal : service interne de Traefik.
  • middlewares : chaĂźne de middlewares (authentification, headers, compression).
  • dash-redirect : redirige / vers /dashboard/.
  • users : utilisateur admin avec mot de passe hashĂ©.

10. Middleware TLS (sécurisation du protocole)

Créer /etc/traefik/dynamic/tls.yml :

tls:
  options:
    default:
      minVersion: "VersionTLS12"
      preferServerCipherSuites: true
      cipherSuites:
        - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
        - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
        - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
        - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
        - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
      curvePreferences:
        - CurveP256
        - CurveP384
        - CurveP521
  • minVersion: VersionTLS12 : impose TLS 1.2 minimum.
  • cipherSuites : liste des suites de chiffrement autorisĂ©es (sĂ©curisĂ©es).
  • curvePreferences : courbes elliptiques pour les Ă©changes de clĂ©s.

11. Middleware Headers (sécurité HTTP)

Créer /etc/traefik/dynamic/headers.yml :

http:
  middlewares:
    Compression:
      compress:
        excludedContentTypes:
          - text/event-stream

    SecureHeaders:
      headers:
        forceSTSHeader: true
        stsSeconds: 63072000
        stsIncludeSubdomains: true
        stsPreload: true
        customFrameOptionsValue: "SAMEORIGIN"
        contentTypeNosniff: true
        referrerPolicy: "same-origin"
        permissionsPolicy: >-
          accelerometer=(), camera=(), geolocation=(),
          gyroscope=(), magnetometer=(), microphone=(),
          payment=(), usb=()
        contentSecurityPolicy: >-
          default-src 'self';
          script-src 'self' 'unsafe-inline' 'unsafe-eval';
          style-src 'self' 'unsafe-inline';
          img-src 'self' data: blob:;
          font-src 'self' data:;
          connect-src 'self' https: wss:;
          frame-ancestors 'self';
          base-uri 'self';
          form-action 'self';
          upgrade-insecure-requests
  • Compression : active la compression gzip pour les rĂ©ponses.
  • SecureHeaders : ajoute des en-tĂȘtes de sĂ©curitĂ© (HSTS, X-Frame-Options, CSP...).
  • CSP : Content Security Policy autorisant les sources nĂ©cessaires pour le dashboard.

12. Service systemd

Créer /etc/systemd/system/traefik.service :

[Unit]
Description=Traefik Reverse Proxy
After=network-online.target
Wants=network-online.target

[Service]
User=traefik
Group=traefik
ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.yml
WorkingDirectory=/etc/traefik
Restart=on-failure
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
LimitNOFILE=1048576
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/traefik /etc/traefik

[Install]
WantedBy=multi-user.target
  • User=traefik : exĂ©cute le service avec l'utilisateur dĂ©diĂ©.
  • AmbientCapabilities : permet de lier les ports < 1024 (80, 443).
  • ProtectSystem=full : restreint l'accĂšs au systĂšme de fichiers.
  • ReadWritePaths : autorise l'Ă©criture dans les rĂ©pertoires de configuration et de donnĂ©es.

13. Démarrage et activation

sudo systemctl daemon-reload
sudo systemctl enable --now traefik
sudo systemctl status traefik

Vérifiez que le service est active (running).

14. Test du dashboard

Depuis un navigateur, accédez à https://traefik.mon-domaine.fr et connectez-vous avec les identifiants configurés.


📂 Partie 2 – Exposer des services avec des fichiers dynamiques

Une fois Traefik installé, vous pouvez exposer n'importe quel service interne (serveur web, cockpit, GitLab, etc.) en créant simplement un fichier YAML dans /etc/traefik/dynamic.

Exemple : Exposer Cockpit (interface d'administration)

Créer /etc/traefik/dynamic/cockpit.yml :

http:
  routers:
    cockpit:
      rule: "Host(`cockpit.mon-domaine.fr`)"
      entryPoints: ["websecure"]
      service: cockpit-svc
      middlewares:
        - SecureHeaders
        - Compression
      tls:
        certResolver: le

  services:
    cockpit-svc:
      loadBalancer:
        servers:
          - url: "https://IP_DE_LA_MACHINE:9090"
        passHostHeader: true
        serversTransport: cockpit-transport

  serversTransports:
    cockpit-transport:
      insecureSkipVerify: true
  • rule: Host("cockpit.mon-domaine.fr") : route les requĂȘtes vers ce domaine.
  • service: cockpit-svc : dĂ©finit le backend.
  • loadBalancer.servers : liste des serveurs cibles (ici un seul).
  • insecureSkipVerify: true : ignore la vĂ©rification du certificat du backend (utile pour Cockpit en auto‑signĂ©).

Exemple : Exposer une application web interne

Créer /etc/traefik/dynamic/mon-app.yml :

http:
  routers:
    mon-app:
      rule: "Host(`app.mon-domaine.fr`)"
      entryPoints: ["websecure"]
      service: mon-app-svc
      middlewares:
        - SecureHeaders
        - Compression
      tls:
        certResolver: le

  services:
    mon-app-svc:
      loadBalancer:
        servers:
          - url: "http://192.168.1.100:8080"

Le service est exposé sur https://app.mon-domaine.fr.

💡

Rechargement dynamique

Traefik surveille le répertoire /etc/traefik/dynamic grùce à watch: true. DÚs qu'un fichier est créé, modifié ou supprimé, la configuration est rechargée automatiquement. Il n'est pas nécessaire de redémarrer Traefik.

🔍 Commandes utiles

CommandeDescription
sudo systemctl status traefikVérifier l'état du service.
sudo journalctl -u traefik -fConsulter les logs en temps réel.
sudo systemctl restart traefikRedémarrer Traefik (aprÚs modification de traefik.yml).
sudo systemctl reload traefikRecharger la configuration (rarement nécessaire).
traefik versionAfficher la version installée.

📝 Exercices d'application

Exercice 1 – Installation

Quel utilisateur systÚme est créé pour exécuter Traefik ?

L'utilisateur traefik est créé avec la commande useradd --system --home /etc/traefik --shell /bin/false traefik.

Exercice 2 – Fichiers dynamiques

Dans quel répertoire doit-on placer les fichiers YAML pour exposer un nouveau service ?

Les fichiers dynamiques doivent ĂȘtre placĂ©s dans /etc/traefik/dynamic/.

Exercice 3 – Middleware

Quel middleware est utilisĂ© pour ajouter des en‑tĂȘtes de sĂ©curitĂ© comme HSTS et CSP ?

Le middleware SecureHeaders (défini dans headers.yml).

🎯 Quiz d'auto‑évaluation

1. Traefik peut ĂȘtre installĂ© en bare metal, sans Docker.

2. Le fichier de configuration statique de Traefik s'appelle traefik.yml.

3. Les fichiers dynamiques sont surveillés automatiquement grùce à watch: true.

4. Pour exposer un nouveau service, il faut redémarrer Traefik.

5. Le middleware SecureHeaders ajoute des en‑tĂȘtes de sĂ©curitĂ© HTTP.

📚 Ressources


← Retour au portail
BTS SIO – LycĂ©e NDLP Avranches – Module L16 v2.0