NetFilter / IPTables III

Antes de comenzar te recomiendo que también visites lo siguientes posts ( NetFilter / IPTables I , II, IV, V)

NetFilter el manipulador

El diseño de NetFilter puede parecer un poco complejo si no se tiene un conocimiento completo del manejo de las tablas, y se pierde mucho si no se sabe todas las opciones que existen, por lo que revisaremos el funcionamiento de cada tabla, para saber que y como podemos hacer cada cosa.

Las otras ‘tables’ de iptables

Ya habíamos dicho que existen 4 tablas (filter, nat, mangle y raw), filter es la mas común, y se la suele obviar cuando usamos iptables, y nat la usamos cuando teniamos que ‘enmascarar’ una conexion, lo que comunmente se llama natear (actuar como router), pero ni por asomo sule mencionarse las otras 2 tablas, de hecho, muchas personas ni saben que existen, y los que lo saben, tienen entendido que son ‘tablas de un uso especial’.
Trataremos de desmitificarlas aquí!

Filter
Esta tabla, tiene a su cargo, la responsabilidad de filtrar TODOS los paquetes que el sistema maneje.
Para su uso, existen 3 cadenas predefinidas:

INPUT: Todos los paquetes, que ingresen al host deberan atravezar esta cadena
OUTPUT: Todos los paquetes generados por el host, con destino saliente, deberan atravezarla
FORWARD: Todos los paquetes que ingresen al host con el fin de atravezarlo como pasarela (gateway) seran controlados por esta cadena.

Como veran, a esta tabla, ‘no se le escapa nada’, desde ella se puede filtrar de forma eficiente cualquier paquete, sin embargo, aveces, filtrar no es suficiente, y necesitamos ‘manipular’ los paquetes de red…

Nat

La tabla Nat, se hace responsable de manipular, configurar o reescribir las direcciones y puertos de los paquetes, antes de que los paquetes ‘entren’ y ‘salgan’ del host.
Como es esto posible?
Bueno, obviamente, esta tabla no hace magia y modifica los paquetes mientras aun están en el cable de red, si no, a lo que nos referimos, es que antes que el paquete sea filtrado por la tabla filter (FORWARD), podra manipularse desde la tabla Nat, con las siguientes cadenas.

PREROUTING: Los paquetes atraviezan esta cadena antes que tengan que atravezar la tabla local (filter) y desde aqui se pude cambiar la dirección de destino e incluso el puerto. Como ejemplo, podemos decir que si entra un paquete destinado a la ip 192.168.1.2 puerto 80, podemos redirigirlo a la ip 192.168.1.3 puerto 8080, cosa muy útil para los firewalls que hacen DMZ (conocido como Destination NAT)

OUTPUT: Figurita repetida? Si Esta es la misma cadena que en la tabla filter, solo que desde la tabla nat podremos, como ya dijimos, manipular los paquetes.
En este caso, no hablamos de paquetes que esten siendo encaminados por el host, si no los paquetes de origen local, y a estos podremos aplicarles una redireccion (cambio de direccion de orgine) al igual que en la cadena PREROUTING.

POSTROUTING: Como dice su nombre, pasado el routeo de la tabla filter, esta es la ultima cadena a atravezar, y sirve para modificar la dirección y puerto de origen.
Ejemplos? Si un paquete a atravezado el host, y se dirige hacia un host en internet, y lleva como direccion de origen (por ejemplo una privada) y queremos cambiarsela, usaremos esta cadena.
Esto es super usado, por todos los que usan ADSL y hacen NAT, ya veremos por que.

Para acentuar un poco esto del ‘NAT’ y sus cadenas observemos un poco…

#Redireccionaremos todo el trafico web a un proxy cache (Destination NAT)
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.99:8080

#Tenemos a nuestro firewall con una ip fija, y hemos habilitado el router, pero si solo habilitamos
#el routeo, los paquetes salen hacia internet con una direccion de origen de una red privada,
#por lo que cambiamos la dirección de origen antes de que salga, por nuestra dirección ip pública
iptables -t nat POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT –to-source 200.34.43.3x

Ahora bien, en este último ejemplo, funcionaría siempre y cuando tengamos una IP estática, sin embargo, muchos (la gran mayoria) utiliza ADSL para conectarse a internet, por lo cual, si nuestra IP cambiara, esto no funcionaría. Para lo cual, NetFilter diseño un tipo de SNAT especial: MASQUERADE

iptables -t nat POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Masquerade, significa, que haga SNAT con la dirección ip que tenga asignada la interfaz de red, por la cual saldrá el paquete, por lo cual, si nuestra dirección de internet cambia, automaticamente los paquetes saldran con el SNAT correcto.

Mangle

Ahora si, ya entramos en un camino hacia una comprensión un poco mas importante del funcionamiento de NetFilter.

Observemos que si ejecutamos ‘iptables -t magle -L’, veremos que esta tabla parece poseer, todos las cadenas de las tablas anteriores, y asi es. Por que esta tabla, es omnipresente.
Mangle, utiliza cada una de las cadenas, para modificar ciertos parámetros antes que filter o nat lean esa cadena.
Es decir que, si un paquete ingresa para ser routeado, antes que ingrese al PREROUTING de NAT, ingresa ‘al PREROUTING’ de MANGLE, y desde alli, puede ser modificado. Lo mismo sucederá con todas las demas cadenas,

Si esto no te queda 100% claro, es entendible, pero tampoco es tan complicado si seguiste todo hasta aquí, pero si no estas seguro de tus ideas, te ofrezco un gráfico para que te quedes tranquilo.

Tablas y cadenas
Tablas y cadenas

Pero.. un ejemplo práctico?

Ok, a ver si esto te convence:
(advertencia: para entender lo que hacemos aquí deberás conocer conceptos acerca del manejo de los protocolos a vajo nivel, para lo que te recomiendo que leas los RFC correspondientes)

#Cambiamos el TOS (Type Of Service)

iptables -t mangle -A PREROUTING -s 192.168.0.1 -i eth0 –dport 1950  -j TOS –set-tos 0x10

#TCPMSS

iptables -t mangle -A FORWARD -p tcp -j TCPMSS –clamp-mss-to-pmtu

#Cambiar el TTL

iptables -t mangle -A FORWARD -d 0.0.0.0/0 -i eth0 -p tcp –dport 1234 -j TTL –ttl-set 1
#Bueno… cada uno sabe lo que hace no?

En fin hay varias opciones que podemos cambiar con la tabla mangle, pero no podemos detenernos en cada una de ellas, lo importante es ver, que desde ella se puede modificar ciertos aspectos de los paquetes de red, insisto nuevamente hay mucha info en el man de iptables.

raw

Esta es una tabla nueva, y no tiene mucha variedad de uso, pero no puedo limitarme a decir, simplemente que es ‘de un uso especial’, pero si he de recalcar, no que la mayoria de los kernels no la poseen ecepto que esten parcheados.

Esta tabla, existe para un solo objetivo: NOTRACK
Vale aclarar algo: NetFilter y el Kernel en si, tienen un control de las conexiones, por ejemplo no es lo mismo, que una conexión TCP, este en estado NEW (cuando se manda el SYN y se espera el SYN/ACK), que este en ESTABLISHED (cuando se recibe el SYN/ACK y se envia el SYN de respuesta).
Todo esto lo vigila NetFilter, tanto en tcp, como udp, e icmp, ahora, esto conlleva un gasto significativo de recursos, cuando hablamos de muchas conexiones simultaneas.

Para que NetFilter no lleve ese control, y economice recursos, quizas querramos que ciertas conexiones no las ‘vigile’, para lo cual podriamos usar esta tabla:

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -j NOTRACK

El problema deveniente es que no podremos controlar las conexiones que se establescan de esta forma.

Y hasta ahora solo estamos viendo lo ‘bàsico’ de iptables, y aun queda mas de lo ‘bàsico’, por lo que no te pierdas el proximo articulo sobre este mounstruo del filtrado!

4 respuestas to “NetFilter / IPTables III”

  1. Cash 5 Says:

    Gracias por el ejemplo gráfico, asi se aprecia mejor la idea.

  2. WeightliftingSupplement Says:

    interesante!

  3. NetFilter / IPTables V « NetVulcano Says:

    […] de comenzar te recomiendo ver los post anteriores ( NetFilter / IPTables I, II, III, IV) Finalmente podemos entrar en este tema, del cual no se suele hablar mucho, y sin embargo, a mi […]


Deja un comentario