martes, 4 de mayo de 2010

Introducción a las Iptables -Entendiendo las Reglas-

iptables permite al administrador del sistema definir reglas acerca de qué hacer con los paquetes de red. Las reglas se agrupan en cadenas: cada cadena es una lista ordenada de reglas. 
 
Las cadenas se agrupan en tablas: donde cada tabla está asociada con un tipo diferente de procesamiento de paquetes.
 
Cada regla especifica qué paquetes la cumplen (match) y un destino que indica qué hacer con el paquete si éste cumple la regla. Cada paquete de red que llega a una computadora o que se envía desde una computadora recorre por lo menos una cadena y cada regla de esa cadena se comprueba con el paquete. Si la regla cumple con el datagrama, el recorrido se detiene y el destino de la regla dicta lo que se debe hacer con el paquete. Si el paquete alcanza el fin de una cadena predefinida sin haberse correspondido con ninguna regla de la cadena, la política de destino de la cadena dicta qué hacer con el paquete. Si el paquete alcanza el fin de una cadena definida por el usuario sin haber cumplido ninguna regla de la cadena o si la cadena definida por el usuario está vacía, el recorrido continúa en la cadena que hizo la llamada (lo que se denomina implicit target RETURN o RETORNO de destino implícito). Solo las cadenas predefinidas tienen políticas.
Bueno, ya tenemos las bases, ahora vamos a la practica....

Primero lo primero....

veamos como esta configurado nuestro iptales...

# iptables -L

El parametro -L lista las reglas que actualemente tenemos

Bien, ya sabemos nuestras reglas, hagamos un cambio sencillo, convirtamos nuestro equipo en un agujero negro algo asi como /dev/null

# iptables -P OUTPUT DROP

Con esto lo que hemos hecho es modificar la politica por defecto de todo el trafico saliente, y esto incluye aquel que no avandona la maquina por eso se afecta nuestro localhost... podemos probar esta regla simplemente haciendo un ping al localhost y/u otra dirección

Ahora, esto no es lo mas optimo... lo que hemos hecho, es incluso superior a desconectar nuestro cable de red.... asi que mejor coloquemos todo como estaba si....

# iptables -P OUTPUT ACCEPT

-P = nos permite modificar las politicas por defecto, estas pueden ser ACCEPT o DROP, con este especificamos si vamos a tener un firewall abierto o cerrado.

Creando nuestras primeras reglas...

Primero que nada una prueba, has ping al localhost.... hay trafico ???? bien vamos a cerrarlos, para ello simplemente ejecutamos:

# iptables -A input -i lo -j drop

Listo, ahora nuevamente un ping a localhost.... No funciona... Hummm probemos con un ping a otra pag... google.com funciona ?????

Ahora bien, Localhost es un lugar de pruebas útil, por lo que tenerlo cerrado no es la mejor de las ideas, vamos a restaurar todo, para ello ejecutemos:

# iptables -D input -i lo -j DROP

-A = Agregar una regla a la Iptables
-D = Eliminar una regla de la Iptables
-i = identifica el dispositivo objeto de la regla
-j = identificamos que vamos a hacer con el trafico que coincida con la regla

Pero esto es solo una pequeña muestra de lo que es posible hacer con iptables, en lugar de especificar un dispositivo, podemos ser mas detallados y aplios (por contradictorio que suene si es asi) al indicar protocolos y puertos como targets, pero mejor veamos una prueba...

Primero que nada ubiquemos otra maquina y probemos que podemos conectarnos vía ssh con ella:

$ ssh usuario@equipo

indicamos la contraseña para el usuario cuando el sistema nos lo solicite y listo, si todo va bien estamos dentro del otro equipo si.... bueno dejemos esa session alli..


ahora si, a lo que vamos, apliquemos una regla de iptables para el ssh:

# iptables -A INPUT -p tcp --sport 22 -j DROP

listo, bien.... Regresemos a nuestra consola con el ssh y probemos ejecutar cualquier comando, listemos archivos por ejemplo (ls)...

Que ocurrio ???? Tienes alguna idea ????

retornemos a la segunda consola (la que manejamos para iptables) y ejecutemos ahora:

# iptables -A INPUT -p tcp --sport 22 -j DROP

vamos a la consola con la sesion ssh y ejecutemos otro comando... que ocurre ????

Nota: el resultado puede verse afectado si hemos tardado mas de 1 minuto para ejecutar los pasos...

Entendamos la cosa: En este ejemplo hemos cerrado el trafico entrante (INPUT) del protocolo ssh, especificado el target de la regla con el -p (protocolo) + el --sport (puerto Origen), de esta misma forma, también es posible aplicar reglas para el trafico saliente (OUTPUT) y para cualquier otro servicio...

Con iptables, tambien es posible crear reglas que atiendan las direcciones de los paquetes, como ??? veamoslo de la manera mas sencilla... Un ejemplo:

Abramos un navegador y vallamos a la pagina mas usada en la actualidad google.com Si tenemos habilitadas las políticas por default's seguro tendremos acceso y nuestra pagina cargara.

Ahora, vamos a la terminal y cerremos el trafico a google:

# iptables -A OUTPUT -p tcp -d google.com --dport 80 -j DROP

Bien, regresa al navegador e intenta nuevamente acceder a google.com, funciona ????

Lo que hemos hecho es especificar una regla que descarta el trafico tcp saliente (OUTPUT) destinado (-d) al servidor google.com específicamente al puerto 80 (--dport 80), pero ocurre que esta regla no afecta a otro trafico similar destinado a otro servidor...

Es importante recordar, que estas reglas se van a mantener mientras dure la sesion actual salvo que elimines la regla, algo que ya hemos hecho antes y que estoy seguro puedes hacer tu solo verdad....

Con Iptables no solo es posible especificar reglas para descartar paquetes, podemos tambien llevar registros sobre el sistema los cuales se almacenaran en el /var/log/messages. Para habilitar reglas que habiliten la escritura en el registro lo que debemos hacer es especificar el -j LOG en la regla.

Veamos estas reglas en un ejemplo... Supongamos que queremos llevar un registro de conexiones a nuestro ssh, para ello ejecutamos:

# iptables -A INPUT -p tcp --dport 22 -j LOG

bien, ahora vamos a otra maquina y realicemos una una conexión ssh al sistema al cual le aplicamos la regla.... y listo, nuestro acceso ha quedado registrado...

Podemos aplicar esta regla a cualquier servicio o dispositivo, solo tenemos que tomar en cuenta que por cada transaccion que se este ejecutando al aplicar la regla de esta forma varias lineas se estan agregando en el log del sistema y esto puede no ser lo mas optimo, por ello, vamos a mejorar esta regla.

Veamos el registro en LOG para el servicio FTP...

# iptables -A INPUT -p tcp --dport 21 -j LOG

Una linea igual a la que ya habíamos introducido antes pero que nos registra los accesos a FTP, al igual que el caso anterior, nos generaría muchas lineas en el log por cada conexión... y además nos da la oportunidad de ir mas allá si no tenemos un FTP montado en nuestro sistema....

Si no contamos con un servidor ftp en nuestro sistema ejecutemos dmesg y veamos la ultima linea, la entienden.... El servicio de ftp también nos permite ver lo que ocurre si no somos lo suficientemente específicos al crear una regla de almacenamiento en log, una linea como la especificada en un acceso generaría cantidad de lineas que no son para nada útiles en un log (lo hacen muy largo y tortuoso de leer y no es la idea).

Lo ideal es que se registre el cliente una sola vez y no cada vez que este gestione un paquete, para lograr esto, lo que tenemos que hacer es considerar el comienzo del segmento de la conexion ya que este tiene activo el Flag SYN.

Al hacer esto, la linea queda así:

# iptables -­A INPUT -­p tcp --­­dport 21 --­­tcp-­flags ALL SYN -­j LOG

Nota: se debe eliminar la linea anterior.... (# iptables -D INPUT -p tcp --dport 21 -j LOG)

Pero como no tenemos un FPT activo en nuestra maquina no veremos nada.... salvo la misma alerta en nuestro dmseg y esta no es la idea... para poder ver como funciona la linea, vamos a quitarla y a cambiarla por una que nos registre cada vez que nos conectamos a ftp...

# iptables -A OUTPUT -p tcp --dport 21 --tcp-flag ALL SYN -j LOG

Lo primero que tenemos que notar es que cambiamos la regla para crear una entrada en log para la salida de paquetes... Ahora probamos la linea conectandonos a un ftp (ftp://debian.org -p.e-) y luego mirando el log de iptables.... Mejor verdad...

No hay comentarios: