Qué es
Un laboratorio de red construido con pfSense que sustituye a un firewall Ubuntu anterior, segmentando la infraestructura en tres zonas — WAN, LAN y DMZ — con reglas propias entre ellas, un servidor Apache expuesto de forma controlada, y un portal cautivo para autenticar a los usuarios de la LAN antes de darles acceso a internet.
Por qué lo hice
Quería ir más allá de “instalar pfSense y listo”: tomar decisiones reales de segmentación (qué puede hablar con qué), exponer un servicio a internet de la forma correcta (NAT, no IP privada disfrazada de pública), y verificar con pruebas reales — no solo mirando la configuración — que las reglas de aislamiento funcionaban.
Cómo funciona
Tres interfaces con roles distintos: la DMZ (192.168.1.0/24) aloja un servidor Apache con IP estática reservada por MAC; la LAN (192.168.3.0/24) es la red de empleados, con DHCP dinámico y un portal cautivo delante; y la WAN es la salida pública, con un port forward que redirige el puerto 80 hacia el Apache de la DMZ.
Las reglas de firewall clave: la DMZ solo acepta tráfico entrante por HTTP (comprobado con ping real desde fuera, no solo revisando la configuración) y bloquea explícitamente cualquier tráfico saliente hacia la LAN.
He escrito el desglose técnico completo —topología, DHCP estático, port forwarding, reglas entre zonas y el portal cautivo personalizado— en el blog.
// Desglose técnico completo pfSense: firewall con DMZ, port forwarding y portal cautivoStack
| Pieza | Uso |
|---|---|
| pfSense | Firewall y router entre las tres zonas |
| Apache | Servicio expuesto en la DMZ |
| DNS Resolver (pfSense) | Resolución DNS para la LAN y host override |
| Captive Portal (pfSense) | Autenticación de usuarios de la LAN antes de dar acceso a internet |
Qué aprendí
La parte más útil no fue configurar pfSense siguiendo el manual, sino pensar como un atacante para verificar mis propias reglas: un ping bloqueado con “Destination Host Unreachable” demuestra que el firewall está rechazando el paquete activamente, algo muy distinto de un simple timeout por host inexistente. Esa distinción — y la costumbre de comprobar en vez de asumir — es la que más me llevo de esta práctica.