在网上找一些关于Haproxy对于过速防御的解决办法,大致上就找到两种:

  1. 对于整体请求速度的控制
  2. 对于某个IP的请求速度的控制

这两种方式都不太好,第一种太过粗粒度,第二种容易误伤(如果多个客户端从同一台路由设备过来)。

设想一种基于Cookie的防御方法,因为Cookie里有记录SESSIONID这样的数据,如果针对SESSIONID进行过速请求防御,那么粒度就足够精细了。

下面是配置文件样例:

frontend http-in
  
  ...    
  # 创建stick-table,记录 cookie value -> 最近30秒内http请求次数
  stick-table type string len 50 size 1m expire 10m store http_req_rate(30s)
  
  # 将cookie(SESSION)作为key,存到stick-table中,并且计数
  http-request track-sc0 req.cook(SESSION)
  
  # 定义ACL,请求次数是否超过100
  acl abuse sc0_http_req_rate gt 100
  
  # 如果ACL为true,则拒绝http请求,响应429
  http-request deny deny_status 429 if abuse

如果你在haproxy里启用了如下配置:

stats socket /var/run/haproxy/haproxy.sock mode 0600 level admin

那么可以通过Socket Command在Haproxy运行时查看stick-table中的数据:

echo 'show table http-in' |  sudo socat  /var/run/haproxy/haproxy.sock -

参考资料


chanjarster
4.2k 声望244 粉丝

引用和评论

0 条评论