Página siguiente Página anterior Índice general

3. La arquitectura de Netfilter

Netfilter es meramente una serie de ganchos en varios puntos de la pila de un protocolo (a estas alturas IPv4, IPv6 y DECnet). El diagrama de recorrido (idealizado) de IPv4 se parece a lo siguiente:

Un paquete atravesando el sistema Netfilter:

   --->[1]--->[ROUTE]--->[3]--->[4]--->
                 |            ^
                 |            |
                 |         [ROUTE]
                 v            |
                [2]          [5]
                 |            ^
                 |            |
                 v            |

Los paquetes entran desde la izquierda: tras haber pasado las sencillas comprobaciones de sanidad (es decir, no está truncado, la suma de control IP es correcta y no es una recepción promiscua), son pasados al gancho NF_IP_PRE_ROUTING [1] del sistema netfilter.

Luego entran en el código de enrutamiento, que decide si el paquete está destinado a otra interfaz o a un proceso local. El código de enrutamiento puede rechazar paquetes que no se pueden enrutar.

Si está destinado a la propia máquina, se llama de nuevo al sistema netfilter para el gancho NF_IP_LOCAL_IN [2], antes de ser enviado al proceso (si hay alguno).

Si, en cambio, está destinado hacia otra interfaz, se llama al sistema netfilter para el gancho NF_IP_FORWARD [3].

Luego el paquete pasa por un gancho final, el gancho NF_IP_POST_ROUTING [4], antes de ser enviado de nuevo al cable.

Para los paquetes creados localmente, se llama al gancho NF_IP_LOCAL_OUT [5]. Aquí puede ver que el enrutamiento ocurre después haber llamado a este gancho: de hecho, se llama primero al código de enrutamiento (para averiguar la dirección IP y algunas opciones IP), y luego se le llama otra vez si el paquete ha sido alterado.

3.1 La base de Netfilter

Ahora que tenemos un ejemplo de netfilter en IPv4, ya puede ver cuándo se activa cada gancho. Ésta es la esencia de netfilter.

Uno o varios módulos del kernel pueden registrarse para escuchar en alguno de estos ganchos. Luego, cuando se llama al gancho de netfilter desde el código de red, los módulos registrados en ese punto tienen libertad para manipular el paquete. Un módulo puede decirle a netfilter que haga una de estas cinco cosas:

  1. NF_ACCEPT: continúa el recorrido normalmente.
  2. NF_DROP: rechaza el paquete; no continúes el recorrido.
  3. NF_STOLEN: me hago cargo del paquete; no continúes el recorrido.
  4. NF_QUEUE: pon el paquete en una cola (normalmente para tratar con el espacio de usuario).
  5. NF_REPEAT: llama de nuevo a este gancho.

Las otras partes de netfilter (manejo de paquetes en la cola, comentarios útiles) se cubrirán luego en la sección del kernel.

Sobre esta base, podemos construir manipulaciones de paquetes bastante complejas, como se muestra en las dos próximas secciones.

3.2 Selección de paquetes: IP Tables

Se ha construido una sistema de selección de paquetes llamado IP Tables sobre el sistema netfilter. Es un descendiente directo de ipchains (que vino de ipfwadm, que vino del ipfw IIRC de BSD), con extensibilidad. Los módulos del kernel pueden registrar una tabla nueva, e indicarle a un paquete que atraviese una tabla dada. Este método de selección de paquetes se utiliza para el filtrado de paquetes (la tabla `filter'), para la Traducción de Direcciones de Red (la tabla `nat') y para la manipulación general de paquetes antes del enrutamiento (la tabla `mangle').

Filtrado de Paquetes

Esta tabla, `filter', nunca altera los paquetes: sólo los filtra.

Una de las ventajas de iptables sobre ipchains es que es pequeño y rápido, y se engancha a netfilter en los puntos NF_IP_LOCAL_IN, NF_IP_FORWARD y NF_IP_LOCAL_OUT. Esto significa que para cualquier paquete dado, existe un (y sólo un) posible lugar donde pueda ser filtrado. Esto hace las cosas mucho más sencillas. Además, el hecho de que el sistema netfilter proporcione las dos interfaces de entrada (input) y salida (output) para el gancho NF_IP_FORWARD significa que hay bastantes tipos de filtrado que se simplifican mucho.

Nota: He portado las porciones del kernel de ipchains e ipfwadm en forma de módulos sobre netfilter, permitiendo el uso de las viejas herramientas de usuario ipfwadm y ipchains sin que se requiera una actualización.

NAT

Esto es el reino de la tabla `nat', que se alimenta de paquetes mediante tres ganchos de netfilter: para los paquetes no locales, los ganchos NF_IP_PRE_ROUTING y NF_IP_POST_ROUTING son perfectos para las alteraciones en el destino y el origen, respectivamente. Para alterar el destino de los paquetes locales, se utiliza el gancho NF_IP_LOCAL_OUT.

Esta tabla es ligeramente distinta a la tabla `filter' en el sentido de que sólo el primer paquete de una conexión nueva atravesará la tabla: el resultado de este recorrido se aplica luego a todos los paquetes futuros de la misma conexión.

Enmascaramiento, redireccionamiento de puertos y proxys transparentes

Divido NAT en NAT de Origen (en el que se altera el origen del primer paquete), y NAT de Destino (en el que se altera el destino del primer paquete).

El enmascaramiento es una forma especial de NAT de Origen; el redireccionamiento de puertos y los proxys transparentes son formas especiales de NAT de Destino. Ahora todas se hacen utilizando el sistema NAT, en vez de ser entidades independientes.

3.3 Seguimiento de conexiones

El seguimiento de conexiones es fundamental para NAT, pero está implementado en un módulo aparte; esto permite una extensión del filtrado de paquetes para utilizar de manera limpia y sencilla el seguimiento de conexiones (el módulo `state').

3.4 Otros añadidos

La nueva flexibilidad nos da la oportunidad de hacer cosas realmente chulas, y permitir a la gente que escriba mejoras o complete recambios, que pueden mezclarse y combinarse.


Página siguiente Página anterior Índice general