Tenemos un servidor Ubuntu 12.04 con httpd en el puerto 80 y queremos limitar:
- las conexiones máximas por dirección IP a httpd a 10
- el máximo de nuevas conexiones por segundo a httpd a 150
¿Cómo podemos hacer esto con iptables?
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Esto rechazará las conexiones superiores a 15 desde una IP de origen.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
En este se permiten 160 nuevas conexiones (paquetes realmente) antes de que se aplique el límite de 150 NUEVAS conexiones (paquetes) por segundo.
-m conntrack --ctstate
en lugar de-m state --state
. conntrack es nuevo y mejorado vs. estado.NEW
conexiones, no lo hagas, ¡convierte efectivamente tuINPUT
cadena en un valor predeterminadoaccept
!Desea que las siguientes reglas en sus iptables respondan ambos requisitos en su pregunta:
Debido a que estamos usando -I (según la solicitud de OP) tenemos que hacerlos en orden inverso, así que 'léalos' de abajo hacia arriba.
También sugiero considerar: el cambio de NN de máscara de límite de 32 a 24. Esto limitará una red de clase C completa (máximo 256 direcciones IP en el mismo rango) a 10 conexiones. También puede usar cualquier otro número sin clase, como 22 o 30, dependiendo de cómo cree que podría usarse su servicio.
Además, dependiendo de cómo desee que se comporte el cliente, puede usar "-j REJECT --reject-with tcp-reset" en lugar de "-j DROP" en las dos reglas anteriores, o incluso solo en las 150 conexiones máximas regla.
Si RECHAZA la conexión, el navegador o el software que utiliza el puerto 80 mostrará un estado "no disponible" de inmediato, pero la opción DROP hará que el cliente espere y vuelva a intentarlo varias veces antes de informar que el sitio no está disponible. Tiendo a inclinarme por el DROP, ya que se comporta más como una mala conexión que como un servidor fuera de línea.
Además, si el límite de conexión vuelve a caer por debajo de 150 (o 10) mientras todavía está volviendo a intentarlo, entonces finalmente llegará a su servidor.
Sin embargo, la opción RECHAZAR causará una fracción menos de tráfico a su sitio, ya que DROP hará que envíe paquetes adicionales mientras vuelve a intentarlo. Probablemente no sea tan relevante.
Si, por otro lado, el tráfico de su puerto 80 es parte de un clúster, entonces RECHAZAR le indicará al controlador del clúster que está inactivo y que deje de enviarle tráfico mientras dure el tiempo de reintento.
La regla RELACIONADA, ESTABLECIDA está ahí bajo el supuesto de que su regla predeterminada es bloquear todo el tráfico (iptables -t filter -P INPUT DROP). Esto solo acepta otros paquetes pertenecientes a conexiones aceptadas.
También --syn le dice que preste atención (o cuente) a los paquetes que configuran una conexión TCP.
fuente
Necesitas usar el
connlimit
módulos que le permiten restringir la cantidad de conexiones TCP paralelas a un servidor por dirección IP de cliente (o bloque de direcciones).fuente