Tengo un firewall con Ubuntu 8.10 que maneja basicamente iptables para filtrado de paquetes, cbq para manejo de anchos de banda y uno que otro servicio (http, mysql, dhcp, etc).
Necesitaba hacer balanceo de carga entre dos conexiones adsl y después de hacer varias pruebas con ip route el rendimiento luego de algunas horas se degradaba mucho, al no conseguir documentación suficiente al respecto pensé en utilizar PFSense, el cual he utilizado antes y se que hace muy bien el trabajo de balanceo entre múltiples WANs. Pero, nunca falta un pero, no había presupuesto para otro servidor, así que penśe en realizar una tarea poco común: un host PFSense en la misma máquina mediante el uso de VirtualBox en la cual el PFSense (guest) sería la puerta de enlace de Ubuntu (host).
No voy a explicar la instalación de PFSense o de Virtualbox ya que de eso hay mucha documentación en Internet, me voy a limitar a explicar la configuración para que un guest de Virtualbox tenga interfaces ethernet que sean visibles desde el "exterior" y hacer que el host utilice a su propio guest como puerta de enlace.
- Instalar Virtualbox, se pueden bajar paquetes para linux aquí.
- Bajar la imagen de PFSense. Yo utilicé el .iso pero también hay una manera de bajar la maquina virtual para VMWare y transformarla con varios pasos a una máquina virtual para Virtualbox. En este caso preferí bajar el .iso e instalar el PFSense desde cero.
- Crear una nueva máquina virtual (guest), seleccionando como sistema operativo FreeBSD, coloquen el tamaño de disco y memoria ram que consideren necesarios en mi caso el disco duro virtual es de 2GB y la memoria ram de 512MB.
- Una vez creada la nueva máquina virtual y antes de ejecutarla por primera vez, entramos en su configuración y habilitamos tantas tarjetas de red como necesitemos, en este caso tres.
- Para hacer que estas interaces sean visibles desde la red externa hay que seguir los pasos que se indican aquí. Importante saber que para cada bridge que hagamos es necesaria una interfaz física, o sea que necestimos en este caso tres tarjetas de red o por lo menos yo no logré asignar una interfaz física a más de un bridge entre el host y el guest. En este caso cuando configuremos por ejemplo tap0 llevará la configuración que queremos en el guest y en br0 la que queramos en el host.
- Iniciamos la máquina virtual por primera vez y utilizamos como método de instalación el archivo .iso del PFSense que bajamos anteriormente (no es necesario quemar un cd para este propósito).
- Una vez instalado el PFSense se configura el balanceo de carga.
- Ahora solo queda configurar nuestra red en Ubuntu para que utilice como salida nuestra máquina virtual en PFSense y listo.
Como nota final, si utilizan iptables en el host hay que revisar con detenimiento las interaces donde se aplican (eth0, eth1, etc) porque en mi caso tuve que cambiar unas reglas de PREROUTING de eth0 a br0.