Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
En esta práctica se pretende conocer la utilidad IPTables como firewall de un sistema Linux. En
las siguientes secciones se explica y detalla el funcionamiento del mismo. Para poder probar de
un modo práctico el funcionamiento del mismo se recomienda la creación de una máquina
virtual con VirtualBox donde instalar una imagen de la distribución Ubuntu de GNU\Linux. Esto
es voluntario pero recomendable.
Realmente lo que se hace con IPTables es aplicar reglas para el filtrado de tráfico. Para ellos se
ejecuta el comando iptables, con el que añadimos, borramos, o creamos reglas. Por ello un
firewall de iptables no es sino un simple script de shell en el que se van ejecutando las reglas de
firewall.
IPtables se inicia junto con el sistema y se mantiene activo todo el tiempo, adecuándose y
aplicando a todo el tráfico de red las reglas que se le hayan configurado previamente. Para
explicarlo de una forma muy simplista, tenemos que abstraernos del equipo y olvidar por un
momento toda la configuración específica de nuestra máquina. Teniendo en cuenta que las
reglas de IPtables están a nivel de Kernel, el Kernel lo que recibe es un paquete de datos y
decidirá qué hacer con él. Es ahora cuando, dependiendo de si el paquete es para nuestro equipo
o para otro, consultará las reglas de IPtables y decidirá lo que hará con el paquete según dichas
reglas. Según la configuración aplicada, el paquete de datos de red pasará por nuestro equipo
sin ser procesado, entrará se procesará y saldrá, o directamente será devuelto.
No obstante, hay que tener en cuenta que se puede implementar un script de inicio en
/etc/rc.d/INIT.d (o /etc/INIT.d ) con el que hagamos que iptables se "inicie o pare" como un
servidor más. Lo podemos hacer nosotros o es probable que venga en la distribución.
2
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
Las reglas de filtrado de los paquetes en IPtables se agrupan en cadenas. Una cadena es un
conjunto de reglas que se aplican para determinar que se debe hacer con los paquetes que
entras, salen o atraviesan el firewall. Las cadenas se agrupan en tablas.
INPUT, OUTPUT y FORWARD son los tres tipos de reglas de filtrado. Pero antes de aplicar esas
reglas es posible aplicar reglas de NAT: estas se usan para hacer redirecciones de puertos o
cambios en las IPs de origen y destino. E incluso antes de las reglas de NAT se pueden meter
reglas de tipo MANGLE, destinadas a modificar los paquetes; son reglas poco conocidas y es
probable que no se usen al configurar el firewall.
MANGLE
NAT: reglas PREROUTING, POSTROUTING
FILTER: reglas INPUT, OUTPUT, FORWARD
Antes de ello, vamos a realizar una sencilla prueba para comprobar que hay
conectividad en internet. Ejecuta por ejemplo, el comando ping www.google.es, y
comprueba que obtenemos respuesta del servidor de Google. Si no hay conectividad,
repara primero este problema...
de GNU/Linux. Es una aplicación que contiene una serie de cadenas de reglas de filtrado en 3
tablas. Atender al orden de dichas reglas es muy importante, ya que lee de manera secuencial
las cadenas de reglas. Es decir, comienza por la primera y verifica que se cumpla la condición,
en caso afirmativo la ejecuta sin verificar las siguientes.
Por consiguiente, si la primera regla en una determinada tabla es rechazar cualquier paquete,
las siguientes reglas no serán verificadas.
El tipo de operación es añadir una regla (A), sobre la tabla filter (tabla por defecto de
filtrado), y cadena FORWARD (tráfico enrutado).
La regla: aceptar (ACCEPT) el tráfico TCP cuyo puerto de destino sea el 80 (HTTP), en el
interfaz ethO con IP origen 192.168.2.100.
-L: listar las cadenas de reglas de una determinada tabla (por defecto filter).
-F: elimina y reinicia a los valores por defecto todas las cadenas de una determinada
tabla.
-A: añadir cadena de regla a una determinada tabla.
-P: añadir regla por defecto, en caso de que no cumpla ninguna de las cadenas de regla
definidas.
Para sistemas en los que no se haya definido anteriormente reglas para Iptables el resultado
de ejecutar el comando iptables -L tiene que ser similar a permitir todo el tráfico.
En IPTables existen cinco tablas: filter, NAT, mangle, raw o security. En esta práctica nos
centraremos en las tres primeras. Además, existen extensiones que permiten crean más
tablas.
De las tres tablas que hemos mencionado, cada una de las cuales contiene ciertas cadenas
predefinidas:
Filter table (Tabla de filtros): Esta tabla es la responsable del filtrado (es decir, de
bloquear e permitir que un paquete continúe su camino). Todos los paquetes pasan a
través de la tabla de filtros. En este caso las acciones que podemos realizar sobre los
paquetes son ACCEPT, DROP, REJECT ó QUEUE. Contiene las siguientes cadenas
predefinidas y cualquier paquete pasará por una de ellas:
o INPUT chain (Cadena de ENTRADA) -Todos los paquetes destinados a este 4
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
A la hora de definir una orden de iptables podremos seleccionar la tabla a la que va destinada
dicha orden mediante el parámetro -t:
Los modificadores o parámetros más usuales en las reglas de iptables son los siguientes:
Parámetro Descripción
-i Interfaz de entrada (eth0, ethl, eth2 … ).
-o Interfaz de salida (eth0, ethl, eth2 ... ).
--dport Puerto de origen (puede indicarse el nombre o el número de puerto
5
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
Lo primero para trabajar con IPTables es abrir una consola de Linux. En caso de que IPTables
no estuviera instalado, habría que instalarlo desde la consola con el comando (para
distribuciones Ubuntu): sudo apt-get iptables
Para comprobar las reglas que están activas en este momento podemos usar desde esa
consola la orden: iptables –L -v.
Podemos comenzar con establecer una política global. Las siguientes tres reglas establecen
una política por defecto que acepta cualquier conexión por defecto:
Otra política alternativa sería la de no permitir ninguna conexión entrante. En este caso
tendríamos que usar las siguientes órdenes:
6
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
Una opción intermedia es REJECT, que no permite la conexión pero informa mediante un error
de la razón por la que la conexión no ha sido admitida:
Podemos aplicar una de las tres políticas por defecto y comprobar su efecto mediante el
comando ping.
Podemos querer bloquear las conexiones provenientes de una sola dirección IP, en ese caso
deberíamos crear una regla como la siguiente:
Otra posibilidad es que queramos filtran las conexiones entrantes en base al puerto TCP. Por ejemplo,
queremos bloquear las conexiones SSH desde 10.10.10.10:
Se puede reemplazar ssh por un número de puerto (por ejemplo 21) o bien por un protocolo conocido
como ftp. Dado que –p indica que protocolo de transporte se usa. Si quisiéramos bloquear un protocolo
que usara UDP, deberíamos usar –p udp.
Para bloquear las conexiones desde cualquier dirección IP para el protocolo SSH usaríamos la siguiente
regla:
Algunos protocolos van a requerir comunicación bidireccional. Por ejemplo, las conexiones SSH necesitan
una regla en la cadena de entrada y otra regla en la cadena de salida. A veces nos interesa permitir
conexiones bidireccionales iniciadas por otro usuario hacia nuestro servidor, pero no que nuestro servidor
inicie una conexión dirigidas hacia terceros. En estas ocasiones, nos interesa gestionar esta comunicación
bidireccional de otra forma a la vista hasta ahora en base a IPs y puertos. Luego lo haremos en base al
estado de la conexión establecida. Por ejemplo, queremos que permitir conexiones con SSH desde
10.10.10.10 hacia nuestro servidor pero no queremos que nuestro servidor se conecte a 10.10.10.10. Sin 7
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
embargo, queremos que el sistema permita enviar información sobre SSH mientras la sesión ha sido
establecida, lo que permite la comunicación entre estos dos hosts posible. Lo podemos conseguir con las
siguientes reglas:
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
Para borrar todos los cambios que hemos realizado usamos el comando: iptables –F.
Si queremos que estos cambios realizados por consola duren más alla del reinicio del
ordenador hemos de almacenarlos mediante el comando (si estamos usando Ubuntu):
sudo /sbin/iptables-save
Como ya hemos visto en el apartado anterior, las reglas que tuviésemos aplicadas en IPtables,
desaparecen al reiniciar el equipo.
Si hemos introducido una a una las reglas a IPTables por comando podemos salvarlas mediante
la orden (en distribuciones Ubuntu) sudo /sbin/iptables-save.
Sin embargo, otra alternativa es escribir todas las reglas en un fichero que se cargue
automáticamente cuando iniciemos sesión. Para solucionar este problema con unas cuantas
líneas de comandos con las que podremos programar un script (conjunto de órdenes
concatenadas y contenidas en un archivo) para que las reestablezca al inicio del sistema.
Lo primero que tendremos que hacer será el script con las reglas que nos interese aplicar. Para
esto nos iremos a cualquier editor de texto que conozcamos y crearemos un fichero que
contendrá todas las reglas de nuestra política.
¡Ojo con el orden de las reglas!. Cuando llega un paquete, se intentará equiparar a
alguna de las reglas del listado de la fase 4 (por orden), y si no equipara con ninguna, se aplicará
la política por defecto definida en la fase 3.
iptables="/sbin/iptables"
LAN="eth0"
WIFI="wlan0"
echo ""
## Limpiar tablas ##
$iptables -F
$iptables -X
$iptables -Z
#echo " - FLUSH a iptables, correcto." && echo""
chmod +x /etc/activar-cortafuegos
Y por último especificamos en el sistema que queremos que se ejecute dicho script, modificando
el archivo con nombre 'rc.local' que encontramos en la carpeta /etc. Abrimos terminal y
escribimos esto:
nano /etc/rc.local
Y directamente nos abrirá el archivo en un editor de texto que tendremos que dejar tal que así:
#!/bin/sh -e
#
# rc.local
9
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/activar-cortafuegos
exit 0
Y con esta modificación al iniciar la máquina se aplicarán las reglas de nuestro cortafuegos de
forma automática. Sólo comentar que la carpeta donde se crea o aloja el script y el nombre de
este son totalmente personalizables, siempre que luego se especifique en el 'rc.local' la ruta
absoluta del mismo.
Una vez tenemos nuestro firewall funcionando desearemos en algún momento comprobar si
ha ocurrido alguna alerta o bien usar los logs para analizar y detectar alguna posible amenaza.
Lo primero es que en nuestras reglas hemos de añadir LOG –log-prefix “mensaje” para que
cuando se detecten los mensajes asociados se añada automáticamente al log esta información.
Por ejemplo:
Luego tenemos que guardar los cambios si al principio no habíamos añadido la opción LOG a
las reglas correspondientes:
tail –f /var/log/messages
Por defecto, la mayoría de los logs del sistema se guardan en el fichero /var/log/messages pero
en este caso vamos a configurar un nuevo fichero para que almacene únicamente los logs que
generaremos con algunas reglas en IpTables, creando así su propio archivo de registro.
1
0
Seguridad
3º Grado de Ingeniería Informática
Práctica Cortafuegos con IPTables
Con esto indicamos que se almacenen los mensajes provienen del kernel con prioridad 4 o
superior ('warning' es el nivel de prioridad 4) en el archivo /var/log/iptables.log y se ignora el
resto de prioridad inferior (debug, info y notice que son del 3 hacía abajo) generalmente
irrelevantes.
Por último, para visualizar esta información debemos abrir el fichero /var/log/iptables.log con
cualquier editor de texto con el que estemos familiarizado.
Se dará un breve detalle de cada campo ya que hay información que podría no estar presente
dependiendo de la cadena dentro de la que se realizo el registro de algunos de los protocolos
que intervienen en el caso.
1
1