Ich habe eine Flask-Anwendung, die ich entwickle und die stark von der Interaktion mit externen Websites abhängt und vom Endbenutzer initiiert wird. Wenn ich die Anwendung ohne irgendeine Art von Bandbreitenkontrolle / Ratenbegrenzung verlasse, kann diese Anwendung von Akteuren mit schändlichen Absichten missbraucht werden.
Mein Ziel ist ein ziemlich einfacher zweistufiger Ansatz:
Ratenbegrenzung für einzelne IP-Quellen, die mehr als eine
x
Anzahl von Verbindungen pro Minute ausführen . Dies kann leicht mit erreicht werdeniptables
. Hier ist ein ähnliches Beispiel für mein Ziel:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Die Rate begrenzt die Fähigkeit der Anwendungen, mehr als die
x
Anzahl der Suchvorgänge pro URL durchzuführen . Beispiel:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Soweit ich das beurteilen kann, iptables
gibt es keine Möglichkeit, separate URLs zu verfolgen. Es ist nur möglich, diese Verbindungen als Ganzes zu bewerten. Das scheint auch nicht die einzige Einschränkung dessen zu sein, was ich erreichen möchte. Wenn es eine Möglichkeit zum Einrichten iptables
auf diese Weise gibt, kann dies zu Problemen mit meiner Webanwendung führen, da diese Anforderungen vom Benutzer initiiert werden.
Ich verwende Flask. Eine praktikable Option könnte darin bestehen, einen before_request
Hook zu verwenden und diese Ziele manuell mit einem Datenspeicher wie Redis zu verfolgen. Dies ist jedoch ziemlich weit oben im Stapel, um Verbindungen auf diese Weise zu behandeln. Was ich wirklich brauche (oder glaube), ist eine intelligente Firewall-Anwendung, die Anforderungen auf benutzerdefinierte Weise zerlegen und Verbindungen schließen kann, wenn bestimmte Haltepunkte erreicht wurden.
Gibt es eine Möglichkeit, das zu erreichen, was ich versuche?
Wenn das so ist, wie?