使用HAProxy对API接口做流量限速-出家如初,成佛有余

使用HAProxy对API接口做流量限速

技术 admin 940浏览 0评论

在《低成本防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

Introduction to HAProxy ACLs

HAproxy Configuration Manual

转载请注明:出家如初,成佛有余 » 使用HAProxy对API接口做流量限速

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址