Limitando conexiones por Ip hacia nuestro servidor usando Iptables con GNU/Linux
BREAKING NEWS

Limitando conexiones por Ip hacia nuestro servidor usando Iptables con GNU/Linux

¿Cómo puedo restringir el número de conexiones utilizadas por una única dirección IP hacia mi servidor para los puertos 80 y 25 usando iptables?  Para ello es necesario utilizar los módulos connlimit el cual permite restringir el número de conexiones TCP a un servidor por dirección IP (o bloque de direcciones).


Sintaxis
La sintaxis es como sigue:

/sbin/iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset
# Ahora salvamos los cambios con el comando iptables-save
service iptables save

Ejemplo:  Limitar las conexiones de SSH por IP/Host


Solo se permiten 3 conexiones por client/host:

/sbin/iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# Ahora salvamos los cambios con el comando iptables-save
service iptables save



Example: Limitar las conexiones de HTTP por IP/Host

Sólo permite 20 conexiones http por IP (MaxClients se establece en 60 en httpd.conf):

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
# Ahora salvamos los cambios con el comando iptables-save
service iptables save



Que pasa con el servidor proxy, bueno en este caso lo vamos a saltar o quitar de las limitaciones, supongamos que el proxy server tiene la IP 1.2.3.4:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -d ! 1.2.3.4 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset


Limitando toda una clase C

En este ejemplo, el límite peticiones de http es de 20 por tamaño de red de la clase C (máscara de red 24 bits)

/sbin/iptables  -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT --reject-with tcp-reset
# Ahora salvamos los cambios con el comando iptables-save
service iptables save

Limitando las conexiones por segundo

En el siguiente ejemplo eliminamos las conexiones entrantes, si la IP tiene más de 10 intentos de conexión al puerto 80 a 100 segundos (hay que agregar las reglas al script de iptables)

#!/bin/bash
#
# Settings
#
IPT=/sbin/iptables
# Max numero de conexiones en segs
SECONDS=100
# Max conexiones por IP
BLOCKCOUNT=10
# ....
# ..
# La accion por default puede ser DROP o REJECT
DACTION="DROP"
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j ${DACTION}
# ....
# ..


Haciendo un test al firewall para saber si funciona o no las limitaciones

Para hacer esto, hay que ejecutar el siguiente shell script el cual simula una conexion via web al servidor 202.1.2.3:

#!/bin/bash
ip="202.1.2.3"
port="80"
for i in {1..100}
do
# Solo se conecta y se sale
echo "exit" | nc ${ip} ${port};
done