¿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
/sbin/iptables -A INPUT -p tcp –syn –dport 443 -m connlimit –connlimit-above 20 -j REJECT –reject-with tcp-reset
o
iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP
iptables -A INPUT -p tcp –syn –dport 443 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP
# 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
/sbin/iptables -A INPUT -p tcp –syn –dport 443 -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
Restringir el número de conexiones paralelas a un servidor por direccion Ip del cliente. -*-
Se puede usar connlimit para crear algunas restricciones. Para permitir 3 conexiones ssh por cliente:
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
Establecer las peticiones HTTP a 20:
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
# Ahora salvamos los cambios con el comando iptables-save
service iptables save
o
iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP
iptables -A INPUT -p tcp –syn –dport 443 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP
# Ahora salvamos los cambios con el comando iptables-save
service iptables save
donde:
- –connlimit-above 3 : Coincide si el número de conexiones existentes está por encima de 3.
- –connlimit-mask 24 : Grupos de hosts usando el prefijo de longitud. Para IPv4, debe ser un número entre 0 y 32 (incluyéndolos.)
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}
$IPT -A INPUT -p tcp –dport 443 -i eth0 -m state –state NEW -m recent –set
$IPT -A INPUT -p tcp –dport 443 -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