哪些技术和/或模块可用于在Apache中实施可靠的速率限制(请求|字节/ ip /单位时间)?
Answers:
mod_evasive
收到了很多在线建议,但截至2017年中,它似乎已被其作者Jonathan Zdziarski放弃,他奇怪地从他的博客中删除了对其的所有引用-尽管该源代码仍可作为上载使用。最近6年(或的情况下为15年mod_limitipconn
)没有其他项目进行过更新。
如本博客文章所述,似乎可以使用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"
mod_security
这不是Apache项目。
包括Web应用程序防火墙在内的方法很多,但如果使用Apache mod,最容易实现。
我想推荐的一种mod是mod_qos。它是一个免费模块,对certin DOS,Bruteforce和Slowloris类型攻击非常有效。这将大大减轻您的服务器负载。
它非常强大。
当前版本的mod_qos模块实现了控制机制来管理:
对位置/资源(URL)或虚拟主机的最大并发请求数。
带宽的限制,例如每秒对URL的最大允许请求数或每秒最大/最小下载千字节。
限制每秒的请求事件数(特殊请求条件)。
通用请求行和标头过滤器可拒绝未经授权的操作。
请求正文数据限制和过滤(需要mod_parp)。
限制单个客户端(IP)的请求事件的数量。
TCP连接级别的限制,例如,单个IP源地址或动态保持活动控制所允许的最大连接数。
这是您可以使用的示例配置。有数百种可能的配置可以满足您的需求。访问该网站以获取有关控件的更多信息。
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。
SUSPENDED
状态,不会在等待时浪费线程,而到目前为止,mod_ratelimit严格来说是每个连接线程。cf. thread.gmane.org/gmane.comp.apache.cvs/20490