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

0
1226

¿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

LEAVE A REPLY

Please enter your comment!
Please enter your name here