Solución:
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 por encima de 15 de una IP de origen.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
En esto se permiten 160 conexiones nuevas (paquetes realmente) antes de que se aplique el límite de 150 conexiones NUEVAS (paquetes) por segundo.
Desea que las siguientes reglas en sus iptables respondan a ambos requisitos en su pregunta:
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state
--state RELATED,ESTABLISHED -j ACCEPT
# Adjust "--connlimit-above NN" to limit the maximum connections per IP
# that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit
--connlimit-above 10 --connlimit-mask 32 -j DROP
# Adjust "--connlimit-above NNN" to the maximum total connections you
# want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit
--connlimit-above 150 -j DROP
Debido a que estamos usando -I (según la solicitud de OP), tenemos que hacerlo en orden inverso, así que ‘léalos’ de abajo hacia arriba.
También sugiero considerar –connlimit-mask NN cambiar de 32 a 24. Esto limitará una red de clase C completa (máx. 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 crea que se podría usar su servicio.
Además, dependiendo de cómo desee que se comporte el cliente, podría desea utilizar “-j REJECT –reject-with tcp-reset” en lugar de “-j DROP” en las dos reglas anteriores, o incluso solo en la regla máxima de 150 conexiones.
Si RECHAZA la conexión, el navegador o el software que usa el puerto 80 mostrará un estado “no disponible” inmediatamente, 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. Yo mismo tiendo a inclinarme hacia 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 desciende por debajo de 150 (o 10) mientras aún se está reintentando, finalmente llegará a su servidor.
Sin embargo, la opción REJECT 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 del puerto 80 es parte de un clúster, REJECT le indicará al controlador del clúster que está inactivo y que deje de enviarle tráfico durante el tiempo de espera de reintento.
La regla RELACIONADA, ESTABLECIDA existe 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.
Además, –syn le dice que preste atención (o cuente) los paquetes que configuran una conexión TCP.
Necesitas usar el connlimit
módulos que le permiten restringir el número de conexiones TCP paralelas a un servidor por dirección IP de cliente (o bloque de direcciones).
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit
--connlimit-above 10 -j DROP