我有一个正在开发的Flask应用程序,该应用程序在很大程度上依赖于外部网站的交互,并由最终用户启动。如果我离开该应用程序时没有任何带宽控制/速率限制,那么此行为者可能出于恶意的目的而滥用该应用程序。
我的目标是一个相当简单的两阶段方法:
对单个IP源的速率进行限制
x
,以使其每分钟执行的连接数不会超过此数量。使用可以轻松实现iptables
。 这是与我的目标相似的示例:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
速率限制了应用程序执行每个URL
x
的查找数量以上的能力。例:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
据我所知,iptables
它无法跟踪单独的URL。只能对整个连接进行速率限制。这似乎也不是我要实现的唯一限制。如果可以通过这种方式进行设置iptables
,则由于我的请求是由用户发起的,因此它可能会给我的Web应用程序带来一些问题。
我正在使用Flask,一个可行的选择可能是使用before_request
钩子,并使用数据存储(例如Redis)手动跟踪这些目的地。但是,以这种方式处理连接在堆栈中相当高。我真正需要的(或认为我需要的)是一个智能防火墙应用程序,可以以自定义的方式剖析请求并在达到某些断点时关闭连接。
有什么方法可以实现我的目标吗?
如果是这样,怎么办?