¿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