pfSense es un firewall y router de código abierto basado en FreeBSD. No se instala como paquete sobre Linux: es un sistema operativo completo que se ejecuta en hardware dedicado o en una máquina virtual. En este tutorial usarás un servidor con Ubuntu 24.04 como hipervisor KVM, crearás una máquina virtual pfSense con una red WAN y una red LAN aislada, asignarás las interfaces y dejarás el firewall listo para administrarlo desde su interfaz web.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS y virtualización por hardware (Intel VT-x o AMD-V). Un servidor dedicado es lo más adecuado; muchas máquinas virtuales no permiten virtualización anidada.
  • Al menos 2 GB de RAM y 16 GB de disco libres para la VM de pfSense, además de lo que use el host.
  • Un usuario no root con privilegios sudo.
  • Un equipo con cliente SSH desde el que abrir un túnel hacia la interfaz web.

Comprueba que el procesador expone la virtualización:

sudo apt update
sudo apt install cpu-checker
kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

Si kvm-ok indica que KVM no está disponible, activa la virtualización en la BIOS o elige un servidor que la soporte. Sin ella, pfSense funcionará demasiado lento para usarse.

Paso 1: Instalar KVM y libvirt

Instala el hipervisor, el demonio de libvirt y la herramienta virt-install:

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst

Añade tu usuario al grupo libvirt para gestionar máquinas sin sudo y vuelve a iniciar sesión:

sudo usermod -aG libvirt $USER

Tras volver a conectarte, comprueba que libvirt responde y que existe la red default:

virsh -c qemu:///system net-list --all
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

La red default es una red NAT (192.168.122.0/24) que da salida a Internet a través del host. En esta guía será la WAN de pfSense.

Paso 2: Crear la red LAN aislada

La LAN de pfSense necesita una red separada en la que pfSense sea el único router. Crea una definición de red aislada (sin <forward>, por lo que libvirt no la enruta) en la que el host tenga la IP 192.168.1.2, útil para llegar después a la interfaz web:

nano ~/pfsense-lan.xml
<network>
  <name>pfsense-lan</name>
  <bridge name="virbr10" stp="on" delay="0"/>
  <ip address="192.168.1.2" netmask="255.255.255.0"/>
</network>

No se define DHCP en libvirt porque de eso se encargará pfSense. Crea la red y márcala para que arranque sola:

virsh -c qemu:///system net-define ~/pfsense-lan.xml
virsh -c qemu:///system net-start pfsense-lan
virsh -c qemu:///system net-autostart pfsense-lan

Comprueba que el host tiene la IP en el nuevo bridge:

ip -br addr show virbr10
virbr10          UP             192.168.1.2/24

Paso 3: Descargar la imagen de instalación

Descarga la imagen de instalación de pfSense CE para amd64 desde la página oficial, https://www.pfsense.org/download/. Netgate distribuye actualmente pfSense CE mediante un instalador en línea, que descarga el sistema durante la instalación, así que la VM necesitará salida a Internet por la WAN (la red default ya la ofrece).

Sube o descarga la ISO al host, descomprímela si viene en .gz y muévela al directorio de imágenes de libvirt:

gunzip netgate-installer-amd64.iso.gz
sudo mv netgate-installer-amd64.iso /var/lib/libvirt/images/pfsense-installer.iso

El nombre exacto del archivo puede variar según la versión; ajusta los comandos al que hayas descargado. Verifica la suma SHA-256 con la que publica la página de descarga:

sha256sum /var/lib/libvirt/images/pfsense-installer.iso

Paso 4: Crear la máquina virtual

Consulta qué identificadores de FreeBSD conoce tu versión de virt-install, ya que pfSense se basa en FreeBSD:

osinfo-query os | grep -i freebsd

Crea la VM con dos interfaces virtio: la primera en la red default (WAN) y la segunda en pfsense-lan (LAN). Sustituye freebsd14.0 por el identificador más reciente que te haya mostrado el comando anterior:

sudo virt-install \
  --name pfsense \
  --memory 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/pfsense.qcow2,size=16,bus=virtio \
  --cdrom /var/lib/libvirt/images/pfsense-installer.iso \
  --os-variant freebsd14.0 \
  --network network=default,model=virtio \
  --network network=pfsense-lan,model=virtio \
  --graphics vnc,listen=127.0.0.1 \
  --noautoconsole

La consola gráfica solo escucha en 127.0.0.1 para no exponer VNC a Internet. Averigua su puerto:

sudo virsh vncdisplay pfsense
127.0.0.1:0

:0 corresponde al puerto 5900. Desde tu equipo, abre un túnel SSH y conecta un cliente VNC a localhost:5900:

ssh -L 5900:127.0.0.1:5900 your_user@your_server_ip

Paso 5: Instalar pfSense

En la consola VNC verás el instalador. Sigue el asistente:

  1. Acepta la licencia y elige instalar pfSense CE.
  2. Cuando pregunte por las interfaces, selecciona vtnet0 como WAN (con DHCP) y vtnet1 como LAN.
  3. Elige el sistema de archivos ZFS en el disco virtual vtbd0 con la opción por defecto.
  4. Espera a que el instalador descargue e instale los paquetes y reinicia al terminar.

Cuando la VM se reinicie, quita la ISO para que no vuelva a arrancar el instalador:

sudo virsh change-media pfsense sda --eject

Si el comando indica que no existe sda, consulta el nombre del lector con sudo virsh domblklist pfsense.

Configura también la VM para que arranque con el host:

sudo virsh autostart pfsense

Paso 6: Revisar la asignación de interfaces en la consola

Tras el reinicio, la consola de pfSense muestra un menú y el estado de las interfaces:

WAN (wan)       -> vtnet0     -> v4/DHCP4: 192.168.122.57/24
LAN (lan)       -> vtnet1     -> v4: 192.168.1.1/24

 0) Logout (SSH only)                  9) pfTop
 1) Assign Interfaces                 10) Filter Logs
 2) Set interface(s) IP address       11) Restart webConfigurator
 ...

Comprueba que la WAN ha recibido una IP de la red default y que la LAN tiene 192.168.1.1. Si las interfaces están invertidas, usa la opción 1 para reasignarlas; si quieres otra red para la LAN, usa la opción 2.

Desde el host, verifica que llegas a la LAN de pfSense:

ping -c 3 192.168.1.1

Paso 7: Completar el asistente web

La interfaz web solo es accesible desde la LAN. Como el host tiene la IP 192.168.1.2 en esa red, puedes llegar a ella con un túnel SSH desde tu equipo:

ssh -L 8443:192.168.1.1:443 your_user@your_server_ip

Abre https://localhost:8443 en el navegador y acepta el certificado autofirmado. Las credenciales iniciales son admin / pfsense. El asistente de configuración te pedirá:

  • Hostname y dominio del firewall, y servidores DNS.
  • Zona horaria y servidor NTP.
  • Configuración de la WAN: deja DHCP. Como en este laboratorio la WAN es una red privada de libvirt, desmarca la opción Block RFC1918 Private Networks en esa pantalla; en una WAN con IP pública debe quedarse marcada.
  • IP de la LAN: deja 192.168.1.1/24 o cambia a tu rango.
  • Nueva contraseña de administrador: pon una contraseña fuerte. La contraseña por defecto es pública y debe cambiarse siempre.

Al terminar, pfSense recarga la configuración y muestra el panel principal.

Paso 8: Probar el firewall con un cliente en la LAN

Por defecto, pfSense ofrece DHCP en la LAN, permite que la LAN salga a Internet con NAT y bloquea todo lo que entra por la WAN. Para comprobarlo, crea una VM de prueba conectada solo a pfsense-lan, por ejemplo con otra ISO de Ubuntu:

sudo virt-install \
  --name cliente-lan \
  --memory 2048 \
  --vcpus 1 \
  --disk size=10 \
  --cdrom /var/lib/libvirt/images/ubuntu-24.04-live-server-amd64.iso \
  --os-variant ubuntu24.04 \
  --network network=pfsense-lan,model=virtio \
  --graphics vnc,listen=127.0.0.1 \
  --noautoconsole

Dentro del cliente, comprueba que ha recibido una IP del rango de pfSense, que su puerta de enlace es 192.168.1.1 y que tiene salida:

ip route
ping -c 3 1.1.1.1
default via 192.168.1.1 dev enp1s0 proto dhcp src 192.168.1.100 metric 100

En la interfaz web, Status > DHCP Leases muestra la concesión y Status > System Logs > Firewall los paquetes bloqueados en la WAN.

Paso 9: Crear una regla de firewall

Las reglas se crean en Firewall > Rules, por interfaz, y se evalúan de arriba abajo: la primera que coincide se aplica. Como ejemplo, restringe la LAN para que solo pueda navegar por web y resolver DNS:

  1. En Firewall > Rules > LAN, edita la regla Default allow LAN to any rule y desactívala.
  2. Añade una regla Pass, protocolo TCP, origen LAN subnets, destino any, puerto de destino HTTPS (443).
  3. Añade otra igual para HTTP (80).
  4. Añade una regla Pass, protocolo TCP/UDP, origen LAN subnets, destino This Firewall, puerto DNS (53).
  5. Pulsa Apply Changes.

Desde el cliente, curl -I https://www.pfsense.org debe funcionar, mientras que un ping 1.1.1.1 deja de responder porque ICMP ya no está permitido.

Solución de problemas

La WAN no obtiene IP. Comprueba que la red default está activa (virsh net-list) y que la primera interfaz de la VM está en ella con sudo virsh domiflist pfsense.

No se llega a 192.168.1.1 desde el host. Revisa que virbr10 tiene la IP 192.168.1.2 y que en pfSense la LAN es vtnet1. Recuerda que las reglas de la LAN deben permitir el acceso a la interfaz web; pfSense incluye una regla anti bloqueo para ello.

La instalación falla al descargar paquetes. El instalador en línea necesita salida a Internet por la WAN. Verifica desde el host que la red default hace NAT (sudo iptables -t nat -L -n o sudo nft list ruleset).

Conclusión

Tienes pfSense funcionando como máquina virtual KVM en un host Ubuntu 24.04, con una WAN y una LAN separadas, la configuración inicial completada y una primera regla de firewall probada. Como siguientes pasos, puedes conectar la WAN a una IP pública mediante un bridge del host, configurar una VPN WireGuard u OpenVPN desde el gestor de paquetes (System > Package Manager) y programar copias de seguridad de la configuración en Diagnostics > Backup & Restore.