Sommaire
🐧 Module L16 – Le reverse-proxy Traefik
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 ?
- Reverse-proxy : achemine les requêtes vers les services appropriés.
- Configuration déclarative : en YAML, avec fichiers statiques et dynamiques.
- SSL/TLS intégré : génère et renouvelle automatiquement les certificats avec Let's Encrypt.
- Interface web : tableau de bord pour surveiller les routes et les services.
- Middlewares : authentification, compression, en-têtes de sécurité, etc.
- Support HTTP/3 (QUIC) : pour des performances accrues.
📐 Architecture Traefik
| Composant | Rôle |
|---|---|
| EntryPoints | Points d'entrée (ports) comme HTTP (80) et HTTPS (443). |
| Providers | Sources de configuration (fichiers, Docker, etc.). |
| Routers | Règles de routage (domaine, chemin, headers). |
| Services | Backends vers lesquels router. |
| Middlewares | Fonctions intermédiaires (authentification, headers, compression). |
| CertificatesResolvers | Gestion 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.
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 binairetraefikdans/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é viainsecure: 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: redirigetraefik.mon-domaine.frvers le dashboard.service: api@internal: service interne de Traefik.middlewares: chaîne de middlewares (authentification, headers, compression).dash-redirect: redirige/vers/dashboard/.users: utilisateuradminavec 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
| Commande | Description |
|---|---|
sudo systemctl status traefik | Vérifier l'état du service. |
sudo journalctl -u traefik -f | Consulter les logs en temps réel. |
sudo systemctl restart traefik | Redémarrer Traefik (après modification de traefik.yml). |
sudo systemctl reload traefik | Recharger la configuration (rarement nécessaire). |
traefik version | Afficher 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.