Certificados Wildcards de Letsecnrypt con Traefik y Duckdns

5 minutos de lectura

Hasta ahora utilizaba el contenedor de Letsencript para obtener los certificados de ciertos servicios que utilizo para mi servidor personal. Pero sinceramente el método que utilizaba era un poco “chapuzas”, utilizada un subdominio de Duckdns por cada servicio, el problema es que Duckdns solo ofrece 5 subdominios de manera gratuita, pero además, los certificados que obtenía a través del proxy inverso, no eran del todo correctos ya que al final se mostraba el subdominio raiz.

\
De todo ello te hable en este articulo. Pero fue a raíz de una serie de problemas que he tenido a la hora de volver a configurar el proxy inverso para la Raspberry Pi, lo que me decidio a probar Traefik.

A la hora de escribir este articulo hay disponibles dos versiones de Traefik, 1.7 y 2.0, yo he instalado la versión 1.7 que la versión 2 no tiene una imagen para Raspberry, además usare la imagen creada sobre alpine al se mas ligera.

¿Que es un certificado wildcard?

La respuesta es sencilla, es un certificado único que vale para todos tus subdominios. Por ejemplo nextcloud.mi_dominio.org, jellyfin.mi_dominio.org, etc.

Conceptos

  • Frontend: es por donde va a recibir la petición, por ejemplo un

subdominio.

  • Backend: es a qué aplicación a enviar la petición

  • Providers: Es la tecnología que estás usando y que con la que Traefik es capaz de trabajar para crear routers y poder llegar a los servicios de tu red interna (services). Por ejemplo Docker, Nextcloud,,,

  • Entrypoints: son los puertos que tienes abiertos al exterior.

  • Services: las aplicaciones de tu red interna que pretendes sacar al exterior. (home assistant, wordpress, nextcloud, traccar,…)

  • Routers: el mecanismo por el que se «conecta» los servicios con internet por el puerto del entrypoint.

  • Middleware: componentes de diversa funcionalidad que alteran el comportamiento de un router. (autenticación, redireccionamiento, ssl,…)

  • docker-compose.yml: fichero para desplegar los contenedores

  • traefik.toml: fichero de configuración de Traefik, tambien se puede hacer ficheros aparte

Configuración

Para desplegar el contenedor vamos a utilizar docker-compose, el fichero es el siguiente

docker-compose.yml


 version: '3'

 services:
  proxy:
    image: traefik:alpine
    restart: always
    networks:
      - traefik_net
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - $PWD/traefik.toml:/etc/traefik/traefik.toml
      - ${PWD}/acme:/etc/traefik/acme
    labels:
      - traefik.enable=true
      - traefik.port=8080
      - traefik.frontend.rule=Host:traefik.mi_diminio.duckdns.org
    environment:
     - DUCKDNS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxx

networks:
  traefik_net:
    external:
      name: traefik_net

Donde:

  • image: es la imagen que vamos a utilizar para construir el contenedor

  • networks: la red que vamos a utilizar

  • ports: puertos a exponer por el contenedor

  • traefik.enable=true:, el contenedor aparece en el tablero de traefik, si no queremos que aparezca, traefik.enable=true

  • traefik.port=8080: puerto del tablero de Traefik

  • traefik.frontend.rule=Host:traefik.mi_dominio_duckdns.org le dice a Traefik que examine el host solicitado y si coincide con el patrón traefik.mi_dominio_duckdns.org, enruta el tráfico al contenedor traefik.

  • DUCKDNS_TOKEN=xxxxxxx token de tu cuenta de Duckdns, en este articulo te enseñe como obtenerlo.

Para mayor seguridad, el contenedor va a utilizar la red traefik_net, de hecho, todos los contenedores que son accesibles desde internet utilizan esta red.

Los contenedores que vayan a ser supervisados por Traefik han de estar en la misma red

El resto de opciones creo que se entienden bastante bien

Crear red interna para los contenedores

Vamos a crear la red que compartirán los contenedores, como comente antes, todos los dockers que vayas a manejar con Traefik han de estar en la misma red

docker network create traefik_net

traefik.toml

Tan solo nos queda crear el fichero de configuración para Traefik


      debug = false
      logLevel = "DEBUG"


      defaultEntryPoints = ["http", "https"]

# Fuerza HTTPS

[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

# Interfaz WEB de Traefik: mostrará la página web con una descripción general de las configuraciones frontend y backend
[api]
  entrypoint="dashboard"


# Conexion con el sistema docker del host  (docker.sock)

[docker]
  endpoint = "unix:///var/run/docker.sock"
  domain = "mi_dominio.duckdns.org"
  watch = true
  network = "traefik_net"


# Let's encrypt configuracion

[acme]
  email = "mi_correo0xxxx.xxx"
  storage = "/etc/traefik/acme/acme.json"
  entryPoint = "https"
  onHostRule = true
  acmeLogging = true

# validación por DNS

[acme.dnsChallenge]
    provider = "duckdns"
    delayBeforeCheck = 0

[[acme.domains]]
    main = "*.mi_dominio.duckdns.org"

He dejado comentadas las entradas en el fichero de configuración, aun así:

defaultEntryPoints = [“http”, “https”]

Añadimos http y https para que todos los servicios de manera predeterminada

[docker]

Permite que Traefik actúe como un proxy frente a los contenedores Docker.

watch = true

Busca nuevos contenedores en la red traefik_net y los expondrá como subdominios de su_dominio (por ejemplo si tienes un contenedor llamado nextcloud obtendrás nextcloud.tudominio.duckdns.org).

Con esto ha hemos terminado, ahora podemos acceder a nuestros séricos desde exterior de nuestra red a través de un criticado expedido por Letsencript.

Si quieres saber más

Si quieres conocer más sobre traefik te recomiendo que eches un vistazo a los siguientes enlaces:

Espero que te haya gustado, pasa un buen día… :penguin: