sábado, 24 de diciembre de 2011

FreeBSD: Enabling ALTQ support for PF queues

Hace unos días, en DC Solutions migramos en un cliente un Firewall que utilizaba la tecnología FreeBSD/IPFilter, a FreeBSD/Packet Filter a fin de poder soportar queues para permitiri una priorización del tráfico VoIP y además aliviar el bug descrito en este post IPF NAT entry causes kernel crash.
No voy a describir las ventajas de utilizar una tecnología como PF sobre IPF (aunque pueden ver este post), sino que solo voy a comentarles como darle soporte a las queues dentro del kernel de FreeBSD, el cual no se encuentra soportado por default dentro del kernel instalado con el sistema operativo, sino que debemos activarlo modificando el archivo de configuración del kernel.

Al intentar levantar las reglas de PF si no hay soporte a ALTQ en el kernel se puede encontrar el siguiente mensaje de error:
No ALTQ support in kernel
ALTQ related functions disabled
Como primer punto, debemos tener las fuentes del kernel instaladas en el equipo, para ello pueden utilizar sysinstall (como describo en la primera parte de este post), y así tenerlas instaladas bajo /usr/src.

Una vez instaladas procedemos a modificar el archivo de configuración del kernel, que debería encontrarse en /usr/src/sys/$(uname -m)/conf/GENERIC. Lo que debemos hacer es copiar dicho archivo con un nuevo nombre, por ejemplo FIREWALL:
# cp /usr/src/$(uname -m)/conf/GENERIC /usr/src/$(uname -m)/conf/FIREWALL
Y procedemos a parchear el archivo de configuración FILE, modificando la línea ident y añadiendo las siguientes líneas del tipo options, para dar soporte a los queues y sus diferentes tipos:
------ BEGIN ALTQ.patch ------
24c24
< ident  GENERIC
---
> ident   FIREWALL 78a79,87
> # Altq Support - added by FMDLC
> options  ALTQ
> options  ALTQ_CBQ
> options  ALTQ_RED
> options  ALTQ_RIO
> options  ALTQ_HFSC
> options  ALTQ_CDNR
> options  ALTQ_PRIQ
>
------ EOF ALTQ.patch ------ 

# patch -p0 /usr/src/$(uname -m)/conf/FIREWALL < /tmp/ALTQ.patch 
# cd /usr/src

# make buildkernel KERNCONF=FIREWALL
Una vez compilado procedemos a instalarlo y rebootear el equipo.
# make installkernel KERNCONF=FIREWALL && reboot
Una vez booteado el nuevo kernel podemos hacer el pfctl sin errores:
# kldload pf && pfctl -e -Fa -f /etc/pf.conf
rules cleared
nat cleared
2 tables deleted
altq cleared
0 states cleared
source tracking entries cleared
pf: statistics cleared
pf: interface flags reset
pfctl: pf already enabled

No hay comentarios:

Publicar un comentario