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
- Ejercicios de filtrado de paquetes con IPTABLES
- Grabar un cd de audio en Ubuntu con K3b
- Shutter, capturador de pantallas para GNU/Linux
- Lanzado Banshee 1.5.5 con vista en retícula y plugin para Youtube
- APTonCD. Crea un CD/DVD con todos los paquetes instalados
- Ejercicios servicio HTTP
- Abrir favoritos de Firefox con Gnome Do


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
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
Hacia tiempo que buscaba un buen manual de iptables. Muchas gracias por este manual!!!!
Juanca
16 Abr 10 at 3:03 pm