如何使用Apache实施速率限制?(每秒请求数)


84

哪些技术和/或模块可用于在Apache中实施可靠的速率限制(请求|字节/ ip /单位时间)?


我在Web服务器上使用Linux的tc,因为Red Hat 6仅具有Apache 2.2。
2014年

Answers:


55

最好的

  • mod_evasive(更多关于减少DoS暴露)
  • mod_cband(“正常”带宽控制的最佳功能)

其余的


10
我找不到任何可以限制IP地址每天连接的内容。我整夜都在搜寻,真是可惜。
格雷格,

1
有谁知道在逆向代理后面运行时是否有办法让mod_evasive来查看标头而不是IP?
Stavros Korokithakis

6
4年后,mod_evasive仍然是“最好的”吗?
扎克·汤普森

6
备份您的索赔。为什么_evasive和_cband最好?
里德

4
mod_evasive收到了很多在线建议,但截至2017年中,它似乎已被其作者Jonathan Zdziarski放弃,他奇怪地从他的博客中删除了对其的所有引用-尽管该源代码仍可作为上载使用。最近6年(或的情况下为15年mod_limitipconn)没有其他项目进行过更新。
Anthony Geoghegan

19

本博客文章所述,似乎可以使用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"

3
这对我来说是完美的,已经运行了modsec2。只需向规则中添加id即可匹配modsec版本,例如:<LocationMatch“ ^ / somepath”> SecAction initcol:ip =%{REMOTE_ADDR},pass,nolog,id:10000001 SecAction“ phase:5,deprecatevar: ip.somepathcounter = 1/1,pass,nolog,id:10000002“ SecRule IP:SOMEPATHCOUNTER” @gt 60“” phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog, id:10000003“ SecAction”阶段:2,pass,setvar:ip.somepathcounter = + 1,nolog,id:10000004“标头始终设置为重试,” 10“之后env = RATELIMITED </ LocationMatch>
Nathan Stretch

2
还要注意,您可以通过编辑“ @gt 60”来更改允许的初始突发请求数量,以及通过编辑ip.somepathcounter = 1/1位来“重新充电”限制的速度。1/1每秒允许一个额外的请求。1/2允许一个附加的请求,每2秒等
森拉伸

3
Apache 2.4将抱怨ErrorDocument中的509,一个选项将其更改为429(当然,Apache 2.2中不支持)。此外,自mod_security 2.7起,所有SecAction和SecRule-s都需要一个ID。
Mrten 2015年

1
仅供参考,mod_security这不是Apache项目。
Christopher Schultz,

12

包括Web应用程序防火墙在内的方法很多,但如果使用Apache mod,最容易实现。

我想推荐的一种mod是mod_qos。它是一个免费模块,对certin DOS,Bruteforce和Slowloris类型攻击非常有效。这将大大减轻您的服务器负载。

它非常强大

当前版本的mod_qos模块实现了控制机制来管理:

  • 对位置/资源(URL)或虚拟主机的最大并发请求数。

  • 带宽的限制,例如每秒对URL的最大允许请求数或每秒最大/最小下载千字节。

  • 限制每秒的请求事件数(特殊请求条件)。

  • 在限定的时间内限制请求事件的数量。
  • 它还可以检测到非常重要的人员(VIP),这些人员可以不受限制地访问网络服务器或不受限制地访问。
  • 通用请求行和标头过滤器可拒绝未经授权的操作。

  • 请求正文数据限制和过滤(需要mod_parp)。

  • 限制单个客户端(IP)的请求事件的数量。

  • TCP连接级别的限制,例如,单个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.

http://opensource.adnovum.ch/mod_qos/


这仅适用于旧的apache2.2,不适用于apache2.4 +,是吗?
infiniteloop

@infiniteloop在mod_quos sourceforge页面上说,它可以与apache2.4正常工作。但是,这里有一些关于无法使用的功能的具体讨论:stackoverflow.com/a/15726540/1402498
JamesHoux


6

可悲的是,mod_evasive在非前叉配置中使用时,它无法按预期工作(最近的Apache设置主要是MPM)



1

取决于您为什么要进行速率限制。

如果要防止服务器过载,将NGINX放在服务器前面并在其中配置速率限制实际上是有意义的。这是有道理的,因为NGINX使用的资源要少得多,每万个连接大约需要几个MB。因此,如果服务器被淹没,NGINX将进行速率限制(使用少量的资源),仅将允许的流量传递给Apache。

如果您所追求的只是简单性,请使用mod_evasive之类的东西。

与往常一样,如果要防止DDoS或DoS攻击,请使用Cloudflare之类的服务,该服务也具有速率限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.