Skip to main content

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.

Routing seguro para tus aplicaciones en containers usando Traefik v2 con  Let's Encrypt - Crstian's blog

Enlaces

https://doc.traefik.io/traefik/

https://geekland.eu/instalar-y-configurar-traefik-v2-para-usarlo-como-proxy-inverso/

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.

Traefik 2.*.* en Docker con LetsEncrypt Quick-Deploy - Saiyans Blog

Configuración

La versión 2 de Traefik dispone de los siguientes archivos de configuración:

  • traefik.yml: Contiene la configuración estática, o dicho de otra forma, de las partes que no cambiarán en tiempo de ejecución. Por lo tanto en este fichero definiremos 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: Contiene la configuración dinámica, o dicho de otra forma, la configuración de los parámetros para que Traefik pueda detectar los cambios que se producen en nuestra infraestructura. Gracias a este fichero Traefik actualizará automáticamente su configuración cuando ocurran ciertos eventos. Por ejemplo actualizará de forma automática la configuración cuando arranquemos un nuevo contenedor para que se enrute el tráfico. En el caso que paremos un contenedor también se modificará la configuración para dejar de enrutarse el tráfico en el contenedor que paremos, etc. Para detectar los cambios que se producen en el servicio Traefik usará los providers. Los providers serán los encargados de monitorizar los cambios y una vez detectados aplicarán configuraciones preestablecidas para dar respuesta a los cambios. Traefik dispone de multitud de providers disponibles para su uso.
  • acme.json: Almacena los certificados que Traefik genera para cada uno de nuestro servicios.

Por lo tanto lo primero que tenemos que realizar es crear los 3 ficheros de configuración y los permisos adecuados:

Volumenes

docker volume create traefik_config
docker volume create traefik_certs

Fichero de configuración

# Traefik Dashboard
api:
  dashboard: 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: acme.json
      tlsChallenge: {}

providers:
  docker:
    watch: true
    network: traefik_public
  file:
    filename: traefik_dynamic.yml

Configuración dinámica - fichero "traefik_dynamic.yml"

http:
  serversTransports:
    insecureTransport:
      insecureSkipVerify: 'true'
  # Traefik Middlewares
  middlewares:
    # Usuarios con validacion basica
    simpleAuth:
      basicAuth:
        users:
          - 'admin:$adv1$QRkRTxki$2/wpm9wZoobDe.M/ldit5/'
    # Whitelist para los rangos de IPs privadas
    privateIPs:
      ipWhiteList:
        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

Si queremos añadir servicios externos al entorno docker añadimos "routers" y "services"

# routers para servicios externos
  routers:
    other_service:
      rule: Host(`other_service.domain.com`)
      middlewares:
        - authelia
        - privateIPs
      service: other_service
      tls:
        certResolver: letsencrypt
 # servicios externos       
  services:
    other_service:
      loadBalancer:
        serversTransport: insecureTransport
        servers:
          - url: 'https://x.x.x.x'

Validación básica de Traefik

Para poder haver una validación de usuario básica y validarnos por ejemplo en el panel web de Traefik, usaremos el "middleware simpleAuth". Para generar el hash deberemos instalar el paquete apache2-utils. Una vez instalado el paquete crearemos el hash.

apt install apache2-utils
htpasswd -nb admin secure_password
admin:$adv1$QRkRTxki$2/wpm9wZoobDe.M/ldit5/

Ahora podemos añadir la salida del comando "htpasswd" a la sección "middleware" del fichero de configuración dinámico "traefik_dynamic"

RED traefik_public

En el fichero de configuración traefik.ymldefinimos que Traefik actuaría de forma automática en la totalidad de contenedores que están levantados en la red traefik_public. Por lo tanto a continuación crearemos la red traefik_public

docker network create traefik_public

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 de variables

TZ=Europe/Madrid

Fichero docker-compose

services: 
  traefik:  
    image: traefik
    container_name: traefik
    restart: always
    env_file: stack.env
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"  # Dashboard
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_config:/etc/traefik  # Carpeta donde Traefik espera su configuración
      - traefik_certs:/etc/ssl/certs 
    networks:
      - proxy

volumes:
  traefik_config:
    external: true
  traefik_certs:
    external: true

networks:
  proxy:
    external: true


    labels:
    # traefik dashboard
      - traefik.enable=true
      - traefik.http.routers.api.tls=true
      - traefik.http.routers.api.tls.certresolver=letsencrypt
      - traefik.http.routers.api.rule=Host(`traefik.dominio.com`)
      - traefik.http.routers.api.middlewares=simpleAuth@file,privateIPs@file
      - traefik.http.routers.api.service=api@internal

NAT Hairpinning

También conocido como enrutamiento en horquilla, "NAT loopback" o "NAT reflection", es una técnica utilizada en redes de computadoras que permite que un dispositivo en una red se comunique con otro dispositivo en la misma red utilizando su dirección IP externa. Esto es útil cuando un dispositivo en la red necesita acceder a un servicio que está alojado en otro dispositivo en la misma red, pero solo se puede acceder al servicio a través de la dirección IP externa. Hairpinning se puede utilizar en una variedad de escenarios de red, como cuando un sitio web está alojado en un servidor local o cuando se utiliza una conexión VPN para acceder a una red remota.
La siguiente imagen muestra un ejemplo en el que un servicio publicado en la IP pública 203.40.40.5. Los paquetes que atraviesan el Firewall desde la red local (INSIDE) con destino IP publica 203.40.40.5 se transforman gracias al "NAT Hairpinning":
La IP destino 203.40.40.5 es reemplazada con la IP privada 192.168.5.5. También conocida como Destination NAT (DNAT).
La IP origen 192.168.1.50 es reemplazada con la IP 192.168.5.1 – IP del firewall. También conocida como Source NAT (SNAT).
Cuando los paquetes llegan al servidor destino tienen las IPs origen y destino siguientes (ambas privadas):
  • IP origen: 192.168.5.1
  • IP destino: 192.168.5.5

image.png