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
.localde 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
LoadBalancercon IPs LAN reales en modo L2, rango192.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 listenerwebsecure(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
Ingressclá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 clientecloudflaredcorre dentro del cluster (túnelhomelab, apuntando a Traefik). Ver Cloudflare.