20 mayo 2011

Iptables like a pr0

Mucho tiempo ha pasado desde los albores del sistema firewall de Linux, los tiempos del comando Ipchains que tenía una funcionalidad bastante básica.

Con el advenimiento de Iptables el filtrado de paquetes en Linux dio un salto cualitativo en cuanto a funcionalidad y actualmente, existen opciones realmente interesantes que merecen la pena explorar. Veamos unas cuantas:


Iptables como IPS

Hace tiempo que los cortafuegos evolucionaron a partir de las típicas reglas IN / OUT / NAT y se convirtieron en 'IPSs' ampliando el formato de las reglas haciendo inspección completa del paquete y pudiendo permitir o denegar tráfico si el payload del paquete cumple una determinada característica, integrando el concepto IDS dentro del cortafuegos.

Iptables soporta filtrado de contenido permitiendo una variedad de reglas al-estilo-Snort. De hecho, existe un proyecto llamado fwsnort que integra todo el juego de reglas Snort dentro de IPtables.

Veamos un ejemplo sencillo de como buscar y detener tráfico sospechoso con Iptables. Buscamos el string "/etc/passwd" en cualquier paquete que vaya dirigido hacia el puerto 80:

# iptables -A INPUT -p tcp --dport 80 -m string --string "/etc/passwd" --algo kmp  -j LOG --log-ip-options --log-tcp-options --log-prefix "passwd access "

# iptables -A INPUT -p tcp --dport 80 -m string --string "/etc/passwd" --algo kmp -j DROP

De esta forma primero logeamos el paquete y posteriormente lo bloqueamos

Se puede dar el caso que el patrón que buscamos no sea posible representarlo usando ascii, para eso Iptables soporta reglas en formato Hex con el flag --hex-string

Reglas de acceso basadas en tiempo

Muchas veces mas allá del tipo de puertos que permitimos / denegamos basados en protocolos, tenemos la necesidad de aplicar lógica de tiempo a esas reglas. Por ejemplo, permitir acceso a la VPN corporativa en horario laboral parece una buena idea, pero mantener ese acceso durante los fines de semana puede no ser necesario.

Iptables permite crear reglas empleando valores de tiempo, tanto en el campo Hora como en el campo días-de-la-semana.

Veamos un ejemplo:

# iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j DROP

Con estas dos reglas, primero permitimos el acceso al servidor ssh (puerto 22) desde las 9 de la mañana hasta las 18, los días Lunes, Martes, Miércoles, Jueves y Viernes. La segunda regla bloquea el resto del tiempo el acceso al puerto 22

Conclusión: Iptables siempre gozó de una excelente fama por su rendimiento y fiabilidad como cortafuegos, a esa fama de fiable hay que sumar muy merecidamente la de versátil y moderno ya que en cuanto a funcionalidad, hay pocos sistemas de filtrado comerciales que puedan presumir de mayor funcionalidad

4 comments :

Madrikeka dijo...

Nunca dejaré de aprender cosas sobre iptables!!

muy interesante! 

kenit IDUS dijo...

iptables, el rastreador universal

Borrame dijo...

en una máquina con millones de peticiones siempre acaba habiendo problemas con iptables, corntrack table full etc

Rodrigo Moreno dijo...

Balanceador de carga? :)