Introducción
Esta práctica de ASIR sustituye un servidor Ubuntu que hacía de firewall por pfSense, segmentando la red en tres zonas con reglas propias en vez de dejar todo el tráfico en una única red plana.
Topología de red
- WAN: red pública, la salida a internet.
- LAN (
192.168.3.0/24): red de empleados. - DMZ (
192.168.1.0/24): red donde vive el servidor Apache expuesto.
La idea de fondo es la habitual en segmentación de red: la DMZ aloja lo que tiene que ser accesible desde fuera, la LAN no debería ser alcanzable desde la DMZ, y todo el tráfico entre zonas pasa por reglas explícitas del firewall en vez de circular libremente.
Instalación
pfSense se instaló desde ISO en una máquina virtual de VirtualBox con tres interfaces de red: una para la WAN y dos internas (DMZ y LAN). Tras la instalación y el primer reinicio hay que retirar la ISO manualmente para que arranque desde disco. La configuración web se hace desde una máquina Ubuntu Desktop dentro de la propia DMZ, entrando a http://192.168.1.1 con las credenciales por defecto (admin / pfsense) para completar el asistente inicial.
Interfaces: de LAN por defecto a DMZ y LAN reales
pfSense asigna nombres genéricos a las interfaces por defecto, y no siempre coinciden con lo que se necesita: la interfaz que quería usar como DMZ aparecía como “LAN”, y la que quería usar como LAN real no aparecía todavía. Lo primero fue renombrar y dar IP estática a la que sería la DMZ, y después añadir la interfaz restante (em2) como LAN, con dirección 192.168.3.1/24:

DHCP: dinámico para la LAN, estático para el servidor
Configuré DHCP dinámico en ambas zonas internas: pool 192.168.1.10–192.168.1.245 en la DMZ y 192.168.3.10–192.168.3.245 en la LAN, comprobado conectando un cliente Ubuntu Desktop a cada red y verificando que la IP asignada respetaba el rango del pool.
Para el servidor Apache de la DMZ, sin embargo, un DHCP dinámico no sirve — necesita una IP que no cambie nunca. Así que localicé su MAC y le asigné una reserva estática (192.168.1.2, fuera del rango del pool dinámico, con hostname ApacheJesus y gateway 192.168.1.1). Verificado desde el propio servidor:

Antes de pasar a exponerlo hacia fuera, comprobé que el Apache respondía correctamente desde dentro de la propia DMZ y que el dashboard de pfSense mostraba las tres interfaces (WAN, LAN, DMZ) operativas.
Acceso público al Apache: port forwarding, no IP privada
Aquí tomé una decisión deliberada: en vez de simular el acceso “desde la WAN” conectando directamente a la IP privada del servidor (que es lo que hacen muchos planteamientos de esta práctica), quería que el acceso fuera real — alguien con una IP pública llega a la IP pública del firewall, y es pfSense quien redirige el tráfico al Apache de la DMZ mediante NAT.
Para que esto funcione hay que desmarcar antes, en la interfaz WAN, dos casillas de “Reserved Networks”: “Block private networks and loopback addresses” (la que de verdad impide que el port forward funcione) y “Block bogon networks”. Con eso resuelto, la regla de NAT queda así:

Al crear el port forward, pfSense genera automáticamente la regla de firewall correspondiente en la WAN — sin ella, el NAT no serviría de nada porque el tráfico se bloquearía antes de llegar a redirigirse:

Con la regla en marcha, un cliente en la red “pública” simulada del laboratorio visita la IP del firewall directamente — sin conocer ni necesitar la IP privada real del Apache — y pfSense se encarga de redirigir el tráfico:

Reglas de firewall entre zonas
Con el acceso público resuelto, quedaban las dos reglas que sí hacían falta en este escenario (sin VLANs ni más servicios expuestos, el resto de reglas típicas de esta práctica son opcionales):
- DMZ → LAN restringido: la DMZ no debe poder alcanzar la LAN. Si el servidor Apache se ve comprometido, no debería poder pivotar directamente a la red de empleados.
- Acceso a la DMZ solo por HTTP: nada más que el puerto 80 debería llegar al servidor desde fuera.
La regla que bloquea explícitamente el tráfico con origen en la DMZ hacia la LAN vive en la pestaña DMZ de las reglas de firewall (no en la LAN, que es donde uno esperaría mirar primero):

Y para comprobar que el acceso desde la WAN a la DMZ estaba realmente restringido a HTTP y no a “lo que sea que llegue por el puerto 80”, hice ping (ICMP, no HTTP) desde un cliente hacia la IP del Apache en la DMZ:

Destination Host Unreachable en vez de un simple timeout confirma que es el firewall el que está rechazando activamente el paquete — el servidor solo responde por HTTP, tal y como está pensado, no por cualquier protocolo que le llegue.
Portal cautivo
Como añadido opcional, implementé un portal cautivo para que los empleados de la LAN tengan que autenticarse antes de tener acceso a internet.
Los pasos, en orden:
- DNS Resolver: lo habilité en el menú correspondiente, y añadí un Host Override — una entrada DNS personalizada para la LAN.
- DNS forwarders: configuré los DNS de pfSense a los de Google (Sistema → Ajustes generales) para que la resolución funcionara correctamente de cara a los clientes.
- Reglas de firewall en la LAN: una regla permite el paso hacia el propio firewall por el puerto 53 (DNS), y otra bloquea el resto de tráfico hacia ese puerto para no dejarlo abierto de más.
- Zona del portal cautivo: la creé desde Servicios → Portal cautivo, configurada para que, tras autenticarse, el usuario acceda a internet y además se le redirija a la página del Moodle de informática del instituto Albarregas.
- Grupo y usuario: creé un grupo (
portal_cautivo) con el privilegioUser-Services: Captive Portal login, y añadí un usuario (empleado) como miembro:

Antes de autenticarse, cualquier cliente de la LAN se encuentra bloqueado sin acceso a internet:

Y en vez de dejar la página de login por defecto, le puse un logo y un fondo personalizados:

Al autenticarse con empleado / 1234, el firewall deja pasar el tráfico y redirige a la página de Moodle configurada. Desde Estado → Portal cautivo se puede confirmar en cualquier momento qué usuarios están conectados desde la LAN en ese instante.
Conclusión
Se completaron todos los pasos no opcionales de la práctica, y además el portal cautivo opcional. Lo más interesante para mí no fue tanto seguir la guía de configuración de pfSense, sino las decisiones de diseño alrededor: hacer el acceso público por NAT real en vez de simularlo con IP privada, y comprobar con ping que las reglas de aislamiento entre DMZ y LAN funcionaban de verdad y no solo “sobre el papel”.