systemadmin.es > Seguridad > Filtrado por cadenas con iptables

Filtrado por cadenas con iptables

Mediante iptables podemos filtrar paquetes en función de muchas opciones, una de ellas es filtrar paquetes por cadenas mediante el modulo string de iptables:

Mediante el modulo string podemos filtrar los paquetes por una cadena de texto o por una cadena hexadecimal que indiquemos, las opciones son:

  • –string: Indicamos una cadena de text
  • –hex-string: Indicamos una cadena hexadecimal

Si lo ejecutamos sin ningúna otra opción veremos que nos indica:

# iptables -A INPUT -m string --string 'PHPE9568F36' -j LOG
iptables v1.3.5: STRING match: You must specify `--algo'
Try `iptables -h' or 'iptables --help' for more information.

En el fichero lib/ts_bm.c del código fuente del kernel, podemos ver la descripción de los dos algoritmos posibles:

 *   Note: Since Boyer-Moore (BM) performs searches for matchings from right 
 *   to left, it's still possible that a matching could be spread over 
 *   multiple blocks, in that case this algorithm won't find any coincidence.
 *   
 *   If you're willing to ensure that such thing won't ever happen, use the
 *   Knuth-Pratt-Morris (KMP) implementation instead. In conclusion, choose 
 *   the proper string search algorithm depending on your setting. 
 *
 *   Say you're using the textsearch infrastructure for filtering, NIDS or 
 *   any similar security focused purpose, then go KMP. Otherwise, if you 
 *   really care about performance, say you're classifying packets to apply
 *   Quality of Service (QoS) policies, and you don't mind about possible
 *   matchings spread over multiple fragments, then go BM.

Por lo tanto a la opción –algo le deberemos pasar:

  • bm: Si queremos rendimiento y no nos preocupa que se nos escapen coincidencias
  • kmp: Si no queremos que se nos escapen paquetes y no nos preocupa el rendimiento

El comando completo quedaría:

# iptables -A INPUT -m string --string 'PHPE9568F36' --algo bm -j LOG

Que en este caso, para una conexión local con este string veríamos en el log:

May 25 03:03:55 pica kernel: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=65 TOS=0x10 PREC=0x00 TTL=64 ID=42143 DF PROTO=TCP SPT=54631 DPT=80 WINDOW=257 RES=0x00 ACK PSH URGP=0 

6 comments to “Filtrado por cadenas con iptables”

  1. Comentar que el matching es case sensitive, aunque hay patches para iptables que añaden una opción –icase con este fin. Eso ya, a gusto del consumidor que quiera recompilar.

  2. Jordi, ¿Hay alguna forma indicar una expresión regular para el matching? Gracias

  3. No, no hay dicha opción es este modulo.

    saludos,

  4. Los felicito, esta opción me ah salvado la chamba

  5. Pregunta… quiero implementar un iptables que me bloquee TODA la navegacion pero unicamente permita “cietos” sitios, he estado intentando hacer algo como esto:

    root@trex-farkot:~# iptables -A FORWARD -p tcp -m string –string “prensalibre.com” –algo kmp -j ACCEPT
    root@trex-farkot:~# iptables -I FORWARD -j DROP

    Pero simplemente no navega despues de correrlo. Alguna idea?

  6. Quiza iptables no es la herramienta adecuada, mejor usar un proxy para esto

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>