
网站被恶意攻击?使用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
stick-table
配置的作用是存储请求信息,二进制类型文件,每块数据8字节,最大限制1MB,有效期10秒钟,存储数据类型为http_req_rate(10s)
10秒内的请求信息。http-request track-sc0 base32+src
支持从当前连接跟踪粘性计数器,跟踪指定表的计数器作为第一组集合,其中base32+src
用于跟踪URL和源IP地址(8或20字节取决于源IP地址)。set-var(req.rate_limit)
根据map规则的path
设置请求req.rate_limit
变量set-var(req.request_rate)
设置跟踪请求频率acl rate_abuse var(req.rate_limit),sub(req.request_rate) lt 0
如果超过访问频率启动限制策略。http-request deny deny_status 429 if rate_abuse
设置限制访问策略返回码为429。
最终效果
转载本文时请注明出处及本文链接地址网站被恶意攻击?使用HAProxy设置访问限制就这么简单。