HAProxy:根据状态码和路径限制客户端的速率

时间:2019-08-30 15:01:45

标签: haproxy

我们希望对行为异常的客户端进行分级,但仅限于特定路径并取决于其404es的速率。

similar question给了我大部分答案,但是如果我尝试通过acl将sc_inc_gpc0限制为特定路径,则在启动时会收到以下警告,这导致我不太了解:

acl 'is_path' will never match because it only involves keywords that are incompatible with 'frontend http-response header rule'

经过测试的示例配置:

frontend fe_http
 mode http
 bind *:8080

 acl is_path path_beg -i /path

 stick-table type ipv6 size 10k expire 300s store gpc0_rate(10s)
 http-request  track-sc0 src
 http-request  deny deny_status 429 if { sc0_gpc0_rate gt 10 }
 http-response sc-inc-gpc0(0) if is_path { status 404 }

 default_backend be_http

backend be_http
 mode http
 server example example.com:80

我们正在使用HAProxy 1.9.8。

...帮助吗?

附录

好的,在阅读之后,我现在知道HAProxy不会在事务中保留请求中的信息。因此,您必须将路径保存在txn.var中。我尝试过:

frontend fe_http
 mode http
 bind *:8080

 acl is_path var(txn.path) -m beg -i /path

 stick-table type ipv6 size 10k expire 300s store gpc0_rate(10s)
 http-request set-var(txn.path) path
 http-request  track-sc0 src
 http-request  deny deny_status 429 if { sc0_gpc0_rate gt 10 }
 http-response sc-inc-gpc0(0) if is_path { status 404 }

 default_backend be_http

backend be_http
 mode http
 server example example.com:80 

这使HAProxy不会抱怨“从不匹配ACL”。遗憾的是,它仍然不符合我的测试要求。

1 个答案:

答案 0 :(得分:-1)

如果要根据其404速率进行速率限制,则需要在配置中将404代码更改为404:

http-request deny deny_status 404 if { sc_http_req_cnt(0) gt 1000 }
  

同时使用deny和tarpit,您可以添加deny_status标志来设置   自定义响应代码,而不是他们用完的默认403/500   的盒子。例如,使用http-request deny deny_status 429将   导致HAProxy以错误429响应客户端:太多   请求。

具体路径,您可以看到:

https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/#rate-limit-by-url

有关ACL和速率限制的更多“常规”信息,您可以查看:

https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/ https://www.haproxy.com/blog/introduction-to-haproxy-acls/