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

问题描述 投票:74回答:8

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

apache apache2 ddos
8个回答
53
投票

最好的

其余的


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"

10
投票

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

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

它非常强大。

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

  • 对位置/资源(URL)或虚拟主机的最大并发请求数。
  • 带宽限制,例如每秒允许的最大请求数到URL或每秒下载的kbytes的最大/最小值。
  • 限制每秒请求事件的数量(特殊请求条件)。
  • 限定在定义的时间段内请求事件的数量。
  • 它还可以检测非常重要的人(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/


6
投票

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


5
投票

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


2
投票

还有一个选项 - mod_qos

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

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


1
投票

取决于你想要限价的原因。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.