Saltar a contenido

Topologías de Red

Documentación de las topologías física y lógica de la red de SmallCountry: cómo se conectan los cuatro nodos, qué direcciones IP usan, cómo se segmentan las redes y cómo se comunican las dos ubicaciones geográficas.


Topología física

Dos ubicaciones geográficas separadas por ~150 km: Chapinería (Madrid) y Garganta la Olla (Cáceres). Más una tercera ubicación para el backup offsite Thoth.

flowchart TD
    subgraph Chapineria["🏠 Chapinería (Madrid)"]
        direction LR
        Router1["Router fibra<br/>Movistar 1 Gbps"]
        Switch1["Switch Gigabit<br/>8 puertos"]
        Ra["🖥️ Ra<br/>Proxmox VE<br/>N100 · 32 GB"]
        Horus["🧠 Horus<br/>Proxmox VE<br/>i7 · RTX 4060"]
        AP["📶 Punto de acceso<br/>modo isla<br/>WiFi 6"]
    end

    subgraph Garganta["🌄 Garganta la Olla (Cáceres)"]
        direction LR
        Router2["Router 4G<br/>antena exterior"]
        Switch2["Switch Gigabit<br/>5 puertos"]
        Geb["⚡ Geb<br/>Victron Cerbo GX<br/>ARM"]
        ESP32s["📡 ESP32 × 9<br/>sensores de campo"]
        Shellys["🔌 Shelly × 3<br/>actuadores"]
    end

    subgraph Offsite["🏢 Offsite backup"]
        Thoth["🗄️ Thoth<br/>Raspberry Pi 5<br/>512 GB SSD"]
    end

    Router1 -->|"fibra 1 Gbps"| Switch1
    Switch1 -->|"eth0 · vmbr0"| Ra
    Switch1 -->|"eth0 · vmbr0"| Horus
    Switch1 --> AP

    Router2 -->|"4G LTE"| Switch2
    Switch2 -->|"eth0"| Geb
    Switch2 -.->|"WiFi 2.4 GHz"| ESP32s
    Switch2 -.->|"WiFi 2.4 GHz"| Shellys

    Router1 <-->|"WireGuard<br/>túnel cifrado"| Router2
    Router1 <-->|"NetBird<br/>overlay mesh"| Thoth

    style Chapineria fill:#c8e6c9,stroke:#2e7d32,color:#000
    style Garganta fill:#bbdefb,stroke:#1565c0,color:#000
    style Offsite fill:#ffe082,stroke:#f57f17,color:#000

Topología lógica

Cuatro bridges de Proxmox en Ra y dos en Horus. Cada bridge define una zona de confianza distinta. El dominio .sc unifica el direccionamiento independientemente del nodo físico.

flowchart LR
    subgraph vmbr0["vmbr0 — Exposición externa · 10.10.10.0/24"]
        Caddy["Caddy · 10.10.10.10"]
        Authentik["Authentik · 10.10.10.20"]
        Nextcloud["Nextcloud · 10.10.10.30"]
        Immich["Immich · 10.10.10.40"]
        Matrix["Matrix · 10.10.10.50"]
        Otros_Ext["…"]
    end

    subgraph vmbr1["vmbr1 — Servicios internos · 10.10.20.0/24"]
        PostgreSQL["PostgreSQL · 10.10.20.10"]
        Victoria["VictoriaMetrics · 10.10.20.20"]
        Mosquitto["Mosquitto · 10.10.20.30"]
        Redis["Redis · 10.10.20.40"]
        Otros_Int["…"]
    end

    subgraph vmbr2["vmbr2 — Gestión · 10.10.30.0/24"]
        Proxmox["Proxmox · 10.10.30.1"]
        SSH["SSH jump · 10.10.30.10"]
        Forgejo["Forgejo · 10.10.30.20"]
        Semaphore["Semaphore · 10.10.30.30"]
        Portainer["Portainer · 10.10.30.40"]
    end

    subgraph vmbr3["vmbr3 — IoT · 10.10.40.0/24"]
        NodeRED["Node-RED · 10.10.40.10"]
        n8n["n8n · 10.10.40.20"]
        farmOS["farmOS · 10.10.40.30"]
        HA["Home Assistant · 10.10.40.40"]
        InfluxDB["InfluxDB · 10.10.40.50"]
    end

    subgraph Horus_Redes["Horus"]
        h_vmbr0["vmbr0 · 10.10.1.0/24<br/>Ollama, Open WebUI"]
    end

    subgraph Geb_Redes["Geb"]
        g_lan["LAN · 10.10.2.0/24<br/>MQTT bridge, Modbus TCP"]
    end

    subgraph Thoth_Redes["Thoth"]
        t_lan["LAN · 10.10.9.0/24<br/>PBS client, Restic"]
    end

    vmbr1 -->|"lectura DB"| vmbr0
    vmbr0 -->|"forward-auth"| vmbr2
    vmbr2 -->|"SSH gestión"| vmbr1
    vmbr0 -->|"API"| vmbr3

    style vmbr0 fill:#f9a8d4,stroke:#c2185b,color:#000
    style vmbr1 fill:#bbdefb,stroke:#1565c0,color:#000
    style vmbr2 fill:#a5d6a7,stroke:#2e7d32,color:#000
    style vmbr3 fill:#ffe082,stroke:#f57f17,color:#000
    style Horus_Redes fill:#ce93d8,stroke:#7b1fa2,color:#000
    style Geb_Redes fill:#ffe082,stroke:#f57f17,color:#000
    style Thoth_Redes fill:#ef9a9a,stroke:#c62828,color:#000

Plan de direccionamiento IP

Subred Rango Ubicación Propósito Acceso desde
10.10.1.0/24 Ra y Horus (host) Chapinería IPs de gestión de los nodos Proxmox Solo vmbr2
10.10.2.0/24 Geb + LAN finca Garganta la Olla Gateway energético y red local de la finca WireGuard
10.10.9.0/24 Thoth Offsite Backup offsite NetBird
10.10.10.0/24 vmbr0 Ra Servicios con exposición externa vía Caddy Caddy (LXC 102)
10.10.20.0/24 vmbr1 Ra Servicios internos (BBDD, MQTT, Redis) Solo vmbr0 y vmbr2
10.10.30.0/24 vmbr2 Ra Gestión y administración Solo admin (VPN/WireGuard)
10.10.40.0/24 vmbr3 Ra IoT y domótica vmbr0 + dispositivos de campo

Puertos y servicios expuestos

Solo un puerto está abierto al exterior en Ra:

Puerto Servicio Acceso desde Notas
443 TCP Caddy (HTTPS) Internet Único punto de entrada. Proxy inverso con TLS
51820 UDP WireGuard Internet Túnel VPN para acceso administrativo y malla
443 TCP (fallback) NetBird Internet NAT traversal cuando UDP está bloqueado

Todos los demás puertos están cerrados desde el exterior. Los servicios se comunican internamente a través de los bridges de Proxmox.

En modo isla (sin internet), los puertos 443, 80 y 53 (Pi-hole DNS) siguen funcionando en la red local a través del punto de acceso WiFi.


Flujo de una petición HTTPS

sequenceDiagram
    participant Internet as 🌐 Internet / LAN
    participant Caddy as 🔒 Caddy :443 (vmbr0 · 10.10.10.10)
    participant Authentik as 🛡️ Authentik (vmbr0 · 10.10.10.20)
    participant Servicio as 📦 Servicio (vmbr0 · 10.10.10.XX)
    participant DB as 🗄️ PostgreSQL (vmbr1 · 10.10.20.10)

    Internet->>Caddy: GET https://nextcloud.sc

    Caddy->>Authentik: forward_auth → ¿sesión válida?
    Authentik->>Caddy: ✅ Token OK (grupo: familia)

    Caddy->>Servicio: Proxy → 10.10.10.30:8080<br/>Cabeceras: X-Authentik-User, X-Authentik-Groups
    Servicio->>DB: SELECT ... FROM oc_files (10.10.20.10:5432)
    DB->>Servicio: Datos
    Servicio->>Caddy: 200 OK + HTML
    Caddy->>Internet: 200 OK + HTML (cifrado TLS)

Puntos clave:

  1. Internet nunca llega directamente a un servicio. Todo pasa por Caddy.
  2. Los servicios en vmbr0 pueden hablar con vmbr1 (bases de datos), pero vmbr1 no puede iniciar conexiones hacia vmbr0.
  3. Los servicios en vmbr2 (gestión) solo son accesibles desde la VPN de administración.
  4. Los dispositivos IoT en vmbr3 no pueden alcanzar vmbr1 ni vmbr2.

Redundancia de conectividad

Enlace Primario Secundario Terciario
Ra ↔ Horus WireGuard (local) NetBird Cable Ethernet directo
Ra ↔ Geb WireGuard (fibra + 4G) NetBird (si disponible)
Ra ↔ Thoth NetBird WireGuard (si IP pública)
Horus ↔ Geb WireGuard
Internet Chapinería Fibra 1 Gbps
Internet Garganta 4G LTE Punto de acceso WiFi local (modo isla)

Para el arquitecto

Pi-hole — Registros DNS del dominio .sc

# Servicios en vmbr0
nextcloud.sc     → 10.10.10.30
fotos.sc         → 10.10.10.40  (Immich)
chat.sc          → 10.10.10.50  (Matrix)
login.sc         → 10.10.10.20  (Authentik)
grafana.sc       → 10.10.10.60
reunion.sc       → 10.10.10.70  (Jitsi)

# Servicios en vmbr2 (gestión)
forgejo.sc       → 10.10.30.20
semaphore.sc     → 10.10.30.30
portainer.sc     → 10.10.30.40
proxmox.sc       → 10.10.30.1

# Servicios en Horus
ollama.sc        → 10.10.1.10
ia.sc            → 10.10.1.20  (Open WebUI)

# Nodos físicos
ra.sc            → 10.10.1.1
horus.sc         → 10.10.1.2
geb.sc           → 10.10.2.1
thoth.sc         → 10.10.9.1

Reglas de firewall entre bridges

  • vmbr0 → vmbr1: Permitido (servicios necesitan BBDD)
  • vmbr0 → vmbr2: Denegado (servicios no acceden a gestión)
  • vmbr0 → vmbr3: Permitido solo puertos específicos
  • vmbr2 → *: Permitido (administración total)
  • * → vmbr2: Denegado (solo admin)
  • vmbr3 → vmbr0: Permitido solo MQTT y HTTP selectivos
  • vmbr3 → vmbr1: Denegado
  • vmbr3 → vmbr2: Denegado

Fichas relacionadas