在《低成本防CC攻击、薅羊毛风控反欺诈方案》提到,在互联网营销活动中,经常需要应对薅羊毛团队的攻击,尤其是使用程序全自动模拟调用注册等接口服务。
一个有效手段是对用户调用某个接口的并发数进行流量限速,这里采用HAproxy来对用户访问速率(并发数)进行控制。
HAProxy对流量控制,主要使用 stick-table 和acl结合完成。
在对流量控制时候,有两种方案:
a、基于客户端IP地址进行流量控制
优点:效率较高,实现机制简单
缺点:控制粒度过粗,不能精准标识用户,容易误伤。例如同一局域网的用户公网IP地址都相同,导致都受影响。
b、基于客户端sessionid、token等信息进行流量控制
优点:机制灵活,可以对用户精准识别
缺点:相对于基于IP的方案,效率要低一点
需求场景:
1、对访问 /user/v1/register 接口的限制并发数
2、对访问其他接口的不做限制
方案1、基于客户端IP地址进行流量控制
frontend frontend_web bind 0.0.0.0:80 #定义基于IP的stick-table stick-table type ip size 1m expire 10s store http_req_rate(10s) #由于在acl中使用了 http 层的 path_beg -i /user/v1/register,需要使用 tcp-request inspect-delay指令,以等待haproxy搜集http层信息 tcp-request inspect-delay 10s tcp-request connection track-sc0 src #如果为register接口,则对并发数进行控制 acl abuse sc0_http_req_rate gt 3 acl register_acl path_beg -i /user/v1/register http-request deny if register_acl abuse
方案2、基于客户端IP地址进行流量控制
frontend frontend_web
bind 0.0.0.0:80
stick-table type string size 1m expire 10s store http_req_rate(10s)
http-request track-sc0 req.cook(JSESSIONID)
#如果为register接口,则对并发数进行控制
acl abuse sc0_http_req_rate gt 3
acl register_acl path_beg -i /user/v1/register
http-request deny if register_acl abuse
参考资料
Introduction to HAProxy Stick Tables
转载请注明:出家如初,成佛有余 » 使用HAProxy对API接口做流量限速