Cortafuegos e iptables

Un cortafuegos es un conjunto de reglas de filtrado de paquetes que regulan y controlan el tráfico entre dos redes (o el tráfico individual de un equipo). Este conjunto de reglas se pueden establecer en un hadware específico o bien establecerlo en un ordenador, con linux en nuestro caso.

Iptables es la utilidad que vamos a utilizar para crear e insertar en el núcleo las distintas reglas de filtrado que vamos a establecer sobre los paquetes.

Tipos de filtros de paquetes

Podemos distinguir varios tipos de paquetes IP en la máquina cortafuegos:

Paquetes con origen remoto y destino remoto: son los paquetes, que actuando como gateway, nuestra máquina tiene que reenviar. Estos paquetes se analizan mediante el filtro de reenvío, llamado FORWARD. Para que una máquina pueda reenviar paquetes tenemos que activar esta caractaarística mediante

 

 echo 1 > /proc/sys/net/ipv4/ip_forward

Paquetes con origen remoto y destino local: son los paquetes que las máquinas de cualquier red envían a nuestra máquina. Estos paquetes se analizan mediante el filtro de entrada, llamado INPUT.

Paquetes con origen local y destino remoto: son los paquetes que nuestra máquina envía a otras computadoras. Estos paquetes se analizan mediante el filtro de salida, llamado OUTPUT.

Generalizando un poco los tipod de filtos pueden ser:

MANGLE: reglas de manipulación de paquetes.

NAT: reglas PREROUTING, POSTROUTING de traducción de direcciones. (NAT network address translation).

FILTER: reglas INPUT, OUTPUT, FORWARD de filtrado de paquetes que ya habíamos descrito.

Cadenas

Vamos a denominar cadena al conjunto de reglas asociados con un determinado tipo de filtro. Iptables también dispone de la posiblidad de que un usuario pueda definir sus propias cadenas y asignarle un nombre. Los nombres de cadenas predefinidos son INPUT, OUTPUT y FORWARD.

Acciones sobe un paquete

Como vimos anteriormente, las decisiones que puede tomar un cada regla de un filtro de paquetes pueden ser, dejar pasar el paquete (ACCEPT), responderle al emisor educadamente que ese paquete no puede pasar (REJECT) o bien simplemente descartarlo como si no hubiera llegado (DROP o DENY).

Observamos que la diferencia entre REJECT y DROP consiste en que mediante REJECT se le contesta que el servicio no está disponible (icmp destination port unrechable) evitando así demoras en la conexión y mediante DROP no se le contesta nada por lo cual el sistema remoto no corta la conexión hasta que ha transcurrido el tiempo de espera de la contestación con la consiguiente ralentización. Para la red local es aconsejable usar REJECT aunque cada administrador tiene que estudiar su situación.

Por los mismos motivos tenemos que tener cuidado con el protocolo ICMP.

También tenemos la acción LOG que origina un registro de los paquetes que verifican la regla.

En un paso un poco más complicado, también se podría manipular el paquete y cambiarle ciertas características a nuestra conveniencia.

Estas opciones se la vamos a especificar a iptables con la opción "-j".

Caracteristicas básicas de un paquete

Las características básicas de un paquete, que van a servir para identificarlo son:

Dirección de origen

Indica quien es el emisor del paquete, de qué ordenador viene. Lo podremos especificar con una dirección IP, un nombre de host o una dirección de red en formato CIDR (192.168.0.0/24) o en notación clasica (192.168.0.0/255.255.255.0). En iptables podemos especificar la dirección origen con la opción "-s". Si en una regla omitimos la dirección origen equivale a poner 0/0 es decir cualquier dirección. Por ejemplo "-s 192.168.0.0/24" indicaría cualquier dirección con origen en la red de clase C (24 bits de red) 192.168.0.0. Si delante de la dirección añadimos "!" entonces hacemos referencia a cualquier dirección salvo la especificada, es decir, que no sea esa dirección.

Dirección de destino

Indica a quien va dirigido el paquete, a qué ordenador via. También lo podremos especificar con una dirección IP, un nombre de host o una dirección de red en formato CIDR (192.168.0.0/24) o en notación clasica (192.168.0.0/255.255.255.0). En iptables podemos especificar la dirección destino con la opción "-d". Si en una regla omitimos la dirección origen equivale a poner 0/0 es decir cualquier dirección. Por ejemplo "-s 192.168.0.0/24" indicaría cualquier dirección con destino a la red de clase C (24 bits de red) 192.168.0.0. Si delante de la dirección añadimos "!" entonces hacemos referencia a cualquier dirección salvo la especificada, es decir, que no sea esa dirección.

Protocolo

Podemos establecer filtros sobre protocolos concretos, será obligatorio si además especificamos algún puerto. La opción para especificar un protocolo es "-p" y los valores posibles son TDP, UDP e ICMP. El signo "!" antes del nombre del protocolo también se utiliza para negar.

Interfaz de entrada

Podemos especificar un dispositivo de entrada de red concreto con la opción "-i". Por ejemplo "-i eth0" indicaría un paquete que proviene de eth0. Se puede usar un "!". Evidentemente no podremos usar un interfaz de entrada con una regla de salida (OUTPUT).

Interfaz de salida

Podemos especificar un dispositivo de salida de red concreto con la opción "-o". Por ejemplo "-o eth0" indicaría un paquete que sale por eth0. Se puede usar un "!". Evidentemente no podremos usar un interfaz de salida con una regla de entrada (INTPUT).

Puerto origen

Mediente la opción "--sport" podemos especificar un puerto o un rango de puertos si los separamos por ":", por ejemplo [1024:65535] indicaría desde 1025 hasta 65535. Los puertos los podemos especificar por su número o también por el nombre asociado en el fichero /etc/services. Es necesario especificar -p TCP o -p UDP para poder especificar un pueerto origen.

Puerto destino

Mediente la opción "--dport" podemos especificar un puerto o un rango de puertos. Las consideraciones son iguales que para el puerto origen.

Definición de reglas

Para definir una nueva regla sólo tenemos que decirle a iptables si tiene que insertar la nueva regla en alguna posición (-I numero) o bien simplemente añadirla al final (-A) y la descripción de la regla. Vemos algunos ejemplos:

Ejemplo 1:

 

iptables -A INPUT -s 192.168.0.0/24 -d 192.168.5.0 -p tcp --dport 80 -j ACCEPT

Estaría añadiendo (-A) una regla de entrada (INPUT) que indica que todos los paquetes originados en la red 192.168.0.0 (-s 192.168.0.0/24) y dirigidos a la la red 192.168.5.0 ( -d 192.168.5.0) y dirigidos al puerto 80 (--dport 80) tienen que dejarse pasar (-j ACCEPT).

Ejemplo 2:

 

iptables -A FORWARD -s 192.168.0.7 -j REJECT

Estaría añadiendo (-A) una regla de reenvío (FORWARD) que indica que todo el tráfico proveniente del ordenador 192.168.0.7 (-s 192.168.0.7) se rechaza (-j REJECT). Es decir estamos cortando a este equipo la salida fuera de la red.

Ejemplo 3:

 

iptables -A OUTPUT -o eth0 -j ACCEPT

Permitimos culquier salida por la interfaz de red eth0.

Desde aquí suponemos que el lector está familiarizado con los números de puertos y servicios.