Post

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.

Plusieurs instances Traefik derrière une seule IP

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 (ou traefik.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/*.yml ou dans des labels Docker.

Vous rencontrerez souvent les fichiers suivants :

  • traefik.yml pour la configuration statique
  • dynamic/*.yml pour les routeurs, services et middlewares
  • acme.json pour 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.
Cet article est sous licence CC BY 4.0 par l'auteur.