我们希望对行为异常的客户端进行分级,但仅限于特定路径并取决于其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”。遗憾的是,它仍然不符合我的测试要求。
答案 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/