"Scrubbing" es la normalización de paquetes con
el objetivo de que no existan ambigüedades de interpretación
en el destino final del paquete. La directiva scrub
también realiza el reensamblaje de paquetes fragmentados,
protegiendo a algunos sistemas operativos de ciertos tipos de ataques y
bloqueando los paquetes TCP que lleven una combinación no
válida del indicador de TCP (véase
flag). Una forma simple de la
directiva scrub sería:
scrub in all
Con este ejemplo de scrub se normalizarían todos los
paquetes entrantes en todas las interfaces.
Un motivo para no usar scrub en una interfaz sería que se
estuviera pasando tráfico de NFS a través de PF. Algunas
plataformas no OpenBSD envían (y esperan recibir) paquetes
extraños, paquetes fragmentados con el bit"do not
fragment" activado, y éstos son rechazados con motivo
por scrub. Este problema se puede solucionar usando la
opción no-df. Otro motivo para no usar scrub es
que algunos juegos de jugadores múltiples tienen problemas de
conexión al pasar a través de PF con la directiva
scrub activada. A parte de estos casos poco usuales, el uso de
scrub en todos los paquetes es una práctica muy
recomendable.
La sintaxis de la directiva scrub es muy parecida a la sintaxis
del filtro de paquetes, lo que facilita el uso
de scrub en cierto paquetes y no en otros.
La directiva scrub acepta las siguientes opciones:
no-df
Elimina el bit "don't fragment" de la
cabecera del paquete de IP. Se sabe que algunos sistemas operativos
generan paquetes fragmentados con don't fragment activado. En
concreto, esto es lo que ocurre con NFS. Scrub bloquea esos
paquetes a menos que se especifique la opción no-df.
Debido a que algunos sistemas operativos generan paquetes don't
fragment con un campo de cabecera de identificación de IP
nulo, se recomienda usar no-df junto con random-ip.
random-id
Sustituye el campo de identificación de IP de los paquetes
salientes con valores aleatorios, para compensar la existencia de
sistemas operativos que usan valores predecibles. Esta opción
sólo se aplica a los paquetes salientes que no estén
fragmentados después del reensamblaje opcional del paquete.
min-ttl num
Impone un Time To Live (TTL, un tiempo de vida) mínimo
en cabeceras de paquetes IP.
max-mss num
Impone un Maximum Segment Size (MSS, un tamaño
máximo de segmento) máximo en cabeceras de paquetes TCP.
fragment reassemble
Almacena en memoria fragmentos de paquetes entrantes y los
reensambla en un paquete completo antes de pasarlos a la maquinaria de
filtrado. La ventaja de esto es que las reglas de filtrado sólo
tienen que tratar con paquetes completos y pueden ignorar los
fragmentos. La desventaja es que necesita más memoria para
almacenar temporalmente los fragmentos de los paquetes. Cuando no se
especifica la opción fragment, este funcionamiento es el
predeterminado. También es la única opción de
fragment que funciona con NAT.
fragment crop
Provoca que se rechacen los fragmentos duplicados y que se recorten
los que coincidan en parte. A diferencia de
fragment reassemble, los fragmentos no se almacenan
temporalmente en la memoria, sino que que se pasan en cuanto llegan.
fragment drop-ovl
Parecido a fragment crop, con la diferencia de que todos
los fragmentos duplicados o que coincidan, así como cualquier
fragmento correspondiente a continuación, son rechazados.
reassemble tcp
Normaliza las conexiones TCP manteniendo el estado.
Cuando se usa scrub reassemble tcp, no se puede especificar una
dirección (entrante/saliente). Lleva a cabo las siguientes
normalizaciones en el paquete:
A ninguna parte de la conexión se le permite reducir su
IP TTL. Esto es así para proteger contra la posibilidad de
que un atacante que envíe un paquete que alcance el
cortafuegos, afecte la información de estado mantenida para
la conexión, y que ésta caduque antes de alcanzar el
anfitrión de destino. El TTL de todos los paquetes se eleva
al máximo valor visto para la conexión.
Modulación de las marcas de tiempo
RFC1323
en las cabeceras de paquetes TCP con un número aleatorio.
Esto puede evitar que un observador deduzca el tiempo de actividad
(uptime) del anfitrión, o que pueda adivinar
cuántos anfitriones se encuentran detrás de la
pasarela de NAT.
Ejemplos:
scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400
scrub in on fxp0 all no-df
scrub on fxp0 all reassemble tcp