Friday, October 14, 2011

Iptables: Guia de Referencia

Iptables es el componente más popular construido sobre Netfilter (Framework disponible en el núcleo Linux que permite interceptar y manipular paquetes de red), un sistema de Firewall que se ha extendido desde el kernel 2.4, a diferencia de otros Firewalls, este está integrado al Kernel, es parte del sistema operativo.

Esta guía pretende mostrarte los conceptos y las sintaxis de las reglas que vamos a poder aplicar a Iptables.

Anteriormente ya había escrito algunas guías que tienen algo que ver con Iptables pero a nivel de front-end con Shorewall:

-Implementando un firewall Básico con Shorewall
-Servidor VPN con OpenVPN y Shorewall

Para empezar debemos saber que un Firewall puede funcionar de dos modos:

A) Aceptando todo y denegando solo lo que se especifique.
B) Denegando todo y aceptando solo lo que se especifique.

Las reglas en Iptables se especifican en cadenas que están en tablas que se clasifican en dos tipos: filter & nat.

Las tablas tipo filter tienen las siguientes cadenas:

1) INPUT: Son los paquetes que van al Firewall (Que entran al firewall).
2) OUTPUT: Son los paquetes que son generados por el Firewall (Que salen del firewall)
3) FORWARD: Son los paquetes que son reenviados por el Firewall (Que vienen de un Host, pasan por el firewall, y van a otro Host o viceversa).



Las tablas tipo nat tienen las siguientes cadenas:

1) PREROUTING:  La traducción de direcciónes ocurre antes de el enrutamiento.
2) POSTROUTING: La traducción de direcciones ocurre despues de el enrutamiento.

Antes de empezar a configurar Iptables lo recomendable es que limpiemos toda su configuración, ejecutando los siguientes comandos:

# iptables -F (Se borran las reglas de la tabla filter)
# iptables -t nat -F (Se borran las reglas de la tabla nat)
# iptables -Z  (se reinician los contadores de paquetes)

Luego podemos guardar la configuración utilizando el script de inicio con la opcion save, por ejemplo:

# /etc/init.d/iptables save

Para mostrar todas las cadenas de la tabla filter podemos ejecutar uno de los siguientes comandos:

# iptables -t filter -L
# iptables -L   (Ya que por defecto muestra las del tipo filter)

Y para mostrar todas las cadenas de la tabla nat lo especificamos así:

# iptables -t nat -L


Tambien podemos especificar una cadena especifica:

# iptables -L INPUT

Cada cadena tiene una politica por defecto que va a determinar el tipo de Firewall que estamos creando, esta politica la podemos definir con la opcion -P, guiandonos de la siguiente sintaxis:

# iptables -P CHAIN POLICY


Donde CHAIN es el nombre de la cadena (INPUT, OUTPUT, etc), y POLICY es la politica por defecto que puede ser ACCEPT (Acepta el paquete) o DROP (No acepta el paquete).

Si queremos que nuestro firewall deniegue todas las conecciones entrantes y acepte solo lo especificado, ejecutariamos el siguiente comando:

# iptables -P INPUT DROP

Si queremos que acepte todas las conecciones entrantes y deniegue solo lo especificado, ejecutariamos el siguiente comando:

# iptables -P INPUT ACCEPT

Si queremos que acepte todas las conecciones salientes y deniegue solo las especificadas, ejecutaríamos:

# iptables -P OUTPUT ACCEPT


Dado el caso de que tendriamos nuestro firewall configurado para que deniegue todas las conecciones entrantes y acepte todas las salientes, y quisieramos aceptar el trafico desde una IP especifica, podemos añadir una regla con las opciones: -A (Append), -s (Source), -j (Jump).

# iptables -A INPUT -s 10.0.1.10 -j ACCEPT


Si queremos aceptar el trafico desde una interfaz especifica agregamos la opcion -i (Inbound):

# iptables -A INPUT -i eth0 -j ACCEPT

Si queremos aceptar el trafico desde una interfaz e IP especifica (Combinamos las dos opciones):

# iptables -A INPUT -i eth0 -s 10.0.1.10 -j ACCEPT

Si quisiéramos ser más específicos y aceptar el trafico desde un protocolo, interfaz e IP especifica, le agregamos la opción -p para especificar el protocolo (tcp/udp) y luego la opción --dport para especificar un puerto destino:

# iptables -A INPUT -i eth0 -s 10.0.1.10 -p tcp --dport 22 -j ACCEPT


Si fuera desde una subred completa y un rango de puertos:

# iptables -A INPUT -i eth0 -s 10.0.1.0/24 -p tcp --dport 22:100 -j ACCEPT

Les dejo unos ejemplos más para terminar con las cadenas INPUT & OUTPUT:

# iptables -A INPUT -p tcp --dport 8080 -j DROP (Evitar acceso al puerto 8080 del Firewall)

# iptables -A OUTPUT -p tcp --dport 23 -j DROP (No permitir que salgan conexiones Telnet)

# iptables -A INPUT -p udp --dport 53 -j DROP (Evitar acceso al puerto UDP 53 del Firewall)

IP Forwarding:

El Kernel Linux tiene la capacidad de retransmitir o reenviar los paquetes que se reciben por una interfaz a otra interfaz utilizando el mecanismo "IP Forwarding", por lo tanto este mecanismo es necesario para poner a funcionar la cadena FORWARD.

Por defecto IP Forwarding no esta activado, para activarlo bastaría con ponerle un "1" al fichero /proc/sys/net/ipv4/ip_forward:

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

Pero para que el cambio se refleje al reiniciar la maquina es necesario que la opcion net.ipv4.ip_forward tenga un "1" en el fichero /etc/sysctl.conf.

Teniendo IP Forwarding habilitado y una politica por defecto de la cadena FORWARD en ACCEPT, podemos especificar servicios que no queremos que se reenvien, por ejemplo:

# iptables -A FORWARD -p tcp --dport 80 -j DROP 
# iptables -A FORWARD -p udp --dport 53 -j DROP


Manipulación de Paquetes:


A traves de la tabla nat, iptables nos permite manipular los paquetes utilizando las siguientes cadenas:


PREROUTING:


Como mencionamos anteriormente con la cadena PREROUTING de la tabla NAT podemos manipular los paquetes antes del enrutamiento, esta la podemos usar cuando vallamos a realizar un DNAT (Destination Network Address Traslation): Tecnica para cambiar de forma transparente el destino de un paquete.

Aclaremos su funcionamiento con un breve ejemplo en Iptables, si por ejemplo quisieramos cambiar el destino de los paquetes de una maquina que entren por el puerto tcp 22 del firewall iptables a el puerto 3000 de otro servidor:

# iptables -t nat -A PREROUTING -s 10.0.1.10 -p tcp --dport 22 -j DNAT --to-destination servidor2:3000

Como podemos ver estamos especificando primeramente que utilizaremos la tablat nat, agregando en la cadena PREROUTING una regla que define que los paquetes TCP 22 que vengan del host 10.0.1.10 sean transferidos al puerto 3000 del servidor2.

POSTROUTING:


Con la cadena POSTROUTING podemos manipular los paquetes exactamente antes de mandarlos a la red, en esta cadena realizamos un SNAT (Source Network Address Traslation): Tecnica para cambiar de forma transparente el origen de un paquete.

Su funcionamiento queda claro en los siguientes ejemplos:


#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.1.1 

En el ejemplo anterior estamos cambiando la dirección de origen de los paquetes que salen por eth0 a 10.0.1.1.

#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.1.1-10.0.1.9 

En el ejemplo anterior estamos cambiando la dirección de origen de los paquetes que salen por eth0 a un rango de direcciónes.

La forma mas común en donde se refleja el uso del SNAT es en la tecnica llamada enmascaramiento "MASQUERADING", utilizado para que el Firewall enmascare las IP de la red local con la IP con la que el accede a otras redes (Por ejemplo internet), en pocas palabras todas las peticiones desde la red local a otras redes seran vistas como si provienen del Firewall.

Podemos realizar un enmascaramiento guiandonos de este ejemplo:


# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE


En el ejemplo anterior enmascaramos los paquetes que provienen de la red 10.0.1.0/24, para que salgan por la interfaz eth0 con la IP del Firewall.

Para finalizar con esta guia de Iptables les mostrare un diagrama que explica el flujo de los paquetes en base a las tablas y cadenas de Iptables:



1 comentarios:

zxguitar said...

Excelente Hermano... date esto tambien... es muy util http://hackplayers.blogspot.com/2011/06/usando-iptables-con-ips-dinamicas.html

Post a Comment