Chapter 3. Atravesando tablas y cadenas

En este capítulo hablaremos de cómo atraviesan los paquetes las diferentes cadenas y en qué orden. También analizaremos el orden en que las tablas son atravesadas. Más adelante veremos cuán valioso resulta ésto para escribir nuestras propias reglas. También veremos los momentos en que ciertos componentes, también dependientes del núcleo, entran en escena (por poner un ejemplo, las diferentes decisiones de enrutado). Ésto es especialmente necesario si pretendemos escribir reglas en iptables para poder cambiar las reglas/patrones de enrutado de los paquetes, o sea, si pretendemos conocer el por qué y el cómo los paquetes son enrutados, al hacer por ejemplo DNAT y SNAT. Y por supuesto, no olvidaremos los bits TOS (Type Of Service, o tipo de servicio).

3.1. Generalidades

Cuando un paquete entra en el cortafuegos (firewall), alcanza el hardware y es procesado en el núcleo por su driver correspondiente. Después el paquete empieza a recorrer una serie de etapas en el núcleo antes de ser enviado a la aplicación adecuada (localmente), reenviada hacia otro host, o cualquier otra operación.

En primer lugar, echemos un vistazo a un paquete destinado a nuestro propio host local (nuestra máquina). Recorrerá los siguientes pasos antes de ser entregado a la aplicación que lo requiere:

Table 3-1. Host local de destino (nuestra propia máquina)

EtapaTablaCadenaComentario
1  En los cables (por ejemplo Internet)
2  Llega a la interfaz de red (por ejemplo eth0)
3manglePREROUTINGEsta cadena se usa normalmente para modificar/"deformar" (mangle) paquetes, es decir, cambiar el TOS y cosas así.
4natPREROUTINGEsta cadena se usa principalmente para la traducción de direcciones de red de destino (DNAT, Destination Network Address Translation). Debes evitar filtrar en esta cadena ya que será puenteada (bypassed) o esquivada en ciertos casos.
5  Decisión de enrutamiento, o sea, ¿está el paquete destinado a nuestro host local o debe ser reenviado?, ¿hacia dónde?.
6mangleINPUTEn este punto se alcanza la cadena INPUT de la tabla mangle. Usaremos esta cadena para modificar/"retocar" paquetes después de que hayan sido enrutados, pero antes de que se envíen al proceso de destino.
7filterINPUTAquí es donde filtraremos todo el tráfico entrante destinado a nuestro host local. Ten en cuenta que todo el tráfico entrante pasa a través de esta cadena, sin importar la interfaz por la que entre o de dónde proceda.
8  Proceso/aplicación local (es decir, programa cliente/servidor)

Date cuenta que esta vez el paquete ha atravesado la cadena INPUT en lugar de la cadena FORWARD y ésto es bastante lógico. Lo más probable es que ahora al principio sea lo único que te parecerá realmente lógico acerca de cómo se atraviesan las tablas y cadenas, pero conforme sigas pensando en éllo con el paso del tiempo, lo irás viendo todo aún más claro.

Ahora nos centraremos en los paquetes que salen de nuestro host y las etapas por las que pasan.

Table 3-2. Host local de origen (nuestra própia máquina)

EtapaTablaCadenaComentario
1  Proceso/aplicación local (es decir, programa cliente/servidor)
2  Decisión de enrutamiento. Qué dirección de origen usar, qué interfaz de salida usar, y otra información que necesita ser recopilada.
3mangleOUTPUTAquí es donde se modifican los paquetes; se sugiere que no filtres en esta cadena porque pueden producirse efectos secundarios.
4natOUTPUTEsta cadena puede ser usada para hacer NAT a los paquetes que salen desde el firewall.
5filterOUTPUTAquí es donde filtramos los paquetes salientes de nuestro host local.
6manglePOSTROUTINGLa cadena POSTROUTING de la tabla mangle se usa principalmente cuando queremos modificar los paquetes antes de que dejen nuestro host, pero después de tomar las decisiones de enrutamiento. Esta cadena será alcanzada tanto por los paquetes que atraviesan el cortafuegos, como por los generados por él mismo.
7natPOSTROUTINGAquí es donde efectuamos la traducción de las direcciones de red de origen (SNAT, Source Network Address Translation) como ya se ha descrito anteriormente. Es conveniente que no filtres en esta cadena ya que pueden producirse efectos secundarios y determinados paquetes podrían colarse incluso aunque se haya establecido la política DROP (desechar) como política por defecto.
8  Sale al exterior por alguna interfaz (por ejemplo, eth0)
9  En los cables (por ejemplo, Internet)

En este ejemplo estamos asumiendo que el paquete está destinado a otro host de otra red. El paquete sigue los siguientes pasos, de esta manera:

Table 3-3. Paquetes Reenviados (Forwarded)

EtapaTablaCadenaComentario
1  En los cables (es decir, Internet)
2  Llega hasta la interfaz de red (es decir, eth0)
3manglePREROUTINGEsta cadena se usa normalmente para modificar paquetes, o sea, para cambiar el TOS y acciones similares.
4natPREROUTINGEsta cadena se usa principalmente para hacer DNAT (traducción de dirección de destino). El SNAT (traducción de dirección de origen) se realiza más adelante. Debes evitar filtrar en esta cadena ya que en ciertos casos será puenteada o esquivada.
5  Decisión de enrutamiento, o sea, ¿el paquete está destinado a nuestro propio host local, o debe ser reenviado?, ¿hacia dónde?.
6mangleFORWARDEl paquete es enviado a la cadena FORWARD de la tabla mangle. Ésto puede aprovecharse para necesidades muy específicas dónde queremos modificar paquetes después de la decisión de enrutamiento inicial, pero antes de la última decision de enrutamiento, hecha justo antes de que el paquete sea enviado.
7filterFORWARDEl paquete es enrutado hacia la cadena FORWARD. Solamente los paquetes reenviados pasan por aquí y es donde hacemos todo el filtrado. Ten en cuenta que todos los paquetes reenviados (en cualquier dirección) pasan por aquí, así que necesitarás pensar en éllo cuando escribas tu conjunto de reglas.
8manglePOSTROUTINGEsta cadena se usa para efectuar los tipos específicos de modificación de paquetes (packet mangling) que queramos llevar a cabo después de que todos los tipos de decisiones de enrutamiento se hayan tomado, pero estando el paquete aún en esta máquina.
9natPOSTROUTINGEsta cadena debe ser usada principalmente y sobretodo para efectuar SNAT. Debes evitar filtrar aquí ya que ciertos paquetes podrían "pasar por delante" de la cadena sin ni siquiera rozarla. Aquí es también dónde se realiza el enmascaramiento (Masquerading).
10  Sale por la interfaz de salida (por ej. eth1).
11  En los cables de nuevo (es decir, la red local).

Como puedes ver hay bastantes pasos que dar. El paquete puede ser bloqueado en cualquiera de las cadenas de iptables o en algún otro sitio si está malformado; sin embargo, estamos principalmente interesados en la parte relacionada con iptables. Ten en cuenta que no hay cadenas o tablas específicas para interfases diferentes ni nada por el estilo. La cadena FORWARD es siempre atravesada por todos los paquetes que son reenviados a través de este cortafuegos/router.

Caution

¡No uses la cadena INPUT para filtrar en el escenario anterior! INPUT está pensada sólamente para nuestro host local, no para hacer enrutamientos a ningún otro destino.

Hemos visto hasta ahora cómo las cadenas son atravesadas en tres escenarios independientes. Si deseáramos hacer un buen esquema de todo ésto, podría asemejarse a algo como:

Para aclarar esta imagen considera lo siguiente: si llega un paquete que no está destinado a nuestra máquina local, en la primera decisión de enrutamiento será dirigido hacia la cadena FORWARD. Por otra parte, si el paquete está destinado a una dirección IP que está siendo escuchada por nuestra máquina local, el paquete sería enviado a la cadena INPUT y después a la máquina local.

También conviene advertir el hecho de que los paquetes pueden estar destinados a la máquina local y, sin embargo, la dirección de destino ser modificada por la cadena PREROUTING haciendo NAT. Dado que ésto tiene lugar antes de la primera decisión de enrutamiento, el paquete será revisado tras dicho cambio. Debido a ésto, el camino a seguir por el paquete (debido a una modificación de la IP de destino) podría cambiar antes de que la decisión de enrutamiento sea tomada. Date cuenta que todos los paquetes irán a través de un camino u otro de esta imagen. Si haces DNAT devolviendo el paquete a la misma red por la que vino, seguirá viajando por el resto de cadenas hasta que regrese a dicha red.

Tip

Si crees que necesitas más información puedes usar el script rc.test-iptables.txt. Este script "de laboratorio" debería proporcionarte las reglas necesarias para comprobar cómo son atravesadas las tablas y las cadenas.