Certificados Wildcards de Letsecnrypt con Traefik y Duckdns

· ☕ 5 min 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

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

1
docker network create traefik_net

traefik.toml

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

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… 🐧

Compartir en
Apoya al autor con

Hefistion
ESCRITO POR
Hefistion