Plusieurs instances Traefik derrière une seule IP
Faire transiter le TLS par SNI entre deux instances Traefik derrière une même adresse IP publique.
Pourquoi j’en avais besoin
J’exploite plusieurs serveurs et je préfère isoler mes services stables de mes environnements de test. Le problème est simple : le routeur ne peut transférer les ports 80 et 443 que vers un seul hôte interne. Comment faire tourner deux instances Traefik derrière une seule IP publique ?
Ma réponse consiste à faire de Traefik primaire le gardien de l’entrée et à lui faire transmettre le trafic TLS vers un Traefik secondaire selon le SNI.
Le problème en une phrase
Plusieurs instances Traefik veulent utiliser les ports 80/443, alors qu’une IP publique ne peut les transférer que vers une seule machine.
L’idée
Utilisez un routeur TCP sur le Traefik primaire pour laisser passer les requêtes TLS du domaine secondaire. Le primaire garde le contrôle des ports publics et ne transmet que les domaines concernés à la seconde instance.
Imaginez une porte d’entrée pour plusieurs maisons.
Mon exemple concret
- Traefik primaire : installé sur mon serveur principal et sert
*.webguardx.com - Traefik secondaire : installé sur un second serveur (NAS) et sert
*.test.webguardx.com - IP publique : une seule, avec une seule règle de redirection de ports
Étapes
Organisation de la configuration Traefik
La configuration Traefik se répartit en deux groupes :
- Statique : démarrage de Traefik (points d’entrée, fournisseurs, journaux, ACME). Elle se trouve dans
traefik.yml(outraefik.toml/ les options CLI) et ne change qu’après un redémarrage. - Dynamique : routage du trafic (routeurs, services, middlewares). Elle peut être rechargée à chaud et se trouve généralement dans
dynamic/*.ymlou dans des labels Docker.
Vous rencontrerez souvent les fichiers suivants :
traefik.ymlpour la configuration statiquedynamic/*.ymlpour les routeurs, services et middlewaresacme.jsonpour les certificats stockés
Dans ce montage, le Traefik primaire démarre avec sa configuration statique puis surveille tcp-router.yml dans le dossier dynamique. Le Traefik secondaire est indépendant et gère les certificats TLS du domaine de test.
1. Redirection des ports du routeur
Redirigez les ports 80 et 443 vers l’hôte qui exécute le Traefik primaire.
2. Ajouter un routeur TCP sur le primaire
Créez un fichier comme tcp-router.yml dans le dossier des règles Traefik du primaire :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tcp:
routers:
synology-traefik-rtr:
entryPoints:
- "https"
rule: "HostSNIRegexp(`example2.com`) || HostSNIRegexp(`{subdomain:[a-z]+}.example2.com`)"
service: synology-traefik-svc
tls:
passthrough: true
services:
synology-traefik-svc:
loadBalancer:
servers:
- address: "192.168.1.254:443"
Les éléments importants sont les suivants :
rule: cible le domaine secondaire et ses sous-domaines.tls.passthrough: true: ne terminez pas TLS sur le primaire. Le Traefik secondaire doit gérer ses certificats.servers.address: pointe vers le Traefik secondaire.
3. Le Traefik secondaire gère TLS
Comme TLS traverse le premier proxy, le Traefik secondaire doit :
- écouter sur
:443; - disposer de ses propres certificats (ACME, défi DNS ou certificats manuels) ;
- servir les services de ce domaine.