我怎样才能用Apache实现速率限制? (每秒请求)
什么技术和/或模块可用于实现强大的速率限制(请求|字节/ IP /单位时间)在Apache?
最好的
- mod_evasive (更多地关注减lessDoS暴露)
- mod_cband (最好的“普通”带宽控制function)
剩下的
- mod_limitipconn
- mod_bw
- mod_bwshare
正如在这个博客文章中所述,似乎可以使用Apache的mod_security来实现每秒的速率限制。
configuration是这样的:
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和Slowloristypes的攻击。 这将缓解你的服务器负载相当多。
这是非常强大的 。
当前版本的mod_qos模块实现了控制机制来pipe理:
-
对位置/资源(URL)或虚拟主机的最大并发请求数。
-
带宽的限制,例如每秒对URL的最大允许请求数或者每秒下载的千字节数的最大值/最小值。
-
限制每秒请求事件的数量(特殊请求条件)。
- 在定义的时间段内限制请求事件的数量。
- 它还可以检测可能访问Web服务器的非常重要的人员(VIP),而没有或有更less的限制。
-
通用请求行和标题filter拒绝未经授权的操作。
-
请求身体数据限制和过滤(需要mod_parp)。
-
限制单个客户端(IP)的请求事件的数量。
-
TCP连接级别的限制,例如来自单个IP源地址或dynamic保持活动控制的最大允许连接数。
- 当服务器没有空闲的TCP连接时,更喜欢已知的IP地址。
这是您可以使用它的示例configuration。 有数百种可能的configuration来满足您的需求。 访问网站了解更多控制信息。
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的一切。
不幸的是,在非preforkconfiguration中使用mod_evasive
将无法按预期工作(最近的apache设置主要是MPM)