网站被恶意攻击?使用HAProxy设置访问限制就这么简单

网站被恶意攻击?使用HAProxy设置访问限制就这么简单

HAProxy实现的网站访问频率限制就这么简单

你的网站经常遇到被某个IP不速之客频繁访问而导致主机资源占用率居高不下呢?

如何才能自动的将这些不速之客拒之门外呢?

这就是我们今天要说的HAProxy 。使用它记录每个客户端IP访问频率,如果超出特定阈值就让他休息休息 🙂 。 就这么简单的逻辑, 接下来我们就来看看怎么配置的。

配置HAProxy

实际的配置文件内容在最后面,接下来我们介绍主要配置信息

配置map规则文件

先配置一个map规则文件,这个文件设置访问网站路径的频率,内容如下:

$ cat /apps/haproxy/rates.map
/web 40

map文件配置的/web地址的请求频率计算方法为: (40 requests / 10 seconds = 4 rps), 即 每秒钟最多可以访问4次。

配置前端规则

我们需要在前端配置跟踪记录每个客户端信息,并且统计客户的10s秒内访问URL的次数。

先来看下haproxy.cfg配置信息:

# HAProxy 前端服务
frontend fe_web
    bind :80
    mode http
    default_backend be_web

    stick-table type binary len 8 size 1m expire 1m store http_req_rate(10s)

    # Track client by base32+src (Host header + URL path + src IP)
    http-request track-sc0 base32+src

    # Check map file to get rate limit for path
    http-request set-var(req.rate_limit)  path,map_beg(/apps/haproxy/rates.map)

    # Client's request rate is tracked
    http-request set-var(req.request_rate)  base32+src,table_http_req_rate(fe_web)

    # Subtract the current request rate from the limit
    # If less than zero, set rate_abuse to true
    acl rate_abuse var(req.rate_limit),sub(req.request_rate) lt 0

    # Deny if rate abuse
    http-request deny deny_status 429 if rate_abuse


backend be_web
    mode    http
    server  server1 127.0.0.1:8080 check
  1. stick-table 配置的作用是存储请求信息,二进制类型文件,每块数据8字节,最大限制1MB,有效期10秒钟,存储数据类型为http_req_rate(10s) 10秒内的请求信息。
  2. http-request track-sc0 base32+src 支持从当前连接跟踪粘性计数器,跟踪指定表的计数器作为第一组集合,其中base32+src用于跟踪URL和源IP地址(8或20字节取决于源IP地址)。
  3. set-var(req.rate_limit)根据map规则的path设置请求req.rate_limit变量
  4. set-var(req.request_rate)设置跟踪请求频率
  5. acl rate_abuse var(req.rate_limit),sub(req.request_rate) lt 0 如果超过访问频率启动限制策略。
  6. http-request deny deny_status 429 if rate_abuse 设置限制访问策略返回码为429。

最终效果

转载本文时请注明出处及本文链接地址网站被恶意攻击?使用HAProxy设置访问限制就这么简单

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注