Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

traefik

Traefik est un proxy qui s'intègre très bien à des stacks docker car il peut se configurer au travers des Docker labels.

En effet, il est possible de déclarer un vhost au travers des Docker labels afin d'obtenir sa création et destruction selon si le conteneur associé est démarré ou non.

Son autre usage le plus populaire est de l'utiliser pour générer des certificats Let's Encrypt de manière automatisée (et donc, toujours sur création du conteneur associé au vhost).

Routers

Les routers nous permettent de décrire le traitement des requêtes, et donc, de définir les vhosts.

Rien de très complexe, un routers nextcloud se déclarera ainsi:

- traefik.http.routers.nextcloud.rule=Host(`nextcloud.victim.org`)

Middlewares

Les middlewares permettent de manipuler les requêtes et les réponses traitées.

Filtrage IP

Nous pouvons déclarer le middlewares interne suivant:

labels:
  - "traefik.http.middlewares.interne.ipwhitelist.sourcerange=192.168.0.0/16"

Cela aura pour effet de filtrer les requêtes pour n'accepter que celles venant du CIDR 192.168.0.0/16.

Pour l'utiliser, il faut attacher ce middleware à notre router dédié à notre conteneur docker (qui s'appelle nextcloud dans cet exemple):

labels:
  - "traefik.http.routers.nextcloud.middlewares=interne"

Attention, ce filtrage cassera de fait la création de certificats Let's Encrypt.
Il conviendra donc de garder /.well-known/ accessible publiquement, par exemple en créant 2 router nextcloud et nextcloud-le:

labels:
  - traefik.http.routers.nextcloud.rule=Host(`nextcloud.victim.org`)
  - traefik.http.routers.nextcloud.tls=true
  - traefik.http.routers.nextcloud.tls.certresolver=lets-encrypt
  - traefik.http.routers.nextcloud.middlewares=galilee-interne
  - traefik.http.routers.nextcloud-le.rule=(Host(`nextcloud.victim.org`) && PathPrefix(`/.well-known/`))
  - traefik.http.routers.nextcloud-le.tls=true
  - traefik.http.routers.nextcloud-le.tls.certresolver=lets-encrypt

Ainsi, toute requête vers nextcloud.victim.org/.well-known/ sera traitée par le router interne-le, sans restriction IP, alors que le reste y sera soumis.

Best practices

Isoler le conteneur

Le mieux est de pouvoir créér un ou plusieurs Docker network dont fera parti Traefik.

Pour chaque conteneur qui aura effectivement besoin d'être proxifié par Traefik, il conviendra de l'associer à ce(s) network(s).

Le but étant, sur une stack docker compose, de n'avoir que ce conteneur qui fasse parti du même Docker network que Traefik, les autres n'étant donc pas directement accessibles par Traefik.

Sources