La red Internet cada vez se ve más saturada, debido en parte a un agotamiento del número de direcciones IP (IPv4) y a un creciente tráfico de datos p2p y stream provenientes de las cada vez mejoras técnicas en velocidad y puntos de acceso.

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

Es por esa razón que, a través del conocido iptables, se va a tratar el tema de detección, control y contención de todo ese tráfico innecesario.

Inicialmente, se considera la existencia de una configuración segura de iptables ya tratada en otro artículo en esta misma web. En dicha configuración es importante prestar especial atención a la información del registro de actividades (LOG) como la siguiente:


Código:
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 tráfico entrante se ha descartado.

Debido a este tráfico molesto, aumenta el riesgo de sufrir algún tipo intrusión encubierta y/o un intento de ataque camuflado dentro del resto del tráfico, 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.


Código:
###### 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 todavía 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 actuación. Si no encuentra nada, entenderá que no es bienvenido y lo descartará (política por defecto), pero como hay establecido que todo el tráfico excedente sea recogido por el LOG mediante la siguiente regla:


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

es en este punto, donde es preciso analizar dicho tráfico.

Una vez que un paquete entrante genera alguna entrada en el LOG según las reglas definidas, se mostrará un mensaje típico 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 tráfico, se envía a la cadena SCAN_ALL que recogerá todo ese trafico y se encargará de decidir qué hacer con ese paquete o paquetes:


Código:
$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 almacenarán una serie de IPs que, en función de las reglas definidas, se marcan como posibles intentos de intrusión junto al número de paquetes (o hits) que han provocado.


Código:
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 :"
Cómo se puede observar, la regla creará una tabla de nombre SCAN_ALL (/proc/net/ipt_recent/SCAN_ALL) y marcará una IP dándole un “hit” como posible intrusión si en el tiempo de 1 minuto ha enviado 5 paquetes.

Posteriormente, para evaluar si una dirección IP es reincidente, la siguiente regla gestionará si es una intrusión mirando la tabla y comprobando si en 1 minuto se han alcanzado 5 “hits”. Se dará como un hecho que dicha dirección 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 dirección IP.


Código:
$IPTABLES -A SCAN_ALL -m recent --update --hitcount 5 --name SCAN_ALL -m limit --limit 1/minute -j BAN_ALL
CONCLUSIÓN

Es posible afirmar que este conjunto de reglas y cadenas, darán por hecho que cualquier IP que envíe 25 paquetes por minuto y éstos no sean atendidos, se considerará que es una posible intrusión, ataque o escaneo y que es recomendable que sea bloqueado.

En este artículo se ha presentado una opción genérica para todos los protocolos y todos los descartes sin tener en cuenta si son malformados, inválidos, icmp, flood, etc... En adición a las reglas y cadenas presentadas, se podrían añadir 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 dirección IP sea bloqueada con la consecuente interrupción de las comunicaciones establecidas.

Reglas a tener en cuenta:


Código:
$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