Proyecto Bastion: El guardián de mi infraestructura local

Proyecto Bastion: El guardián de mi infraestructura local

En el post anterior vimos cómo levantar este blog, pero hoy quiero bajar un nivel más y hablar de donde vive realmente. Todo lo que ves aquí reside en una máquina a la que he bautizado como Bastion.

No es un servidor de rack de última generación, sino un veterano Acer Aspire V5 que ha encontrado una segunda vida (y mucha más acción) como cerebro de mi red local. Corriendo sobre Ubuntu 26.04, Bastion no solo aloja este blog, sino que cumple una misión crítica: ser la única puerta de entrada y el principal filtro de seguridad de mi hogar.

El Hardware: Reciclaje con propósito

Como podéis ver en el fastfetch , estamos aprovechando un procesador AMD A10-5757M con 8GB de RAM. Para ser una máquina de gestión, va sobrada de recursos, manteniendo un consumo contenido y un rendimiento sólido para mover varios contenedores Docker en paralelo.


Misión 1: Acceso seguro desde el exterior (VPN)

La primera regla del club de la seguridad: no abras puertos innecesarios. Para poder gestionar mi red desde cualquier lugar del mundo sin exponer servicios críticos, Bastion corre una VPN.

Esto me permite estar en una cafetería en Madrid y sentirme como si estuviera conectado directamente al router de mi casa.

Se basa en openvpn-server levantado con pivnp( originalmente pensado para la pi ), un script que instala y gestiona todo, que se pueda usar en sistemas basados en Debian/Ubuntu :

Web:

PIVPN: Simplest way to setup a VPN

Github:

GitHub - pivpn/pivpn: The Simplest VPN installer, designed for Raspberry Pi
The Simplest VPN installer, designed for Raspberry Pi - pivpn/pivpn

Documentación:

OpenVPN - docs.pivpn.io


Misión 2: Tráfico y exposición (Nginx Proxy Manager)

Para los servicios que necesito que sean públicos (como este blog, mi instancia de Nextcloud o Grocy), utilizo Nginx Proxy Manager (NPM). Es el encargado de recibir las peticiones, gestionar los certificados SSL de Let's Encrypt y redirigir el tráfico al contenedor correspondiente.

Gracias a NPM, puedo tener subdominios limpios sin pelearme con archivos de configuración de Nginx a pelo cada vez que añado un servicio.

Nginx Proxy Manager
Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let’s Encrypt

docker-compose.yml

# Ejemplo de cómo tengo orquestado NPM en mi docker-compose
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    environment:
      TZ: "Europe/Madrid"
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Misión 3: El filtro de la red (Pi-hole)

Bastion también es el "policía" del tráfico DNS. Con Pi-hole, me aseguro de que toda la red local esté libre de telemetría innecesaria y anuncios a nivel de red. No solo mejora la privacidad, sino que acelera la navegación al no tener que cargar basura publicitaria.

Pi-hole – Network-wide Ad Blocking

Lo tengo levantado con Docker:

docker-compose.yml

# Ejemplo de cómo tengo orquestado pihole
version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    # Es vital mapear el puerto 53 en TCP y UDP para el DNS
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:80/tcp" # Accederás a la web por el puerto 8080
    environment:
      TZ: 'Europe/Madrid'
      # IP de tu portátil en la red local (ayuda a Pi-hole a configurarse)
      FTLCONF_LOCAL_IPV4: '192.168.20.38'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    # Capacidad para que Pi-hole gestione correctamente la red
    cap_add:
      - NET_ADMIN
    restart: unless-stopped

Misión 4: Defensa activa con Fail2Ban

GitHub - fail2ban/fail2ban: Daemon to ban hosts that cause multiple authentication errors
Daemon to ban hosts that cause multiple authentication errors - fail2ban/fail2ban

Exponer servicios a internet es como poner una diana en tu IP. Para mitigar los intentos de fuerza bruta, tengo a Fail2Ban vigilando constantemente los logs de acceso de Nginx Proxy Manager.

Si alguien intenta "adivinar" el login de mi Nextcloud más de la cuenta, Fail2Ban le corta el paso directamente a nivel de firewall (iptables/nftables). Es la capa de "bouncer" que toda infraestructura necesita.

# Mi jail personalizada para Fail2ban
[nginx-proxy-manager]
enabled = true
port    = http,https
filter  = nginx-proxy-manager
# Apuntamos a todos los archivos de acceso de los proxy hosts y al de por defecto
logpath = /root/docker/nginx_proxy_manager/data/logs/proxy-host-*_access.log
          /root/docker/nginx_proxy_manager/data/logs/default-host_access.log
maxretry = 3
findtime = 600
bantime  = 3600
action   = iptables-allports[name=npm, chain=DOCKER-USER]

Monitorización con Prometheus y Grafana ( fail2ban_exporter)


Conclusión

Bastion es la prueba de que no necesitas hardware de grado empresarial para tener una red segura y profesional. Con un poco de Linux, Docker y las herramientas adecuadas, cualquier portátil viejo puede convertirse en una fortaleza.