NetFilter / IPTables I

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

NetFilter el grande

Los firewalls, son una parte fundamental de la seguridad, en los sistemas operativos de hoy en día, ya que las redes son parte fundamental de los sistemas computacionales.
En este caso revisaremos el caso de uno de los mejores firewalls por software existentes: NetFilter
NetFilter, es el sistema de filtrado de paquetes de los Kernels Linux de la rama 2.4 y 2.6, y para mucha mas info, podes pasar por www.netfilter.org

Por que escribir un artículo mas sobre iptables
?
Simplemente por que no encontré alguno que lo explique como a mi me hubiese gustado.
Otra razón, es por que uno termina aprendiendo mucho mas.
Para una guia mas rápida, con muchos ejemplos recomiendo el artículo de bulma

Este sistema está basado en el manejos de tablas, el cual se administra desde la aplicación iptables.
Esta aplicación configura todas las reglas de filtrado, pero no es en si mismo el firewall, esto es importante de destacar, ya que no tenemos un proceso corriendo para administrar los paquetes, si no que iptables administra las reglas que el kernel maneja. Así, no corremos el peligro de que el programa si cuelgue o contenga un bug y termine por ser una puerta trasera, en lugar de ser una protección.
Es cierto que nada es perfecto, si embargo hasta el momento, no he escuchado de ninguna vulnerabilidad que haya puesto en vilo la seguridad de los servidores protegidos con Netfilter.
Vale recalcar, que Netfilter pertenece a la lista de 100 herramientas de seguridad mas importantes según Insecure.org.

Comencemos:

Decíamos que iptables maneja las tablas de filtrado del kernel, y, cada tabla contiene una serie de instrucciones condicionales (reglas).
Un ejemplo sería:

Tabla_1
Si proviene del puerto 2934 con destino al puerto 80 aceptar
Si proviene de la ip 200.32.xxx.xxx rechazar
Si proviene de la ip 201.9.xxx.xxx rechazar

Cuando comparamos un paquete (de red) con esta tabla, lo haremos hasta encontrar la primer coincidencia, y dejaremos comparar.

Si para este ejemplo enviamos un paquete proveniente del puerto 2000, desde la ip 200.32.xxx.xxx (la misma del ejemplo), compararía regla por regla de la siguiente forma:

Si proviene del puerto 2934 con destino al puerto 80 aceptar = Falso / no cumple
Si proviene de la ip 200.32.xxx.xxx rechazar = Verdadero
Fin de comprobaciones

Lo que aca vemos, es que al no cumplir con la primer regla de la tabla, prosigue con la siguiente, y asi seguiría mientras no cumpla con ninguna regla (de forma completa). En este ejemplo, cumple todas las condiciones de la segunda regla, por lo cual, no comprueba la tercera y rechaza el paquete.
Podemos deducir, que es de suma importancia el orden en el cual colocaremos las reglas ya que, si colocamos reglas muy generales al principio, se parará la comparación en esa regla y quizas no filtremos como lo deseamos.

Esta forma de filtrado nos permitirá (por lo contrario de lo que suele parecer al principio) mucha flexibilidad.

Veamos un poco mas:

Cada tabla, no es solo una lista de instrucciones a revisar, si no que cada tabla tiene ‘Cadenas’, algunas predefinidas, y otras a definir por el usuario. Para aclarar, podemos decir, que las reglas se listan en cadenas, las cuales, se agrupan dentro de las tablas.
TABLA_1
Cadena_1
Regla_1
Regla_2
Regla_3

Regla_x
Cadena_2
Regla_1
….

Pero antes de ver mas teoría de esto, empecemos a visualizar y toquetear un poco.

Como dijimos netfilter se maneja mediante tablas, y estas son manejadas por iptables, ergo, para configurar las tablas y cadenas de nuestro firewall usaremos este poderoso comando.

Ejemplo 1
#iptables -t filter -L

Si no tienes configurado, ningún script para iptables, veras lo siguiente:

Ejemplo 2

Chain INPUT (policy ACCEPT)

target     prot opt source      destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Analizando todo

Usamos iptables con la opcion “-t filter”. La opción -t nos permite seleccionar una tabla en particular. En este caso “filter”, es la tabla mas común, o principal, ya que es por donde pasan todos los paquetes, sin embargo, existen otras, y estas son: raw, mangle,  y nat.

Si son curiosos y no se aguantan, pueden hacer un man iptables y seguir investigando mas.

La opcion -L, permite listar una cadena particular o bien lista todas las existentes en la tabla, como lo hicimos en este caso. Por lo que vemos que dentro de la tabla, existen tres cadenas: INPUT, FOWARD y OUTPUT.

Cada una de estas cadenas, tienen una política por defecto, lo que significa, que si el paquete comparado, con una cadena, no coincide con ninguna regla, se aplica la política de la cadena. En el ejemplo anterior, podemos ver que en cada cadena aparece “(policy ACCEPT)”, por lo cual, como decíamos, si un paquete no coincide con ninguna regla de la cadena, se ACCEPTa (je).

Para establecer otra política por defecto usamos “-P”:

#iptables -t filter -P INPUT REJECT

De esta manera, por ejemplo, indicamos a netfiltes, que REJECTe (jeje) por defecto todo lo que entre (INPUT) al host. Luego deberiamos ingresar reglas en la cadena INPUT, para que deje pasar ciertas cosas o no tendríamos conexión con nada! (lo vemos mas adelante)

– Todavía no me mostraste como modificar nada y eso es aburrido!

Ok, si te gusta la acción podes experimentar con esta regla y de paso tratar de deducirla antes de seguir leyendo:

iptables -t filter -A INPUT  -p tcp --source-port 2934 --destination-port 80 -j ACCEPT

Como ya vimos, -t filter, sirve para seleccionar con que tabla que trabajaremos, en este caso, al ser la tabla filter, la tabla por defecto, podemos obviarla y usar “iptables -A INPUT –source-p….”.

Lo siguiente que vemos, “-A INPUT” sirve para ingresar una regla en una cadena, en este caso “INPUT”.  Por defecto, todo lo que entra al host (con destino al host). Así mismo, todo lo que sale del host (con cualquier destino, pasa por la cadena OUTPUT), y todo lo que ingresa al host con destino de ser reenviado, se compara con la cadena FORWARD.
En el ejemplo usamos “-A”, esta opción ingresa una regla al final de las reglas de la cadena, pero como pudimos ver, es muy importante el orden en que se introducen las reglas, ya que, cuando encuentra la primera coincidencia, dejará de comparar. Existe otra opción, “-I” con la cual, la regla se inserta en la primer posición de la cadena.
Pero además iptables nos permite ingresar las reglas por número de orden, sin embargo, para eso podes remitirte al man de iptables.
Las siguientes opciones son faciles de deducir:

-p tcp : Coincide si el paquete es un paquete TCP
–source-port : Coincide si el puerto de origen del paquete es 2934
–destination-port : Coincide si el puerto de destino es 80

y finalmente, “-j” establece el objetivo, es decir, que es lo que se hará con el paquete si coincide con dicha regla, las opciones predefinidas, son : ACCEPT (Aceptar el paquete) REJECT (Rechaza el paquete enviando un mensaje ICMP de que fue rechazado), DROP (obvia el paquete, es decir, lo rechaza sin avisar de que lo rechazó).
Existen otros objetivos predefinidos, pero por ahora conviene ver solo estos.
Además de las opciones predefinidas, se pueden poner como objetivos una cadena de la misma tabla.

Muy bien, estas son las cuestiones básicas de iptables, solo nos falta ver otras opciones que podemos ingresar en una regla, para poder empezar a tirar unas lineas y comprender varios scripts de iptables que andan dando vuelta.

Pequeño Laurouse Ilustrado de Iptables:


–source : Dirección de origen (ip o rango de red)
–destination : Destino del paquete (ip o rango de red)
–in-interface : Interface de red por donde ingresa el paquete (eth1, wlan0 …)
–out-interface : Interface por donde sale el paquete (lo mismo eth1, wlan0…)
–fragment : Aplica la regla a los fragmentos sucesivos al primero

y las opciones q vimos antes:
–protocol : Protocolo con el que debe coincidir la regla, puede ser tcp, udp, icmp o all
–source-port : Coincide si el puerto de origen del paquete es el indicado
–destination-port : Coincide si el puerto de destino es el indicado

A todas estas opciones se les puede agregar un ! para indicar lo contrario, por ejemplo si usamos “-p ! tcp”, estamos indicando todos los protocolos que no sean tcp, o si indicamos “-s ! 10.0.0.0/24”, la regla coincide solo si el paquete no proviene de la red 10.0.0.0/24.

Ahora si ya podemos escribir algunas lineas concienzudamente:
Pongamos un ejemplo común: un servidor web, el cual queres manejar remotamente mediante ssh desde una ip en particular, y acceso a ftp desde la red interna.

Si es un servidor web, debemos dejar el puerto 80 abierto
Si queremos dejar el servidor ssh para la administración habilitamos el puerto 22 para nuestra ip
y para el ftp habilitamos el puerto 21

Lo más común es establecer un política por defecto cerrada y abrir lo que haga falta:

iptables -P INPUT REJECT
iptables -A INPUT -p tcp -s 0.0.0.0/0 -dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 204.54.45.x -dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.6.0/24 -dport 21 -i eth1 -j ACCEPT

Primero habrán observado, que no uso “-t filter” , y es que como dije antes, la tabla “filter” es la tabla por defecto, y se puede obviar. Así mismo, uso -dport en lugar de –destination-port, y es por que esta es la opción recortada de la misma.

Bueno, aunque hay pocas cosas prácticas, suficiente por hoy, espero que les sirva.

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Anuncios

Una respuesta to “NetFilter / IPTables I”

  1. cmontedonico Says:

    Muy buen articulo, siempre es bueno tener configurado correctamente el firewall, a mi me gusta mucho usar IPTABLES y estaba buscando algo así como lo que escribiste para explicar mejor su funcionamiento.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: