有哪些技术和/或模块可用于在apache中实现强大的速率限制(请求|字节/ ip /单位时间)?
正如this blog帖子中所述,似乎可以使用mod_security来实现每秒的速率限制。
配置是这样的:
SecRuleEngine On
<LocationMatch "^/somepath">
SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>
ErrorDocument 509 "Rate Limit Exceeded"
有许多方法,包括Web应用程序防火墙,但如果使用Apache mod,最容易实现。
我想推荐的一个这样的mod是mod_qos。它是一个免费的模块,对于certin DOS,Bruteforce和Slowloris类型的攻击非常有效。这将缓解您的服务器负载。
它非常强大。
mod_qos模块的当前版本实现了管理的控制机制:
这是您可以使用它的示例配置。有数百种可能的配置可满足您的需求。访问该网站以获取有关控件的更多信息。
Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate 120
# limits the connections for this virtual host:
QS_SrvMaxConn 800
# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose 600
# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP 50
# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP 172.18.3.32
QS_SrvMaxConnExcludeIP 192.168.10.
在Apache 2.4中,有一个名为mod_ratelimit的新库存模块。要模拟调制解调器速度,可以使用mod_dialup。虽然我不明白你为什么不能将mod_ratelimit用于一切。
遗憾的是,mod_evasive
在非prefork配置中使用时将无法按预期工作(最近的apache设置主要是MPM)
取决于你想要限价的原因。
如果它是为了防止服务器过载,那么将NGINX放在它前面实际上是有意义的,并在那里配置rate limiting。这是有道理的,因为NGINX使用的资源要少得多,就像每万个连接几MB一样。因此,如果服务器被泛洪,NGINX将进行速率限制(使用少量资源)并仅将允许的流量传递给Apache。
如果您只是简单,那么请使用mod_evasive之类的东西。
像往常一样,如果要防止DDoS或DoS攻击,请使用像Cloudflare这样的服务,它也具有速率限制功能。