TPTito Pinardo Gutiérrez
← Volver al rack
English
1U · TRAEFIKProxy inverso · TLS automático · LXC En producción

Posición 2 de 25 en el rack · En producción

Unidad 1U · Entrada pública

Traefik · la única puerta

Superficie reducida el 26-09-2026

Un proxy inverso en su propio contenedor que recibe todo el tráfico web de internet, pone el certificado y lo reparte por nombre. Las rutas no se tocan a mano: salen de la misma lista con la que Ansible genera el resto del homelab.

Por qué Traefik
Certificados de Let's Encrypt automáticos, rutas en ficheros que se recargan sin cortar y un binario sin dependencias: cabe en un contenedor pequeño sin Docker.
Qué publica
Solo lo que tiene que verse desde fuera: esta web, la mensajería, la multimedia y los juegos. Los paneles internos se quitaron de internet y van por otra puerta con doble factor.
Cómo se gestiona
Una lista de servicios en el repositorio de infraestructura. Ansible genera una ruta por dominio y Traefik la recoge al vuelo.
  • 36,6 GBde log sin rotar que encontré a tiempo
  • 91.000+peticiones de un «ataque» que era mi propio bot
  • 10servicios retirados de internet en un día
  • 1lista de servicios para Traefik y el panel de inicio

Su código, en abierto Versión pública del repositorio: sin IPs ni secretos.

La puerta por dentro

Todo lo público entra por aquí y nada más. Elige un recorrido para ver cómo se decide a dónde va cada petición.

Hermesde visita en la unidad

Pulsa una pieza o elige un recorrido. Si vienes de una habilidad, ya están encendidas las piezas donde la uso.

      Una petición a esta web
      1. Un visitante — Un visitante abre esta web.
      2. Cloudflare — Cloudflare la recibe primero y la pasa a casa.
      3. Router MikroTik — El router reenvía el HTTPS que viene de la WAN al contenedor de Traefik.
      4. Punto de entrada HTTPS — Traefik la recibe en su punto de entrada.
      5. Terminación TLS — Presenta el certificado válido del dominio y descifra la petición.
      6. IP real del visitante — Recupera la IP real del visitante, fiándose solo de la cabecera si viene de Cloudflare.
      7. Rutas — Mira el nombre pedido y encuentra su ruta.
      8. Cabeceras de seguridad — Añade las cabeceras de seguridad.
      9. Esta web — La web responde desde su contenedor.
      10. Cabeceras de seguridad — La respuesta vuelve cifrada con sus cabeceras.
      11. Un visitante — Y llega al visitante.
      Un certificado se renueva solo
      1. Renovación por DNS — Faltan menos de 30 días para que caduque un certificado. Traefik inicia la renovación.
      2. Cloudflare — Crea un registro temporal en el DNS de Cloudflare para demostrar que el dominio es mío.
      3. Let's Encrypt — Let's Encrypt comprueba el registro y firma el certificado nuevo.
      4. Renovación por DNS — Traefik borra el registro temporal y guarda el certificado.
      5. Terminación TLS — Desde la siguiente conexión, los visitantes reciben el nuevo. Sin reinicios.
      6. Vigilancia — Por si algo fallara, el vigilante de certificados de Hermes avisa con días de margen.
      Publico un servicio nuevo
      1. Repositorio de infraestructura — Añado una línea a la lista de servicios del repositorio: dominio y servicio.
      2. Ansible — Ansible genera el fichero de la ruta y la entrada del panel de inicio, revisando el cambio antes de aplicarlo.
      3. Rutas — Si es un servicio del servidor, crea solo su registro DNS en Cloudflare, con proxy: no hay que entrar al panel para nada.
      4. Cloudflare — Traefik detecta el fichero nuevo y carga la ruta sin cortar nada.
      5. Servicio systemd — El servicio sigue igual de aislado: Traefik corre con su usuario y sus permisos.
      6. Punto de entrada HTTPS — La ruta ya responde.
      7. Vigilancia — Y la monitorización empieza a comprobarla.
      Retiro un servicio
      1. Repositorio de infraestructura — Borro su línea de la lista de servicios del repositorio. Es lo único que hago.
      2. Ansible — Ansible compara la lista con lo que hay publicado.
      3. Rutas — Borra el fichero de la ruta que ya no está en la lista: si no, Traefik lo seguiría sirviendo.
      4. Cloudflare — Y borra su registro DNS en Cloudflare. Solo toca los registros que creó él: los demás de la zona no se miran.
      5. Punto de entrada HTTPS — La puerta ya no tiene ninguna entrada para ese nombre.
      6. Vigilancia — Y la monitorización deja de comprobarlo.
      Alguien escribe «www»
      1. Un visitante — Un visitante escribe la dirección con «www».
      2. Cloudflare — Cloudflare la pasa a casa.
      3. Punto de entrada HTTPS — Traefik la recibe.
      4. Redirecciones — La ruta de esa variante es una redirección 301 a la dirección canónica.
      5. Un visitante — El navegador vuelve a pedir, ahora a la buena.
      6. Rutas — Esta vez sí hay ruta al servicio.
      7. Esta web — Y la web responde. Antes de declararlo en la lista, esa variante daba un error 526.
      Un escáner llama a la puerta
      1. Un visitante — Un escáner prueba rutas conocidas: ficheros de configuración, carpetas de Git, paneles de administración.
      2. Cloudflare — Pasa por Cloudflare, que añade la IP real al final de la cabecera.
      3. Punto de entrada HTTPS — Traefik solo se fía de esa cabecera si la conexión viene de los rangos de Cloudflare.
      4. IP real del visitante — Y toma la última IP de la cadena: si el escáner manda una cabecera falsa, no le sirve.
      5. Registro de accesos — La petición queda en el registro con su IP real.
      6. CrowdSec — CrowdSec reconoce el escenario, decide bloquear esa IP y la comparte con su red comunitaria.
      7. Punto de entrada HTTPS — El plugin de Traefik aplica las decisiones en la entrada: esa IP ya no pasa.
      8. Vigilancia — Cada mañana, un resumen: qué detectó, cuántas IPs de la lista comunitaria llegaron y cuáles podrían ser falsos positivos.
      Alguien busca el panel desde fuera
      1. Un visitante — Alguien intenta llegar al panel de Traefik desde internet.
      2. Punto de entrada HTTPS — El panel no tiene nombre público, así que ni siquiera hay ruta desde fuera.
      3. Panel de Traefik — Aunque la hubiera, solo acepta la red de casa y la VPN.
      4. Un visitante — No consigue nada. Los paneles internos van por otra puerta, con doble factor.
      1. Un visitante

        Cualquiera que abre una de mis webs.

      2. Cloudflare

        Proxy delante de los dominios: oculta la IP de casa y filtra. También gestiona el DNS donde Traefik demuestra que el dominio es suyo.

      3. Router MikroTik

        Reenvía el HTTPS que entra por la WAN, y solo ese, al contenedor de Traefik.

      4. Let's Encrypt

        La autoridad que firma los certificados, gratis y renovables cada 90 días.

      5. Repositorio de infraestructura

        La lista de servicios publicados vive aquí, versionada: qué dominio va a qué servicio.

        • Git
      6. Ansible

        Lee la lista y escribe una ruta por dominio, crea su registro DNS en Cloudflare y borra las rutas y los registros que ya no están. La misma lista genera el panel de inicio del homelab.

        • Ansible
      7. Punto de entrada HTTPS

        Traefik escucha el HTTPS. El HTTP plano solo existe para redirigir a HTTPS.

        • Traefik
      8. Terminación TLS

        Traefik presenta el certificado válido de cada dominio y descifra la petición.

        • Traefik
      9. IP real del visitante

        Detrás de Cloudflare todas las peticiones parecen venir de Cloudflare. Traefik solo se fía de la cabecera con la IP real si viene de los rangos de Cloudflare.

        • Traefik
      10. Renovación por DNS

        Para demostrar que el dominio es mío, Traefik crea un registro temporal en el DNS de Cloudflare. No hace falta abrir ningún puerto extra y sirve para comodines.

        • Traefik
      11. Rutas

        Una ruta por dominio, en su propio fichero. Traefik mira el nombre pedido y elige el servicio.

        • Traefik
      12. Redirecciones

        Las variantes con «www» o sin ella mandan a la dirección canónica con un 301, declarado en la propia lista de servicios.

        • Traefik
      13. Cabeceras de seguridad

        HSTS y el resto de cabeceras para que el navegador no acepte versiones sin cifrar.

        • Traefik
        • Linux / SSH hardening
      14. Panel de Traefik

        Sin acceso inseguro, sin nombre público y limitado a la red de casa y a la VPN.

        • Traefik
        • Linux / SSH hardening
      15. Esta web

        Uno de los servicios detrás de la puerta. Tiene su propia unidad.

      16. Multimedia

        Plex y lo que lo rodea, para verlo fuera de casa.

      17. Mensajería (Matrix)

        El servidor de chat y su cliente web.

      18. Webs de los juegos

        La web pública de los servidores de juego. El juego en sí no pasa por aquí: Traefik solo entiende HTTP.

      19. Registro de accesos

        Una línea por petición: quién, qué y con qué resultado. Rota cada día, se guardan 14 y se comprimen. Es lo que lee CrowdSec.

        • Linux (Debian, Alpine, Arch)
      20. CrowdSec

        Lee el registro de accesos y reconoce escaneos, búsqueda de ficheros sensibles, fallos conocidos y fuerza bruta. Comparte lo que ve con su red comunitaria y recibe su lista de IPs maliciosas.

        • CrowdSec
        • Linux / SSH hardening
      21. Servicio systemd

        El binario oficial con su unidad de systemd, sin Docker: menos piezas en la puerta más expuesta.

        • Linux (Debian, Alpine, Arch)
        • Linux / SSH hardening
      22. Vigilancia

        La monitorización comprueba que responde y el vigilante de certificados de Hermes avisa antes de que caduque ninguno.

      Lo que uso de mi árbol

      Pulsa una habilidad: se encienden en el mapa las piezas donde la uso y te cuento para qué.

      Ansible
      Genera las rutas y el panel de inicio desde la misma lista, mostrando el cambio antes de aplicarlo.
      LXC
      Corre en su propio contenedor LXC, separado del resto de servicios.
      Git
      La lista de servicios publicados está versionada: cada dominio nuevo es un commit.
      Linux (Debian, Alpine, Arch)
      Servicio systemd con usuario propio, rotación de logs con logrotate y un disco que ya no se llena.
      Traefik
      Proxy inverso de entrada: TLS automático por DNS, una ruta por dominio, redirecciones, cabeceras de seguridad e IP real solo desde Cloudflare.
      Linux / SSH hardening
      Cabeceras HSTS, panel sin acceso inseguro y limitado a la red de casa y la VPN, y paneles internos retirados de internet.
      CrowdSec
      Detección en el registro de accesos, lista comunitaria, plugin de Traefik de versión fija cargado del disco y un resumen diario en Element.

      Bitácora de incidencias

      Averías reales. Lee el síntoma, elige la causa que creas y mira cómo se arregló.

      1. #1

        El disco de la puerta al 80 %

        14-08-2026 · disco

        Revisando los logs para otra cosa, el disco del contenedor de Traefik estaba al 80 % y subiendo. Si se llenaba, se caían una veintena de dominios a la vez.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        No había configuración de rotación para el log de accesos. Un fichero de 36,6 GB en un disco de 50.
        Solución
        Rotación diaria, 7 días, comprimida. La primera rotación forzada intentó copiar el fichero entero con solo 9,5 GB libres: la paré a tiempo y vacié el original directamente, que es seguro porque Traefik escribe siempre al final.
        Lección
        Todo lo que escribe sin parar necesita rotación desde el primer día. Y la primera limpieza de algo enorme se piensa: el método normal puede ser justo el que llena el disco.
      2. #2

        4.600 intentos al día contra el panel de juegos

        14-08-2026 · tráfico

        El log mostraba miles de peticiones al día contra el panel de los servidores de juego. Parecía un ataque de fuerza bruta y estaba preparando un bloqueo automático.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        La IP de origen era la de casa. Era mi bot de Discord, que pedía el estado del panel cada 10 segundos por el dominio público: salía a internet, pasaba por Cloudflare y volvía a entrar. Más de 91.000 peticiones en una sola sesión.
        Solución
        Que el bot hable con el panel por la red interna. El «ataque» desapareció del log.
        Lección
        Antes de bloquear, mirar de dónde viene. La mitad de los misterios del tráfico están en casa.
      3. #3

        CrowdSec iba a bloquear a Cloudflare

        15-10-2026 · CrowdSec

        Antes de activar CrowdSec miré el registro de accesos: el 95 % de las peticiones venían de unas pocas IPs, todas de Cloudflare.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        Detrás de Cloudflare, la conexión siempre llega desde Cloudflare. Sin decirle a Traefik que se fíe de su cabecera, cada visitante quedaba apuntado con la IP de Cloudflare, y CrowdSec habría bloqueado a Cloudflare entero.
        Solución
        Traefik se fía de la cabecera solo si la conexión viene de los rangos de Cloudflare, y CrowdSec y el plugin toman la última IP de la cadena, la que pone Cloudflare. Comprobado con una cabecera falsa: no engaña.
        Lección
        Antes de dejar que algo bloquee, hay que mirar qué ve. Y de paso, los servicios de detrás también reciben ahora la IP real.
      4. #4

        La dirección con «www» daba error 526

        Octubre de 2026 · rutas

        Quien escribía la dirección de esta web con «www» delante se encontraba un error 526 de Cloudflare en vez de la web.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        Cloudflare mandaba la variante con «www» a casa, pero Traefik no tenía ninguna ruta ni certificado para ese nombre, así que la conexión segura fallaba.
        Solución
        Un campo nuevo en la lista de servicios para declarar redirecciones: la variante con «www» responde con un 301 a la dirección canónica.
        Lección
        Cada nombre que apunta a casa necesita su destino declarado. Si la redirección vive en la lista, se genera y se revisa como todo lo demás.

      Contado entero en un artículo:

      Cómo se construyó

      1. Verano de 2026

        Una puerta para todo

        • Traefik en su contenedor con el binario oficial, sin Docker.
        • Certificados automáticos por DNS con Cloudflare.
        • Una veintena de dominios, cada uno con su ruta.
      2. Agosto de 2026

        Lo que encontré mirando los logs

        • Log de 36,6 GB sin rotar: rotación diaria.
        • El «bot de fuerza bruta» era mi propio bot de Discord.
      3. 26-09-2026

        Menos superficie

        • Fuera de internet los paneles internos: hipervisor, automatizaciones, panel de inicio, el propio panel de Traefik y otros.
        • Borradas sus rutas y sus registros DNS; siguen en uso detrás de la puerta interna con doble factor.
        • Rutas generadas desde una sola lista en el repositorio, con redirecciones declaradas.
      4. 15-10-2026

        CrowdSec en la puerta

        • Traefik ve la IP real de cada visitante: antes, casi todo el tráfico parecía venir de Cloudflare.
        • CrowdSec lee el registro de accesos, comparte con su red comunitaria y recibe su lista.
        • Tres días solo mirando: habría bloqueado 7.875 peticiones de 143 IPs, todas de escáneres, sin un falso positivo conocido. Después, bloqueo activado.
        • Rotación de los registros, en código.
      5. 18-10-2026

        En su propia red

        • La puerta pública pasa a una red aparte (DMZ), aislada de la red de casa: desde ahí solo llega al DNS, a la monitorización y a los servicios que publica.
        • Si alguien la comprometiera, no vería el resto de la casa.

      Decisiones (y por qué)

      • Proxy público

        Traefik en un contenedor, sin Docker

        Es la pieza más expuesta: cuantas menos capas, mejor. El binario oficial con systemd basta y se actualiza con Ansible.

      • Cómo se prueban los dominios

        Desafío DNS-01 en Cloudflare

        No obliga a abrir el puerto 80 al mundo, funciona aunque el servicio aún no esté listo y permite certificados comodín.

      • Cuántos dominios

        Tres, cada uno con su uso

        Uno para esta web y los proyectos personales que se pueden ver en público, otro para los juegos y otro para los servicios del servidor. Separarlos deja claro qué es qué. Los tres se mantienen solos, cada uno con su automatismo: en el de los servicios del servidor, Ansible crea y borra el registro de cada ruta; en el de los juegos, el publicador de AMP crea el nombre de cada servidor al encenderlo y lo quita al apagarlo; y la IP de casa la actualiza el sincronizador en todos.

      • Bloquear IPs

        CrowdSec, después de unos días mirando

        Bloquear a un visitante legítimo (un amigo en los juegos, yo desde fuera) es peor que dejar pasar un escaneo que no encuentra nada. Antes de bloquear, el resumen diario marca las IPs que habría bloqueado y que recibieron respuestas buenas: las candidatas a falso positivo. Las 71 que salieron eran escáneres en páginas públicas.

      • Qué se publica

        Solo lo que tiene que verse desde fuera

        Un panel publicado es una invitación. Los internos van por Caddy y Authelia, con doble factor y solo desde casa o la VPN.

      Lo que aprendí

      • La puerta más expuesta es la que menos piezas debe tener.
      • Mirar los logs de vez en cuando: el disco y el bot salieron así.
      • Publicar es fácil; despublicar lo que no hace falta es lo que de verdad reduce el riesgo.

      Lo siguiente

      • Retomar un bloqueo automático basado en los logs, ahora que ya no hay ruido propio.
      • Llevar las cabeceras de seguridad comunes a la lista de servicios, para que cada ruta nueva las herede.

      ¿Hablamos?

      Puedo contar cualquiera de estas decisiones en detalle en una entrevista.

      Descargar CV Contactar ← Volver al rack

      Reconstrucción a partir de mi documentación: sin dominios, direcciones ni puertos internos.