El blog de Alejandro Meroño

El blog de Alejandro Meroño Hernández

Iptables, cortafuegos en GNU/Linux  

Iptables es una herramienta de cortafuegos que permite filtrar paquetes y realizar traducción de direcciones NAT. Iptables se encuentra integrado en el kernel de Linux, por lo que no es necesario instalar ningún software adicional para utilizarlo.

Iptables permite definir reglas para los paquetes que llegan a nuestra máquina. El kernel de Linux, cada vez que llega un paquete, consulta las reglas del cortafuegos y decide que hacer con el paquete según éstas. Con ellas se determina a que paquetes se les permite entrar o salir en la red interna (local) y qué hacer con los paquetes que cumplen las reglas.

Con iptables podremos añadir, borrar o crear reglas. Básicamente disponemos de tres cadenas de reglas. Los paquetes que llegan a nuestra máquina como destino final son evaluados con la cadena INPUT. Los paquetes que genera nuestra máquina y se dirigen a otros ordenadores son evaluados con la cadena OUTPUT. Los paquetes que llegan a nuestra máquina para ser redirigidos a otros equipos son evaluados con la cadena FORWARD.

Reglas y parámetros de iptables

Veamos a continuación algunas reglas y parámetros de iptables.

El parámetro -L sirve para ver las reglas introducidas.

  • iptables -L

El parámetro -F borra todas las reglas que hayamos introducido anteriormente.

  • iptables -F

Añadiendo reglas

El parámetro -A permite introducir una regla. Utilizaremos -A INPUT para añadir una regla de entrada, -A OUTPUT para definir una regla de salida y -A FORWARD para filtrar paquetes recibidos desde otra máquina y que son redirigidos a otros equipos.

El parámetro -j se utiliza para indicar qué hacer con un paquete. Básicamente los paquetes se pueden aceptar (ACCEPT), descartar (DROP) o rechazar (REJECT).

Si queremos, por ejemplo, descartar todos los paquetes que salgan de nuestra máquina añadiremos la siguiente regla:

  • iptables -A OUTPUT -j DROP

El objetivo DROP indica que se van a descartar todos los paquetes de salida. Comprobad, por ejemplo, que al añadir esta regla ya no tenemos acceso a Internet. En realidad no tendremos acceso a ningún equipo porque el cortafuegos descarta todos los paquetes de salida.

Os recuerdo que si queremos eliminar todas las reglas introducidas en el cortafuegos utilizaremos el parámetro -F

  • iptables -F

El siguiente ejemplo descarta todos los paquetes que lleguen a nuestro equipo (INPUT)

  • iptables -A INPUT -j DROP

Si queremos permitir el paso a todos los paquetes de entrada tendremos que escribir:

  • iptables -A INPUT -j ACCEPT

Y si queremos aceptar o permitir los paquetes de salida escribiremos:

  • iptables -A OUTPUT -j ACCEPT

El orden en el que se ponen las reglas en el cortafuegos es muy importante. Cuando el cortafuegos tiene que decidir qué hacer con un paquete va comparando cada una de las reglas introducidas hasta llegar a una que le afecta, y hace lo que dice esa regla. Después no se siguen mirando más reglas. Esto quiere decir que si primero añadimos una regla para no dejar salir ningún paquete de nuestra máquina y después añadimos otra para dejar salir a todos, el efecto que se produce es que el cortafuegos no deja pasar ningún paquete al ser la primera regla que se ha introducido.

Para eliminar una regla que ya hayamos introducido utilizaremos el parámetro -D.

  • iptables -D OUTPUT -j DROP

Para indicar a una regla el protocolo del paquete utilizaremos el parámetro -p, que puede ser icmp, tcp o udp. Con tcp también podemos utilizar:

  • sport: para indicar el puerto origen del paquete
  • dport: para indicar el puerto destino del paquete

Veamos un ejemplo. Tenemos instalado un servidor web en nuestra máquina escuchando peticiones por el puerto 80 y queremos permitir el acceso desde el exterior:

  • iptables -A INPUT -p TCP –dport 80 -j ACCEPT

De la misma forma, si tenemos un servidor ftp (puerto 21), podremos permitir el acceso desde el exterior con la siguiente regla:

  • iptables -A INPUT -p TCP –dport 21 -j ACCEPT

También podemos indicar un rango de puertos como en el siguiente ejemplo:

  • iptables -A INPUT -p TCP –dport 1:1024 -j DROP

En este caso cerraríamos todos los puertos por debajo del 1024

El parámetro -d indica la IP de la máquina destino de un paquete. En el siguiente ejemplo añadimos una regla para no permitir la salida de los paquetes que vayan al equipo con IP 80.90.1.30

  • iptables -A OUTPUT -d 80.90.1.30 -j DROP

El parámetro -s indica la IP de la máquina origen de un paquete. Si queremos, por ejemplo, rechazar la entrada de los paquetes que lleguen del equipo con IP 80.90.1.30, escribiríamos:

  • iptables -A INPUT -s 80.90.1.30 -j DROP

En el siguiente ejemplo dejamos a la máquina con IP 192.168.1.2 conectarse a nuestra máquina vía SSH:

  • iptables -A INPUT -s 192.168.1.2 -p tcp –dport 22 -j ACCEPT

Los parámetros -s y -d pueden utilizarse juntos.

Con el parámetro -P podemos indicar una política por defecto para una cadena concreta.

  • iptables -P INPUT DROP

Otra regla importante que hay que tener en cuenta es la relacionada con el estado de las conexiones. Si el tráfico de paquetes, tanto de entrada como de salida, pertenece a una conexión establecida (ESTABLISHED) o está relacionado con una conexión establecida (en estado RELATED) se aceptan, y de esta forma se agiliza su paso por el cortafuegos, ya que no tendrá que pasar por otra serie de reglas IPTABLES.

  • iptables -A INPUT -m state –-state ESTABLISHED, RELATED -j ACCEPT
  • iptables -A OUTPUT -m state -–state ESTABLISHED, RELATED -j ACCEPT

Un script de ejemplo

Los cambios realizados en iptables no quedan guardados en ningún archivo, se guardan en memoria y al reiniciar el ordenador los cambios se borran. Así que lo ideal es guardar todas las reglas en un archivo y ejecutarlo cuando se inicie la máquina. Veamos a continuación un ejemplo básico de script.

## Eliminamos las reglas que hayan sido introducidas anteriormenteiptables -Fiptables -Xiptables -Z## Establecemos políticas por defectoiptables -P INPUT ACCEPTiptables -P OUTPUT ACCEPTiptables -P FORWARD ACCEPT# A nuestro ordenador con IP 195.65.34.234 le dejamos todoiptables -A INPUT -s 195.65.34.234 -j ACCEPT# Al ordenador con IP 231.45.134.23 le dejamos entrar a la base de datos mysql (puerto 3006)iptables -A INPUT -s 231.45.134.23 -p tcp –dport 3306 -j ACCEPT# Al ordenador con IP 80.37.45.194 le dejamos acceder al servidor FTPiptables -A INPUT -s 80.37.45.194 -p tcp -dport 20:21 -j ACCEPT# El puerto 80 de www debe estar abierto, es un servidor web.iptables -A INPUT -p tcp –dport 80 -j ACCEPT# Y el resto, lo cerramosiptables -A INPUT -p tcp –dport 20:21 -j DROPiptables -A INPUT -p tcp –dport 3306 -j DROPiptables -A INPUT -p tcp –dport 22 -j DROPiptables -A INPUT -p tcp –dport 10000 -j DROPEspero que os sea de utilidad. Podéis encontrar más información en:http://www.pello.info/filez/firewall/iptables.htmlhttp://es.wikipedia.org/wiki/Iptables

Popularity: 3% [?]


Otras entradas que te pueden interesar



Esta entrada tiene

3 comentarios

Escrito por Alejandro Meroño Hernández

Marzo 22nd, 2009 at 7:49 pm

Categoría: Ubuntu

Tagged with , ,

3 comentarios en 'Iptables, cortafuegos en GNU/Linux'

Suscríbete a comentarios con RSS

  1. Muy buena explicacion!!! Siempre me a dado un poco de miedo montar mi firewall… pero lo has clavado!!

    Un saludo y Gracias!!

    Carlos

    23 Mar 09 at 10:39 pm

  2. Excelente guia. He buscado por mucho tiempo algo como esto y solo encontraba en ingles y tutoriales escritos en forma general. Este es mas especificos y es super entendibles.

    Ten la seguridad que estare agradecido por mucho tiempo por este valioso documento.

    Mil Gracias

    Josue Pazmiño

    24 Mar 09 at 5:56 pm

  3. Hacia tiempo que buscaba un buen manual de iptables. Muchas gracias por este manual!!!!

    Juanca

    16 Abr 10 at 3:03 pm

Deja un comentario