Tengo una aplicación Flask que estoy desarrollando que se basa en gran medida en la interacción del sitio web externo y es iniciada por el usuario final. Si dejo la aplicación sin ningún tipo de control de ancho de banda / limitación de velocidad, entonces esta aplicación puede ser abusada por actores con intenciones nefastas.
Mi objetivo es un enfoque bastante simple de 2 etapas:
Limite la velocidad de las fuentes IP individuales para que no realicen más de un
x
número de conexiones por minuto Esto se puede lograr fácilmente coniptables
. Aquí hay un ejemplo similar a mi objetivo:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
La tasa limita la capacidad de las aplicaciones para realizar más del
x
número de búsquedas por URL . Ejemplo:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Hasta donde puedo decir, iptables
no tiene forma de rastrear URL separadas. Solo puede calificar el límite de estas conexiones como un todo. Eso tampoco parece ser la única limitación a lo que estoy tratando de lograr. Si hubiera una manera de configurar iptables
de esta manera, podría proporcionar algunos problemas con mi aplicación web ya que estas solicitudes son iniciadas por el usuario.
Estoy usando Flask, una opción viable podría ser usar un before_request
gancho y rastrear manualmente estos destinos con un almacén de datos como Redis. Sin embargo, esto es bastante alto en la pila para lidiar con las conexiones de esta manera. Lo que realmente necesito (o creo que necesito) es una aplicación de firewall inteligente que puede analizar las solicitudes de forma personalizada y cerrar las conexiones cuando se alcanzan ciertos puntos de interrupción.
¿Hay alguna forma de lograr lo que estoy tratando de hacer?
¿Si es así, cómo?