La red Internet cada vez se ve ms saturada, debido en parte a un agotamiento del nmero de direcciones IP (IPv4) y a un creciente trfico de datos p2p y stream provenientes de las cada vez mejoras tcnicas en velocidad y puntos de acceso.

Todo esto provoca que aumente, cada vez ms, uno de los grandes problemas actuales: ataques, intrusiones, trfico no deseado, spam, etc. que encima se ve agraviado por la asignacin dinmica de direcciones IP y el trfico excedente de las redes p2p que se traduce en un incremento no deseado de paquetes que, debido a esa asignacin dinmica, afectan a destinos que no son objeto o que no son el objetivo de ese trfico, causando numerosos inconvenientes a profesionales y usuarios congestionando las redes.

Es por esa razn que, a travs del conocido iptables, se va a tratar el tema de deteccin, control y contencin de todo ese trfico innecesario.

Inicialmente, se considera la existencia de una configuracin segura de iptables ya tratada en otro artculo en esta misma web. En dicha configuracin es importante prestar especial atencin a la informacin del registro de actividades (LOG) como la siguiente:


Cdigo:
Nov 9 19:35:46 linux kernel: FIREWALL_INPUT_UDP_DROP IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=402 TOS=0x00 PREC=0x00 TTL=53 ID=9839 PROTO=UDP SPT=30904 DPT=1026 LEN=382
Nov 9 19:38:30 linux kernel: FIREWALL_INPUT_TCP_DROP IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=52 TOS=0x00 PREC=0x00 TTL=54 ID=57097 DF PROTO=TCP SPT=3125 DPT=135 WINDOW=65535 RES=0x00 SYN URGP=0
Nov 9 20:47:36 linux kernel: ANTI -- FK0 INV :IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=40 TOS=0x00 PREC=0x00 TTL=34 ID=59465 DF PROTO=TCP SPT=1905 DPT=4662 WINDOW=10240 RES=0x00 RST URGP=0

que indica que determinado trfico entrante se ha descartado.

Debido a este trfico molesto, aumenta el riesgo de sufrir algn tipo intrusin encubierta y/o un intento de ataque camuflado dentro del resto del trfico, es por eso que tras analizar cada caso, el siguiente grupo de cadenas y reglas han de ser modificadas y adecuadas por el administrador o encargado de la seguridad en el firewall y la red.


Cdigo:
###### RECENT BAN
echo " - BAN - "
echo " - BAN ALL - "
$IPTABLES -N BAN_ALL
$IPTABLES -F BAN_ALL
$IPTABLES -A BAN_ALL -m recent --set --name BAN_ALL -j LOG --log-prefix "SET -FULL BAN- MULTI :"
$IPTABLES -t mangle -A PREROUTING -m recent --update --name BAN_ALL --seconds 86400 -j DROP
$IPTABLES -t mangle -A INPUT -m recent --update --name BAN_ALL --seconds 86400 -j DROP
$IPTABLES -A BAN_ALL -j REJECT --reject-with icmp-host-unreachable



###### RECENT SCAN
echo " - SCAN - "
echo " - SCAN ALL -"
$IPTABLES -N SCAN_ALL
$IPTABLES -F SCAN_ALL
$IPTABLES -A SCAN_ALL -p TCP -m recent --set --name SCAN_ALL -m limit --limit 5/minute -j LOG --log-prefix "SET -SCAN ALL- TCP :"
$IPTABLES -A SCAN_ALL -p UDP -m recent --set --name SCAN_ALL -m limit --limit 5/minute -j LOG --log-prefix "SET -SCAN ALL- UDP :"
$IPTABLES -A SCAN_ALL -p ICMP -m recent --set --name SCAN_ALL -m limit --limit 5/minute -j LOG --log-prefix "SET -SCAN ALL- ICMP :"
$IPTABLES -A SCAN_ALL -p TCP -m recent --update --name SCAN_ALL --hitcount 5 -m limit --limit 1/minute -j LOG --log-prefix "SET --BAN ALL- TCP :"
$IPTABLES -A SCAN_ALL -p UDP -m recent --update --name SCAN_ALL --hitcount 5 -m limit --limit 1/minute -j LOG --log-prefix "SET --BAN ALL- UDP :"
$IPTABLES -A SCAN_ALL -p ICMP -m recent --update --name SCAN_ALL --hitcount 5 -m limit --limit 1/minute -j LOG --log-prefix "SET --BAN ALL- ICMP :"



$IPTABLES -A SCAN_ALL -m recent --update --hitcount 5 --name SCAN_ALL -m limit --limit 1/minute -j BAN_ALL
$IPTABLES -A SCAN_ALL -j REJECT --reject-with icmp-host-unreachable



###### Variable para Log de los REJECT
echo " - LOG'S - "
$IPTABLES -N DROP_IN_LOG
$IPTABLES -F DROP_IN_LOG
$IPTABLES -A DROP_IN_LOG -p ICMP # -m limit --limit 10/minute -j LOG --log-prefix "FIREWALL_INPUT_ICMP_DROP "
$IPTABLES -A DROP_IN_LOG -p TCP -m limit --limit 10/minute -j LOG --log-prefix "FIREWALL_INPUT_TCP_DROP "
$IPTABLES -A DROP_IN_LOG -p UDP -m limit --limit 10/minute -j LOG --log-prefix "FIREWALL_INPUT_UDP_DROP "
$IPTABLES -A DROP_IN_LOG -j SCAN_ALL

Para entender ste sistema, hay que empezar por el final, ya que el resto son cadenas enlazadas y han de establecerse en orden inverso, de lo contrario, si una cadena hace referencia a otra que todava no ha sido definida, se generar un error.

Si entra cualquier paquete por la eth0, ste es captado por el iptables que mirar si hay alguna regla que defina un modo de actuacin. Si no encuentra nada, entender que no es bienvenido y lo descartar (poltica por defecto), pero como hay establecido que todo el trfico excedente sea recogido por el LOG mediante la siguiente regla:


Cdigo:
echo " ------ Reject del resto y dejar log ------"
$IPTABLES -A INPUT -j DROP_IN_LOG

es en este punto, donde es preciso analizar dicho trfico.

Una vez que un paquete entrante genera alguna entrada en el LOG segn las reglas definidas, se mostrar un mensaje tpico tal cual se indicaba anteriormente, pero a diferencia del resto de implementaciones, el final de la cadena se modifica y, en vez de descartar el trfico, se enva a la cadena SCAN_ALL que recoger todo ese trafico y se encargar de decidir qu hacer con ese paquete o paquetes:


Cdigo:
$IPTABLES -A DROP_IN_LOG -j DROP $IPTABLES -A DROP_IN_LOG -j SCAN_ALL

Una vez all, se crea una tabla en la cual se almacenarn una serie de IPs que, en funcin de las reglas definidas, se marcan como posibles intentos de intrusin junto al nmero de paquetes (o hits) que han provocado.


Cdigo:
src=XXX.XXX.XXX.XXX ttl: 124 last_seen: 2225996 oldest_pkt: 9 last_pkts: 1077235, 1078154, 1145000, 1555824, 1556386, 2089231, 2089904, 2225358, 2225996
src=XXX.XXX.XXX.XXX ttl: 109 last_seen: 4871248 oldest_pkt: 13 last_pkts: 1254447, 1552233, 1853439, 2154443, 2455832, 2757392, 3059464, 3359703, 3674570, 3963474, 4263584, 4564531, 4871248



$IPTABLES -A SCAN_ALL -p TCP -m recent --set --name SCAN_ALL -m limit --limit 5/minute -j LOG --log-prefix "SET -SCAN ALL- TCP :"
Cmo se puede observar, la regla crear una tabla de nombre SCAN_ALL (/proc/net/ipt_recent/SCAN_ALL) y marcar una IP dndole un hit como posible intrusin si en el tiempo de 1 minuto ha enviado 5 paquetes.

Posteriormente, para evaluar si una direccin IP es reincidente, la siguiente regla gestionar si es una intrusin mirando la tabla y comprobando si en 1 minuto se han alcanzado 5 hits. Se dar como un hecho que dicha direccin IP es una posible fuente de ataques y ser enviada a la cadena BAN_ALL que se encargar de banear durante 24 horas (o el tiempo establecido) cualquier paquete proveniente de esa misma direccin IP.


Cdigo:
$IPTABLES -A SCAN_ALL -m recent --update --hitcount 5 --name SCAN_ALL -m limit --limit 1/minute -j BAN_ALL
CONCLUSIN

Es posible afirmar que este conjunto de reglas y cadenas, darn por hecho que cualquier IP que enve 25 paquetes por minuto y stos no sean atendidos, se considerar que es una posible intrusin, ataque o escaneo y que es recomendable que sea bloqueado.

En este artculo se ha presentado una opcin genrica para todos los protocolos y todos los descartes sin tener en cuenta si son malformados, invlidos, icmp, flood, etc... En adicin a las reglas y cadenas presentadas, se podran aadir sentencias similares para separar en diferentes tablas los diferentes tipos de descarte que pudiesen presentarse.

NOTA A TENER EN CUENTA

Para el bueno uso y correcto funcionamiento de lo aqu expuesto, es recomendable cerciorarse que las conexiones establecidas y relacionadas sean aceptadas, de lo contrario, es posible que una direccin IP sea bloqueada con la consecuente interrupcin de las comunicaciones establecidas.

Reglas a tener en cuenta:


Cdigo:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -m state ! --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -m state ! --state NEW -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -m state ! --state NEW -j ACCEPT
Fuente: http://www.hacktimes.com/?q=node/50