Saltar a contenido

Ingress y exposición

Cómo entra el tráfico externo (HTTPS) hasta los servicios, sin abrir puertos en el router (gracias al doble NAT aceptado de Excom).

Modelo de doble dominio: .local (LAN) vs .gorkarevilla.com (externo)

Cada servicio tiene dos hostnames con propósitos distintos:

Dominio Acceso TLS Propósito
*.local.gorkarevilla.com LAN (VLAN 20) cert-manager wildcard (Let's Encrypt) Acceso directo desde casa y plan B de emergencia
*.gorkarevilla.com Internet Cloudflare edge (cert Universal) Acceso desde fuera (túnel homelab)

Motivo del dominio .local: si el acceso desde el exterior se rompe (túnel de Cloudflare caído, corte de internet, DNS externo no resuelve), .local permite seguir accediendo a los servicios desde la LAN sin depender de nada externo.

Por eso las URLs *.local.gorkarevilla.com:

  • Nunca redirigen a la URL externa (*.gorkarevilla.com): un redirect rompería la casuística de emergencia, porque el fallback apuntaría justo al exterior que está caído.
  • Son autocontenidas: en los servicios con SSO/OIDC, el flujo usa los endpoints .local de Authentik (auth.local.gorkarevilla.com), nunca los externos.

Cloudflare Tunnel

Todo el tráfico HTTPS entra por Cloudflare, sin abrir puertos en el router. Hay dos túneles: el legacy Lebron (que hoy sirve la mayoría de hostnames vía NPM; ver Legacy → Nginx Proxy Manager) y el del cluster homelab, que ya expone los servicios migrados. El camino por el túnel homelab, apuntando a Traefik:

flowchart TD
    subgraph EXT["Internet"]
        U["Cliente (navegador / app)"]
    end

    subgraph CF["Cloudflare"]
        DNS["DNS passwords/heimdall/auth<br/>CNAME → homelabtunnel.gorkarevilla.com"]
        EDGE["Edge (anycast)<br/>termina TLS<br/>cert Universal *.gorkarevilla.com<br/>SSL mode = strict"]
        TUN["Tunnel 'homelab'<br/>8fbb1068-e91e-…"]
    end

    subgraph LAN["Casa · doble NAT · sin puertos entrantes"]
        subgraph K3S["Cluster k3s · VLAN 20"]
            CFD["cloudflared<br/>ns cloudflared"]
            TR["Traefik<br/>LoadBalancer 192.168.20.60<br/>Gateway API"]
            SVC["Servicios<br/>Vaultwarden · Heimdall · …"]
        end
    end

    U -->|"1 · HTTPS 443"| EDGE
    DNS -. resuelve .-> EDGE
    EDGE -->|"2 · túnel outbound (QUIC/mTLS, lo abre cloudflared)"| TUN
    TUN -->|"3 · HTTP local (plano)"| CFD
    CFD -->|"4 · http://traefik.traefik.svc.cluster.local:80"| TR
    TR -->|"5 · HTTPRoute (Gateway API)"| SVC

Tramo 1 — cliente ↔ edge: el navegador hace el handshake TLS contra el certificado Universal de Cloudflare (*.gorkarevilla.com). El TLS se termina en el edge.

Tramo 2 — edge ↔ cloudflared: la conexión la abre cloudflared (en el cluster) de forma saliente (QUIC/HTTP2), cifrada y autenticada por las credenciales del propio túnel (mTLS). No hay puerto entrante en el router.

Tramo 3 — cloudflared → Traefik: el túnel reenvía a Traefik por HTTP plano en el cluster (http://traefik.traefik.svc.cluster.local:80). El modo SSL = strict de la zona aplica al proxying directo de registros proxied, no a este origen HTTP del túnel.

Tramo final — Traefik → servicio: Traefik hace de reverse proxy por hostname (Gateway API, HTTPRoute) y entrega al servicio de destino. Este último salto es HTTP dentro del cluster.

Los servicios que aún no están en el cluster se siguen exponiendo por el túnel Lebron + Nginx Proxy Manager; ver Legacy → Nginx Proxy Manager.

Rutas que NO pasan por el túnel

Hostname Camino
bali / preview.bali CNAME → Vercel (externo, no pasa por el homelab).
docs.gorkarevilla.com CNAME → Cloudflare Pages (se sirve desde el edge, no del homelab). Se mantiene así por ADR 0003.

Componentes

  • MetalLB: servicios LoadBalancer con IPs LAN reales en modo L2, rango 192.168.20.60–192.168.20.99 (VLAN 20 Servidores). Para tráfico no-HTTP (p. ej. DNS/PiHole).
  • cert-manager: emite y renueva el wildcard *.local.gorkarevilla.com (Let's Encrypt, DNS-01 vía Cloudflare). Traefik lo usa para terminar TLS en el listener websecure (443). Los servicios internos se sirven con este certificado, de confianza pública para cualquier cliente.
  • Traefik + Gateway API: tráfico HTTP/HTTPS interno. Se usa Gateway API (estándar de futuro), no Ingress clásico; requiere activar el provider de Traefik e instalar los CRDs en k3s.
  • Cloudflare Tunnel: exposición externa segura, sin abrir puertos en el router. La parte de Cloudflare (objeto tunnel + registros DNS) se gestiona con Terraform (provider cloudflare); el cliente cloudflared corre dentro del cluster (túnel homelab, apuntando a Traefik). Ver Cloudflare.