jueves, 27 de marzo de 2008

PF - Packet Filter Firewall

Estoy leyendo un poco de doc del PF de OpenBSD (FreeBSD y NetBSD también lo incluyen, entre otros).

No sé si Iptables/Netfilter tiene o no tal o cual característica (diría que no, al menos las incluídas en el core como sí las tiene PF), pero me atrevo a decir que este firewall (PF) es MUY GROSO. Pero groso en serio, además de tener reglas mucho más legibles (que es importante cuando uno tiene más de 10).

Doc principal:
http://www.openbsd.org/faq/pf/index.html

Doc Extra:
http://home.nuug.no/~peter/pf/en/

Presentación del creador (ojo, es viejo, del 2003):
http://www.benzedrine.cx/sucon/

Para no decirles que lean solamente (je), les comento cosas que me sorprendieron hasta ahora (no terminé de leer!):

  • Soporte de pfsync y CARP: pfsync sincroniza reglas y CARP es un protocolo de Redundancia, para armar un cluster como Firewall (!!).
  • Soporte de Syn Proxy: Básicamente no pasa los "Syn" al servidor que está detrás hasta tanto la conexión no esté establecida; luego los forwardea, claro, manteniendo el estado de la conexión (cosa que hace solito en las últimas versiones).
  • Soporte de QoS con AltQ (Netfilter también lo tiene con módulos aparte aunque vienen en todas las distros). En FreeBSD para agregar esto hay que recompilar el kernel (ufa).
  • IP Normalization (scrubbing) y IP Modulation: Normaliza paquetes "irregulares"; es decir, los "maquilla" para que sean todos coherentes. Corrige campos con valores no del todo aleatorios (por deficiencias del host origen). Acá se me escapó un poco la tortuga, mete cosas para pulir los paquetes fragmentados y después filtrarlos como corresponde.
  • Optimización de reglas: digamos que las procesa y arma árboles de decisión internos (para darse una idea). Esto hace que si un paquete no matchea con un nodo del árbol, descarta esa rama entera para evaluar.
  • El concepto de tablas (listas de direcciones CIDR) para luego hashearlas (supongo) está bueno.
  • PF permite rutear paquetes diferentes a lo que diga la tabla de enrutamiento (!!!).
  • Labura con varios enlaces sin problemas (permite redundancia o clasificación del tráfico) sin hacer malabares, no? (siempre le tuve miedo a http://lartc.org, je).
  • Fingerprinting pasivo del SO integrado, listo para ser usado en las reglas que uno arme :-) (ojo, considerar que no es 100% efectivo, claro está).

Y ojo al configurarlo, que la última regla que matchea un paquete, gana (a diferencia del resto del mundo). De esto me di cuenta jugando primero y leyendo después (mal hecho) :-)

Seguramente voy a agregar más a medida que vaya leyendo. Si me estoy perdiendo alguna, no me peguen. :-)

Disclaimer: Ojo, no soy sysadmin full time "hiper-profesional"; quizás un partidario de Netfilter me diga "eh! pero iptables hace xxx cosa y le da 20 vueltas!!" y tenga razón. Aún así, estas cositas de PF me llaman la atención.

Saludos!
Marcelo

PD: Alguien sabe cómo priorizar los ACK de subida con iptables? Me refiero a esto (está implementado con PF):
http://www.benzedrine.cx/sucon/mgp00033.html
http://www.benzedrine.cx/sucon/mgp00034.html

5 comentarios:

Anónimo dijo...

No sé si se puede hacer lo de la priorización de ACKs pero de poder hacerse debería hacerse con el framework advanced routing de linux (paquete iproute), este te permite aplicar reglas para proveer calidad de servicio, iptables/netfilter no.

Saludos.
Efraim.

Marcelo Fernández dijo...

Bueno, por eso decía que no quería ponerme a leer http://lartc.org, je... además me gusta que PF ya lo tiene incorporado, no hacen falta módulos/paquetes aparte (aunque creo que todas las distros los incluyen hoy en día)....

Anónimo dijo...

Ah, me olvidaba de que en Debian tenés el port del carp de openbsd en el paquete ucarp (www.ucarp.org) para implementar alta disponibilidad, por lo que lo estuve chusmeando se ve muy sencillo, también tenés una implementación de VRRP (Virtual Router Redundancy Protocol), una especificación de CISCO llena de patentes y que además me pareció bastante compleja, el link es
http://www.keepalived.org/
la sincronización del estado de las conexiones te la debo :(

Anónimo dijo...

Para evitar esto que te paso a vos, me refiero que la regla que machea ultima es la que gana, podes agregarle a las reglas el parametro "quick", esto hace que apenas machea una regla con ese parametro gane. Yo generalmente pongo un "block quick ..." al final y a todas las reglas "pass" les agrego el "quick", asi gana la primera que machee. Ademas de asi crear una politica por defecto de "block" y solo aceptar lo que ingrese en una regla.

Un muy buen tip para los que no son amigos de la consola es utilizar PFW: www.allard.nu/pfw/

PF es sin dudas el mejor y mas sencillo filtro de paquetes (y otras caracteristicas). Solo falta que la gente se de cuenta.

Saludos,
Hernan - www.openbsderos.org

Marcelo Fernández dijo...

Si, gracias por el tip del "quick", lo había leído... pero mucho no me gusta andar poniendo "quick" por todos lados para forzar un comportamiento que no es el que PF tiene por defecto.

No sé, no me gusta ir en contra de esas cosas; prefiero cambiar la forma de pensar (adaptarme yo), escribir menos y hacer las reglas más "mantenibles", se me hace.... :-)

Pero bueno, es un detalle, y más que nada para los que "vienen" (o "venimos") de Linux.

Saludos!
Marcelo