Filtro de paquetes

Filtro de paquetes (PF)
Tipo de cortafuegos
Desarrollador Proyecto OpenBSD
Escrito en do [1] [2]
Sistema operativo sistemas BSD
Primera edición 1 de diciembre de 2001 [3]
ultima versión 4.8 ( 1 de noviembre de 2010 )
Licencia BSD
Sitio web Preguntas más frecuentes

Packet Filter (PF) es un firewall desarrollado como parte del proyecto OpenBSD . Tiene alta velocidad, fácil configuración y excelentes funciones, incluida la compatibilidad con IPv6 . Actualmente se utiliza, además de OpenBSD, en NetBSD [4] y FreeBSD [5] , así como MirOS BSD basado en estos tres , DesktopBSD , pfSense y otros. Dado que la versión 10.7 PF se usa en Mac OS X. PF fue portado a Microsoft Windows y formó la base del cortafuegos Core Force [6] .

Historia

La historia de PF comenzó en el año 2000, cuando Darren Reid , el desarrollador del cortafuegos IPFilter utilizado en ese momento en OpenBSD , cambió la licencia del mismo. Entonces ipf fue excluido del repositorio de CVS , y su lugar fue ocupado por el lanzamiento de OpenBSD 3.0 escrito desde cero PF.

OpenBSD 3.3 introdujo pfsync  , una pseudo-interfaz que le permite replicar información de contexto de conexión entre dos (y más tarde) hosts. Cuando se usa CARP u otra tecnología similar, pfsync permite, en particular, crear configuraciones tolerantes a fallas a partir de varios firewalls físicos: si un host falla, el segundo continuará procesando el tráfico de la red sin interrumpir las conexiones.

Inicialmente, PF era bastante similar a IPFilter. Un importante rediseño de la arquitectura interior comenzó en 2005 [7] gracias a los esfuerzos de Henning Brower y Ryan McBride . Como parte de este proyecto, PF recibió soporte para un nuevo tipo de reglas de coincidencia , un nuevo esquema para contabilizar el contexto de las conexiones ( los estados en inglés  en la terminología original). Otro cambio importante fue la negativa a separar los conjuntos de reglas por tipo: antes, PF, como IPFilter, tenía conjuntos de reglas separados para NAT y filtrado de tráfico. Además, como parte del desarrollo general de OpenBSD, PF recibió soporte para varias tablas y dominios de enrutamiento .

Arquitectura

PF consta de dos partes: el filtro de paquetes en sí mismo [8] y la utilidad pfctl [9] que proporciona una interfaz para administrar el firewall. El filtro funciona completamente en el contexto del kernel del sistema operativo , la interacción con él se lleva a cabo a través de la llamada al sistema ioctl . [10] Por lo tanto, pfctl no es, estrictamente hablando, una parte necesaria de PF.

PF no está diseñado originalmente para el procesamiento de paquetes de subprocesos múltiples. Por otro lado, la ausencia de bloqueos tiene un efecto positivo en el rendimiento.

Optimización

PF puede omitir comprobaciones innecesarias mientras pasa la lista de reglas. Por ejemplo, si dos reglas seguidas se refieren solo al protocolo TCP , entonces un paquete de cualquier otro protocolo (por ejemplo, UDP ), después de que no se ajuste a la primera regla, no se verificará en la segunda. Para ello, primero, al compilar un conjunto de reglas, pfctl, conociendo el orden óptimo de las comprobaciones, puede cambiar el orden mutuo de varias reglas consecutivas; luego, el conjunto preparado se analiza cuando se carga en PF y para cada regla se compila un mapa de transición para la falta de coincidencia de uno u otro parámetro.

Al optimizar la lista de reglas, PF también puede tener en cuenta las estadísticas acumuladas de la frecuencia de las comprobaciones de las reglas y ajustar el mapa de transición de acuerdo con estas estadísticas.

Cómo funciona

El filtro procesa paquetes de red en uno (cuando envía un paquete desde la misma computadora en la que está instalado el filtro a otra computadora, o viceversa) o dos (cuando se reenvía dentro de la computadora o cuando la computadora con el filtro actúa como una puerta de enlace de red ) ciclo de procesamiento.

El procesamiento real del paquete ocurre de acuerdo con un conjunto de reglas. Al final del procesamiento, el paquete se descarta o se salta. Cada regla consta de un conjunto de condiciones y un conjunto de instrucciones que se ejecutan cuando se cumple el conjunto de condiciones. Hay tres tipos de reglas:

juego Si el paquete cumple las condiciones de la regla, las instrucciones de esta regla se ejecutan inmediatamente. Las reglas de coincidencia se usan comúnmente para NAT, registro de tráfico, QoS , etc. bloquear Si el paquete no cumple las condiciones de la regla, se marca como bloqueable. PF le permite simplemente descartar el paquete o generar un mensaje de error ICMP . pasar Si el paquete cumple las condiciones de la regla, se marca como para pasar más adelante.

Las instrucciones escritas para las reglas de bloqueo y paso se ejecutan después de que se completa el paso a través del conjunto de reglas. Si se marca una regla de bloquear o pasar en consecuencia, si el paquete cumple las condiciones de esta regla, el paso por el conjunto de reglas se interrumpirá con la ejecución de las instrucciones correspondientes. Este orden le permite establecer una serie de reglas que reducen gradualmente el alcance, lo que parece más natural que el orden inverso. Si ninguna regla de bloqueo o de paso coincide, entonces se pasa el paquete: esta es una medida de protección contra un error accidental al configurar el firewall.

Las reglas pueden incluir las siguientes pautas:

normalización ensamblaje de paquetes fragmentados y descartados obviamente incorrectos, así como otras operaciones que simplifican el procesamiento posterior; transmisión redirección de tráfico en las capas 2 (más sutil que lo que pueden proporcionar las herramientas de enrutamiento convencionales ) y 3 del modelo OSI , con soporte para NAT y grupos de direcciones de destino; priorización configuración forzada del tipo de servicio del paquete, colocando el paquete en una u otra cola ALTQ ; filtración tomar la decisión final de pasar o bloquear un paquete de red.

Opciones de filtrado

PF puede filtrar paquetes por los siguientes parámetros:

La última opción le permite crear reglas que se activan "a veces", lo que ayuda a combatir los ataques DDoS (a veces no intencionales) .

Las etiquetas se asignan mediante reglas PF. Cada paquete puede tener como máximo una etiqueta. Puede configurar/reemplazar una etiqueta con una regla, pero no puede eliminar una existente. El paquete retiene la etiqueta durante todo el tiempo que pasa a través de la pila de red.

PF también le permite anular la tabla de enrutamiento utilizada, de modo que los paquetes se puedan transferir entre dominios de enrutamiento. Por supuesto, esto solo tiene sentido para el tráfico entrante, para el cual la ruta aún no se ha determinado por medios estándar.

Puede especificar etiquetas para las reglas . La misma etiqueta puede coincidir con varias reglas. Las etiquetas le permiten identificar mejor las reglas del espacio del usuario, así como deshabilitar la optimización del conjunto de reglas integradas para ciertas reglas; este último puede ser necesario, por ejemplo, para sistemas de facturación.

PF no solo sabe cómo filtrar según el contexto, sino que también admite tres opciones para trabajar en este modo (terminología de la documentación original):

mantener el estado modo simple, solo se recuerda la correspondencia de pares de direcciones de red y puertos; este modo se aplica no solo a TCP, sino también a UDP. modular el estado un modo más complejo en el que PF elige de forma independiente los valores iniciales de los contadores de paquetes TCP; esto proporciona una protección mejorada en los casos en que una de las partes elige los valores de estos contadores que son malos en términos de probabilidad de adivinar. estado de sinproxy en este modo, PF establece de forma independiente una conexión TCP con el otro lado, y solo después de eso, los paquetes correspondientes se envían al iniciador; esto brinda protección contra ataques de inundación SYN que falsifican la dirección del remitente.

De forma predeterminada, todas las reglas de paso tienen en cuenta el contexto (estado de conservación), y las relacionadas con TCP también comprueban las banderas del paquete SYN. Esto se hace porque permite reducir significativamente el volumen de reglas (tanto en términos de su número como en términos de su descripción en el archivo de configuración) en situaciones típicas. Al mismo tiempo, puede rechazar por la fuerza estas funciones para una regla específica o para todo su conjunto. También debe tenerse en cuenta que si el paquete no se encuentra bajo ninguna regla de paso, entonces no se realizan comprobaciones ni creación de contexto.

Tablas de direcciones

Una de las características más interesantes de PF es trabajar con tablas de direcciones:

Por ejemplo, todas las direcciones privadas [11] [12] [13] se pueden ingresar en una tabla en una sola tabla y luego los intentos de conexión desde el exterior desde supuestamente estas direcciones se pueden bloquear con solo una regla.

Además, al utilizar los indicadores de exclusión de direcciones (intervalos de direcciones), es posible especificar la siguiente configuración utilizando solo tres entradas en la tabla: la tabla incluye el intervalo 10.0.0.0/8, excepto 10.0.3.192/26, y también incluye 10.0.3.211. Las entradas correspondientes en la tabla se pueden ingresar en cualquier orden, PF las usará de acuerdo con sus prefijos (máscara de subred).

Los programas de terceros, a través de la llamada al sistema ioctl oa través de la llamada al programa pfctl, pueden manipular el contenido de las tablas. Por ejemplo, el servidor DHCP de OpenBSD  dhcpd (enlace inalcanzable) admite hasta tres tablas PF:

Bloques de reglas

Las reglas se pueden combinar en bloques ( anclajes en la documentación original). En este caso, puede establecer parámetros generales para cada bloque, que serán válidos para todas las reglas del bloque.

Los bloques se procesan a la par que las reglas y se pueden anidar entre sí. Al mismo tiempo, el contenido de los bloques se puede cambiar de forma independiente entre sí, así como de la lista general de reglas. Este último, de hecho, es el mismo bloque.

Los bloques de reglas son convenientes para su uso en programas que de alguna manera controlan los flujos de tráfico. Ejemplos de programas:

Literatura

Notas

  1. http://openbsd.su/src/sys/net/
  2. http://openbsd.su/src/sbin/pfctl/
  3. Comunidad de Wikipedia en inglés Wikipedia  (inglés) - 2001.
  4. Cambios y noticias de NetBSD en 2005 . netbsd.org. Consultado el 4 de febrero de 2020. Archivado desde el original el 17 de enero de 2020.
  5. Notas de la versión de FreeBSD/amd64 5.3-RELEASE . www.freebsd.org. Consultado el 4 de febrero de 2020. Archivado desde el original el 23 de diciembre de 2010.
  6. CORE FORCE Archivado el 6 de mayo de 2009.
  7. Henning Brauer. "Marcador de posición: algo relacionado con OpenBSD" (diapositiva 6) . Archivado desde el original el 14 de febrero de 2012.
  8. pf(4) página del manual (enlace descendente) . Consultado el 6 de octubre de 2008. Archivado desde el original el 25 de noviembre de 2010. 
  9. pfctl(8) página del manual (enlace descendente ) . Consultado el 6 de octubre de 2008. Archivado desde el original el 22 de abril de 2011. 
  10. página de manual de ioctl(2)  (enlace descendente)
  11. RFC 1918 Archivado el 20 de octubre de 2008 en Wayback Machine (direcciones privadas de Internet)
  12. RFC 3927  (enlace descendente) (direcciones para Zeroconf )
  13. IP Filter HOWTO Archivado el 27 de abril de 2006 en Wayback Machine . Contiene una buena lista de direcciones privadas con explicaciones.

Enlaces