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

时间:2008-09-25 06:07:10

标签: apache apache2 ddos

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

8 个答案:

答案 0 :(得分:52)

最好的

和其他

答案 1 :(得分:18)

正如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"

答案 2 :(得分:9)

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

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

非常强大

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

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

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

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

  • 在规定的时间内限制请求事件的数量。
  • 它还可以检测可能访问的非常重要的人(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/

答案 3 :(得分:6)

在Apache 2.4中,有一个名为mod_ratelimit的新库存模块。要模拟调制解调器速度,可以使用mod_dialup。虽然我不明白为什么你不能将mod_ratelimit用于所有事情。

答案 4 :(得分:5)

可悲的是,mod_evasive在非prefork配置中使用时将无法正常工作(最近的apache设置主要是MPM)

答案 5 :(得分:2)

还有一个选项 - mod_qos

配置起来并不简单 - 但功能强大。

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:-1)

看看Apache 2.4 mod_ratelimit

  

提供一个名为RATE_LIMIT的过滤器以限制客户端带宽。的   将限制发送到每个HTTP响应,同时将其传输到   客户端,而不是在IP /客户端级别汇总。连接   使用环境以KiB / s为单位指定要模拟的速度   可变速率限制。

<Location "/downloads">
    SetOutputFilter RATE_LIMIT
    SetEnv rate-limit 400 
    SetEnv rate-initial-burst 512
</Location>