Installation et configuration
Reverse Proxy Traefik
Installation et configuration sur une base Debian (Debian 13 / Ubuntu 24.04 etc...)
Auteur : Antonin POMIES
Dernière mise à jour : Janvier 2025
Contexte
Dans mon Homelab, j'utilisais habituellement Apache comme reverse proxy, une solution que je maîtrise bien. Cependant, la gestion des certificats s'avérait laborieuse, notamment pour le renouvellement des certificats Let's Encrypt, même avec CertBot.
C'est pourquoi j'ai décidé d'explorer Traefik, une solution moderne qui offre :
- Des configurations plus organisées et modulaires
- Une gestion automatique des certificats SSL/TLS
- Une découverte automatique des services (Docker)
- Un tableau de bord intégré pour le monitoring
Prérequis
Avant de commencer l'installation, assurez-vous d'avoir :
- Une machine sous Debian 12 (ou equivalent)
- Des connaissances de base sur les reverse proxy
- Une connexion à Internet
- Des services disponibles pour les tests (Teleport, Home Assistant, site web, etc.)
- Un nom de domaine avec accès à la gestion DNS (enregistrements A / CNAME)
- Un accès administrateur (sudo) sur le serveur
Configuration DNS et NAT/PAT
Configuration DNS
Pour que Traefik puisse router correctement le trafic, vous devez configurer vos enregistrements DNS :
-
Enregistrement A : Pointez votre domaine principal vers votre IP publique
- Exemple :
exemple.com→203.0.113.42 - Ou utilisez un service DynDNS si votre IP est dynamique
- Pour les tests vous pouvez également faire du DNS menteur avec le fichier /etc/hosts ou un DNS local.
- Exemple :
-
Enregistrements CNAME : Créez des sous-domaines pour vos services
guacamole.exemple.com→exemple.comhomeassistant.exemple.com→exemple.com
ℹ️ Vous pouvez également faire un enregistrement "Wildcard" de type "*.example.com"
Configuration du routeur (NAT/PAT)
Sur votre routeur/firewall, configurez les règles de redirection de ports :
| Protocole | Port externe | Port interne | IP destination | Description |
|---|---|---|---|---|
| TCP | 80 | 80 | 192.168.X.X | HTTP (redirigé vers HTTPS) |
| TCP | 443 | 443 | 192.168.X.X | HTTPS |
Note importante : Le port 80 doit être accessible pour permettre la validation des certificats Let's Encrypt via le challenge HTTP-01, mais tout le trafic sera automatiquement redirigé vers le port 443 (HTTPS).
Installation de Traefik (méthode binaire)
Étape 1 : Mise à jour du système
Commencez par mettre à jour votre système Debian :
sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y
Étape 2 : Téléchargement de Traefik
Téléchargez la dernière version stable de Traefik depuis le dépôt GitHub officiel. La version actuelle recommandée est la v3.6.7 :
cd /tmp
wget https://github.com/traefik/traefik/releases/download/v3.6.7/traefik_v3.6.7_linux_amd64.tar.gz
Note : Vérifiez toujours la page des releases officielle pour obtenir la dernière version stable.
Étape 3 : Extraction et installation
Décompressez l'archive téléchargée :
tar -xzf traefik_v3.6.7_linux_amd64.tar.gz
Déplacez le binaire dans le répertoire système :
sudo mv traefik /usr/local/bin/
Rendez le binaire exécutable :
sudo chmod 755 /usr/local/bin/traefik
Vérifiez l'installation :
traefik version
Étape 4 : Création de la structure des répertoires
Créez les répertoires nécessaires pour la configuration de Traefik :
sudo mkdir -p /etc/traefik/dynamic
sudo mkdir -p /var/log/traefik
Étape 5 : Configuration principale de Traefik
Créez le fichier de configuration principal :
sudo nano /etc/traefik/traefik.toml
Ajoutez la configuration suivante :
# Configuration globale
[global]
checkNewVersion = true
sendAnonymousUsage = false
# Logs
[log]
level = "INFO"
filePath = "/var/log/traefik/traefik.log"
# Logs d'accès
[accessLog]
filePath = "/var/log/traefik/access.log"
# Points d'entrée (ports d'écoute)
[entryPoints]
[entryPoints.web]
address = ":80"
# Redirection automatique HTTP vers HTTPS
[entryPoints.web.http]
[entryPoints.web.http.redirections]
[entryPoints.web.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
[entryPoints.websecure]
address = ":443"
[entryPoints.api]
address = ":8080"
# API et Dashboard
[api]
dashboard = true
# insecure = true # À commenter en production (voir section sécurisation)
# Providers - Configuration dynamique via fichiers
[providers]
[providers.file]
directory = "/etc/traefik/dynamic"
watch = true
# Gestion automatique des certificats Let's Encrypt
[certificatesResolvers.letsencrypt]
[certificatesResolvers.letsencrypt.acme]
email = "votre-email@exemple.com" # ⚠️ Remplacez par votre email
storage = "/etc/traefik/acme.json"
[certificatesResolvers.letsencrypt.acme.httpChallenge]
entryPoint = "web"
Points importants :
- Remplacez
votre-email@exemple.compar votre adresse email réelle - L'option
insecure = truedans la section API permet un accès sans authentification au dashboard. Commentez-la en production.
Étape 6 : Création du fichier de stockage des certificats
Créez le fichier qui stockera les certificats Let's Encrypt :
sudo touch /etc/traefik/acme.json
sudo chmod 600 /etc/traefik/acme.json
Important : Les permissions 600 sont obligatoires pour des raisons de sécurité. Ci ce n'est pas fait alors il y aura des erreurs de certificats.
Étape 7 : Configuration dynamique des routes
Créez le fichier de configuration dynamique pour vos services :
sudo nano /etc/traefik/dynamic/config.toml
Ajoutez une configuration exemple (à adapter selon vos services) :
# Configuration HTTP
[http]
# Middlewares
[http.middlewares]
# Middleware de redirection HTTP vers HTTPS
[http.middlewares.redirect-to-https.redirectScheme]
scheme = "https"
permanent = true
# Routeurs
[http.routers]
# Router pour Guacamole (HTTPS)
[http.routers.to-guacamole]
rule = "Host(`guacamole.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "guacamole-service"
[http.routers.to-guacamole.tls]
certResolver = "letsencrypt"
# Router pour Home Assistant (HTTPS)
[http.routers.to-homeassistant]
rule = "Host(`homeassistant.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "homeassistant-service"
[http.routers.to-homeassistant.tls]
certResolver = "letsencrypt"
# Services (backends)
[http.services]
# Service Guacamole
[http.services.guacamole-service.loadBalancer]
[[http.services.guacamole-service.loadBalancer.servers]]
url = "http://192.168.X.X:8080" # ⚠️ Remplacez par l'IP de votre service
# Service Home Assistant
[http.services.homeassistant-service.loadBalancer]
[[http.services.homeassistant-service.loadBalancer.servers]]
url = "http://192.168.X.X:8123" # ⚠️ Remplacez par l'IP de votre service
À personnaliser :
- Remplacez
votre-domaine.compar votre domaine réel - Adaptez les adresses IP et ports selon vos services
- Ajoutez autant de routeurs et services que nécessaire
Étape 8 : Création du service systemd
Pour que Traefik démarre automatiquement au boot, créez un service systemd :
sudo nano /etc/systemd/system/traefik.service
Ajoutez le contenu suivant :
[Unit]
Description=Traefik Reverse Proxy
Documentation=https://doc.traefik.io/traefik/
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.toml
Restart=on-failure
RestartSec=5s
# Sécurité
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Étape 9 : Activation et démarrage de Traefik
Rechargez la configuration systemd :
sudo systemctl daemon-reload
Démarrez le service Traefik :
sudo systemctl start traefik
Activez le démarrage automatique au boot :
sudo systemctl enable traefik
Vérifiez le statut du service :
sudo systemctl status traefik
Si tout fonctionne correctement, vous devriez voir le service actif et sans erreurs.
Étape 10 : Vérification
Accédez au dashboard Traefik via votre navigateur :
- URL locale :
http://127.0.0.1:8080(depuis le serveur) - URL locale :
http://adresse-ip-serveur:8080(depuis votre réseau local)
Vous devriez voir :
- L'interface du dashboard Traefik
- Vos routeurs configurés
- Les services backend
- L'état des certificats
Testez l'accès à vos services :
https://guacamole.votre-domaine.comhttps://homeassistant.votre-domaine.com
Les certificats Let's Encrypt devraient être générés automatiquement lors de la première connexion.
Sécurisation de Traefik
Par défaut, le dashboard Traefik est accessible sans authentification. Il est fortement recommandé de le sécuriser, surtout si vous l'exposez sur Internet.
Prérequis : Installation d'Apache Utils
Installez le paquet contenant l'utilitaire htpasswd :
sudo apt install apache2-utils -y
Génération du mot de passe hashé
Générez un hash de mot de passe pour l'authentification :
htpasswd -nB utilisateur
Remplacez utilisateur par le nom d'utilisateur souhaité. Le système vous demandera de saisir le mot de passe deux fois.
Exemple de sortie :
utilisateur:$2y$05$sKx9gFdKLgDeOYc3qKMCOe6c7YqJvMKlVKXQzhPkrm3YWsYJgW1Gy
Important : Copiez cette ligne complète, vous en aurez besoin pour la configuration.
Configuration de l'authentification
Méthode 1 : Authentification basique (recommandée)
Modifiez le fichier de configuration dynamique :
sudo nano /etc/traefik/dynamic/dashboard.toml
Ajoutez la configuration suivante :
# Middleware d'authentification pour le dashboard
[http.middlewares]
[http.middlewares.dashboard-auth.basicAuth]
users = [
"utilisateur:$2y$05$sKx9gFdKLgDeOYc3qKMCOe6c7YqJvMKlVKXQzhPkrm3YWsYJgW1Gy"
]
# Router pour le dashboard sécurisé
[http.routers]
[http.routers.dashboard]
rule = "Host(`traefik.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "api@internal"
middlewares = ["dashboard-auth"]
[http.routers.dashboard.tls]
certResolver = "letsencrypt"
À personnaliser :
- Remplacez la ligne
userspar le hash généré précédemment - Remplacez
traefik.votre-domaine.compar votre sous-domaine - Créez l'enregistrement DNS correspondant
Méthode 2 : Restriction par IP (optionnelle)
Pour restreindre l'accès au dashboard à certaines adresses IP, ajoutez un middleware supplémentaire :
# Middleware de restriction IP
[http.middlewares]
[http.middlewares.ip-whitelist.ipWhiteList]
sourceRange = [
"192.168.1.0/24", # Réseau local
"203.0.113.42/32" # IP publique spécifique
]
# Router pour le dashboard avec IP whitelist
[http.routers]
[http.routers.dashboard]
rule = "Host(`traefik.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "api@internal"
middlewares = ["dashboard-auth", "ip-whitelist"] # Combinaison des deux
[http.routers.dashboard.tls]
certResolver = "letsencrypt"
Désactivation du mode insecure
Une fois l'authentification configurée, modifiez le fichier principal :
sudo nano /etc/traefik/traefik.toml
Commentez ou supprimez la ligne insecure = true dans la section [api] :
[api]
dashboard = true
# insecure = true # ⚠️ À commenter ou supprimer
Redémarrage de Traefik
Appliquez les modifications :
sudo systemctl restart traefik
Vérifiez que tout fonctionne :
sudo systemctl status traefik
Vérification de la sécurisation
Accédez au dashboard via l'URL configurée :
https://traefik.votre-domaine.com
Vous devriez maintenant être invité à saisir vos identifiants. L'accès via http://adresse-ip:8080 ne devrait plus fonctionner.
Maintenance et surveillance
Consultation des logs
Traefik génère deux types de logs :
Logs applicatifs (erreurs, démarrages, etc.) :
sudo tail -f /var/log/traefik/traefik.log
Logs d'accès (requêtes HTTP) :
sudo tail -f /var/log/traefik/access.log
Vérification de l'état du service
sudo systemctl status traefik
Redémarrage après modification de la configuration
Configuration statique (traefik.toml) :
sudo systemctl restart traefik
Configuration dynamique (dynamic/*.toml) :
- Les modifications sont appliquées automatiquement grâce à l'option
watch = true - Pas besoin de redémarrage
Mise à jour de Traefik
Pour mettre à jour Traefik vers une nouvelle version :
- Téléchargez la nouvelle version :
cd /tmp
wget https://github.com/traefik/traefik/releases/download/vX.Y.Z/traefik_vX.Y.Z_linux_amd64.tar.gz
tar -xzf traefik_vX.Y.Z_linux_amd64.tar.gz
- Arrêtez le service :
sudo systemctl stop traefik
- Remplacez le binaire :
sudo mv traefik /usr/local/bin/
sudo chmod 755 /usr/local/bin/traefik
- Redémarrez le service :
sudo systemctl start traefik
- Vérifiez la version :
traefik version
Sauvegarde de la configuration
Il est recommandé de sauvegarder régulièrement :
/etc/traefik/(configurations)/etc/traefik/acme.json(certificats)
sudo tar -czf traefik-backup-$(date +%Y%m%d).tar.gz /etc/traefik/
Résolution des problèmes courants
Le dashboard n'est pas accessible
Vérifications :
-
Le service Traefik est-il démarré ?
sudo systemctl status traefik -
Le port 8080 est-il en écoute ?
sudo ss -tlnp | grep 8080 -
Le pare-feu autorise-t-il le port 8080 ?
sudo ufw status
Les certificats Let's Encrypt ne se génèrent pas
Causes possibles :
-
Le port 80 n'est pas accessible depuis Internet
-
Les enregistrements DNS ne pointent pas vers la bonne IP
-
Le fichier
acme.jsonn'a pas les bonnes permissionssudo chmod 600 /etc/traefik/acme.json -
L'email dans
traefik.tomln'est pas valide
Vérification :
sudo tail -f /var/log/traefik/traefik.log
Le service backend n'est pas accessible
Vérifications :
-
Le service backend est-il démarré ?
-
L'adresse IP et le port sont-ils corrects dans
config.toml? -
Traefik peut-il atteindre le backend ?
curl http://192.168.X.X:port -
Vérifiez les logs pour identifier l'erreur :
sudo journalctl -u traefik -f
Exemple de configuration avancée
Ajout d'un nouveau service
Pour ajouter un nouveau service (par exemple, un serveur web) :
- Créez ou modifiez
/etc/traefik/dynamic/config.toml:
# Router pour le nouveau service
[http.routers.to-webapp]
rule = "Host(`webapp.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "webapp-service"
[http.routers.to-webapp.tls]
certResolver = "letsencrypt"
# Service backend
[http.services.webapp-service.loadBalancer]
[[http.services.webapp-service.loadBalancer.servers]]
url = "http://192.168.X.X:80"
-
Créez l'enregistrement DNS :
webapp.votre-domaine.com -
Traefik détectera automatiquement la nouvelle configuration
Middlewares utiles
Compression Gzip
[http.middlewares.gzip-compress.compress]
Headers de sécurité
[http.middlewares.security-headers.headers]
[http.middlewares.security-headers.headers.customResponseHeaders]
X-Frame-Options = "SAMEORIGIN"
X-Content-Type-Options = "nosniff"
X-XSS-Protection = "1; mode=block"
Referrer-Policy = "strict-origin-when-cross-origin"
Rate limiting
[http.middlewares.rate-limit.rateLimit]
average = 100
burst = 200
Appliquez ensuite ces middlewares à vos routeurs :
[http.routers.to-webapp]
rule = "Host(`webapp.votre-domaine.com`)"
entryPoints = ["websecure"]
service = "webapp-service"
middlewares = ["gzip-compress", "security-headers", "rate-limit"]
[http.routers.to-webapp.tls]
certResolver = "letsencrypt"
Ressources complémentaires
- Documentation officielle : https://doc.traefik.io/traefik/
- GitHub officiel : https://github.com/traefik/traefik
- Forum communautaire : https://community.traefik.io/
- Exemples de configuration : https://github.com/traefik/traefik/tree/master/examples
Conclusion
Traefik est désormais installé et configuré sur votre serveur Debian. Les avantages principaux de cette solution sont :
✅ Automatisation : Génération et renouvellement automatiques des certificats SSL
✅ Simplicité : Configuration en fichiers TOML facilement lisibles
✅ Modularité : Ajout de services sans redémarrage
✅ Monitoring : Dashboard intégré pour surveiller le trafic
✅ Performance : Proxy moderne et optimisé
Cette configuration de base peut être étendue avec de nombreuses fonctionnalités avancées selon vos besoins (load balancing, service mesh, intégration Docker/Kubernetes, etc.).
Document créé par Antonin POMIES - Mis à jour en janvier 2025