90

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

4

7 回答 7

54

最好的

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

其余的

于 2008-09-25T06:09:42.997 回答
23

正如这篇博文中所述,似乎可以使用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"
于 2013-12-03T16:24:31.157 回答
13

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

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

它非常强大

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

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

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

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

  • 在定义的时间段内限制请求事件的数量。
  • 它还可以检测非常重要的人 (VIP),这些人可以在没有限制或限制较少的情况下访问 Web 服务器。
  • 通用请求行和标题过滤器以拒绝未经授权的操作。

  • 请求正文数据限制和过滤(需要 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/

于 2015-02-13T15:01:09.403 回答
7

在 Apache 2.4 中,有一个名为mod_ratelimit的新库存模块。为了模拟调制解调器速度,您可以使用mod_dialup。尽管我不明白为什么您不能对所有内容都使用 mod_ratelimit。

于 2013-07-16T16:51:51.883 回答
6

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

于 2013-12-20T15:51:54.550 回答
3

另一种选择 - mod_qos

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

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

于 2013-08-08T11:24:02.303 回答
3

取决于你为什么要限制速率。

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

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

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

于 2018-09-25T13:11:46.253 回答