Traefik

Traefik es un proxy inverso compatible con Docker que incluye su propio panel de supervisión. Es además un balanceador de carga adaptado a la computación en la nube mediante microservicios. Traefik se integra con los principales componentes de infraestructura configurándose a sí mismo automáticamente y de forma dinámica. Traefik es simple de operar pero capaz de manejar sistemas complejos y grandes en entornos diversos y diferentes capas de la pila de red como HTTP, TCP o UDP. Proporciona funcionalidades de intermediario que aumenta sus capacidades para realizar balanceo de carga o servir como gateway API.
Como proxy inverso intercepta las peticiones entrantes y las redirige a los servicios adecuados. A diferencia de proxys inversos configurados de forma estática, Traefik usa descubrimiento de servicios para configurarse a sí mismo según los servicios en ejecución. Puede hacer de proxy en diferentes capas de la pila de red proporcionando funcionalidades como balanceo de carga, limitación de peticiones, circuit breaker, duplicación o mirroring, autenticación y más. También soporta terminación de SSL y puede usar un proveedor ACME como Let’s Encrypt para la generación automática de certificados.
Enlaces
https://doc.traefik.io/traefik/
Requisitos
- Docker instalado siguiendo los pasos de instalar Docker
- Portainer configurado siguiendo los pasos de instalar portainer.
- Redirección de los puertos TCP 80 y 443 (http, https) hacia el servidor docker
- Un registro DNS wildcard o comodín (catch-all DNS record) es un registro en una zona DNS que puede coincidir con consultas de nombres de dominio inexistentes. Se crea utilizando el símbolo * en el extremo izquierdo de un nombre de dominio, por ejemplo: *. dominio.com.
Instalación
Volúmenes
Creamos previamente los volúmenes docker necesarios.
docker volume create traefik_config
docker volume create traefik_certs
Network
Creamos la red en la que Traefik actuará de forma automática para contenedores levantados en la misma.
docker network create proxy
Configuración
Traefik dispone de los siguientes archivos de configuración:
- traefik.yml: fichero de configuración estática. Este fichero define los puertos en que Traefik estará escuchando (Entrypoints), la parte de obtención de certificados a través de Let’s Ecrypt, etc.
- traefik_dynamic.yml: fichero de configuración dinámica. Contiene configuración de parámetros que pueden cambiar durante la ejecución, como middlewares, rutas para servicios externos que no están en Docker, etc.
- acme.json: Almacena los certificados que Traefik genera para cada uno de nuestro servicios.
traefik.yml
En la ruta /var/lib/docker/volumes/traefik_config/_data crea el fichero traefik.ymlcon el contenido:
# Traefik Dashboard
api:
dashboard: true
insecure: true
# Puertos de escucha de Traefik y redirección automatica
entryPoints:
web:
address: ':80'
http:
redirections:
entryPoint:
to: websecure
scheme: https
priority: 100
websecure:
address: ':443'
# Certificates from an ACME server
certificatesResolvers:
letsencrypt:
acme:
email: 'email@email.com'
storage: /etc/ssl/certs/acme.json
tlsChallenge: {}
providers:
docker:
watch: true
network: proxy
exposedByDefault: false # No expone los contenedores por defecto
file:
filename: /etc/traefik/traefik_dynamic.yml
watch: true
log:
level: INFO
accessLog: {}
traefik_dynamic.yml
En la ruta /var/lib/docker/volumes/traefik_config/_data crea el fichero traefik_dynamic.ymlcon el contenido:
http:
# Traefik Middlewares
middlewares:
# Usuarios con validacion basica
simpleAuth:
basicAuth:
users:
- 'admin:$apr1$Bc8RJ6KW$.XVxhYuIvbz6Llz9tZ.451'
# Whitelist para los rangos de IPs privadas
privateIPs:
IPAllowList:
sourceRange:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
# Lineas para certificado custom. Eliminar si no usa
tls:
certificates:
- CertFile: /certificate.crt
KeyFile: /certificate.key
Para poder haver una validación de usuario básica y validarnos en el panel web de Traefik, usaremos el "middleware simpleAuth"
Generamos el hash y lo incluimos en el fichero traefik_dynamic.yml
openssl passwd -apr1 SuperSecreta123
$apr1$Bc8RJ6KW$.XVxhYuIvbz6Llz9tZ.451
Si queremos añadir servicios externos al entorno docker añadimos "routers" y "services"
serversTransports:
insecureTransport:
insecureSkipVerify: 'true'
# routers para servicios externos
routers:
other_service:
rule: Host(`other_service.domain.com`)
middlewares:
- privateIPs
service: other_service
tls:
certResolver: letsencrypt
# servicios externos
services:
other_service:
loadBalancer:
serversTransport: insecureTransport
servers:
- url: 'https://x.x.x.x'
Portainer – Agregar nuevo «stack»
Add a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero docker-compose y el contenido del fichero de variables

Fichero docker-compose
services:
traefik:
image: traefik
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_config:/etc/traefik
- traefik_certs:/etc/ssl/certs
networks:
- proxy
volumes:
traefik_config:
external: true
traefik_certs:
external: true
networks:
proxy:
external: true
Para publicar el dashboard detrás del propio Traefik, deberás añadir al fichero docker-compose.yaml las siguientes etiquetas al servicio
labels:
- traefik.enable=true
- traefik.http.routers.api.rule=Host(`traefik.dominio.com`)
- traefik.http.routers.api.service=api@internal
- traefik.http.routers.api.tls=true
- traefik.http.routers.api.tls.certresolver=letsencrypt
- traefik.http.routers.api.middlewares=simpleAuth@file,privateIPs@file
NAT Hairpinning
-
IP origen: 192.168.5.1
-
IP destino: 192.168.5.5

