Certificados Wildcards de Letsecnrypt con Traefik y Duckdns
2020-02-20
Índice
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.midominio.org, jellyfin.midominio.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.midominioduckdns.org le dice a Traefik que examine el host solicitado y si coincide con el patrón traefik.midominioduckdns.org, enruta el tráfico al contenedor traefik.
-
DUCKDNSTOKEN=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 traefiknet, de hecho, todos los contenedores que son accesibles desde internet utilizan esta 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 traefiknet y los expondrá como subdominios de sudominio (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… 🐧