J'ai une application Flask que je développe, qui repose fortement sur l'interaction avec un site Web externe et est lancée par l'utilisateur final. Si je quitte l'application sans aucune sorte de contrôle de bande passante / limitation de débit, cette application peut être utilisée abusivement par des acteurs aux intentions néfastes.
Mon objectif est une approche assez simple en 2 étapes:
Le taux limite les sources IP individuelles d'effectuer plus de
x
nombre de connexions par minute. Cela peut être facilement réalisé aveciptables
. Voici un exemple similaire à mon objectif:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Le taux limite la capacité des applications à effectuer plus de
x
nombre de recherches par URL . Exemple:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Pour autant que je sache, iptables
n'a aucun moyen de suivre des URL distinctes. Il ne peut que limiter la limite de ces connexions dans son ensemble. Cela ne semble pas non plus être la seule limitation à ce que j'essaie de réaliser. S'il y avait un moyen de procéder iptables
de cette manière, cela pourrait poser des problèmes avec mon application Web car ces demandes sont lancées par l'utilisateur.
J'utilise Flask, une option viable pourrait être d'utiliser un before_request
crochet et de suivre manuellement ces destinations avec un magasin de données tel que Redis. Cependant, c'est assez haut dans la pile pour traiter les connexions de cette manière. Ce dont j'ai vraiment besoin (ou je pense le faire), c'est d'une application de pare-feu intelligente qui peut disséquer les demandes de manière personnalisée et fermer les connexions lorsque certains points d'arrêt ont été atteints.
Existe-t-il un moyen de réaliser ce que j'essaie de faire?
Si c'est le cas, comment?