Excerpt from cfg
Backend1
mode http
acl is-error res.hdr(status) 403
http-request track-sc2 src table error-count
http-response sc-inc-gpc0(2) if is-error
option httpchk
balance static-rr
server serverA [serverip-here] check inter 5s downinter 4s maxconn 4000
server serverB [serverip-here] check inter 5s downinter 4s maxconn 4000
backend error-count
stick-table type ip size 1m expire 3m store gpc0
我在浏览器上强制出现 403 错误后的结果:
# table: error-count, type: ip, size:1048576, used:1
0x562d0383ccc8: key=IPdisplays-here use=0 exp=173781 gpc0=0
我可以看到 IP 正在被跟踪,并且过期没有问题,但我无法让 gpc0 在 stick 表中更新。它仍然是 0。
我尝试过各种匿名和其他 ACL 以及表类型字符串。没有运气。谷歌什么也没有。任何想法都值得赞赏。
谢谢!
答案1
在 HTTP 中,没有一个名为 的标准响应标头status
,因此此 ACL 永远不会匹配:
acl is-error res.hdr(status) 403
但是,第 7 层可以获取status
:
status
: 整数返回包含 HTTP 响应中的 HTTP 状态代码的整数,例如 302。它主要用于 ACL 和整数范围内,例如,如果响应不是 3xx,则删除任何 Location 标头。
http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-status
我认为你的本意是这样的:
acl is-error status 403
...或者如果您更喜欢明确的比较表达式,请指定整数匹配:
acl is-error status -m int 403
所有版本的 HAProxy 都提供抓取status
功能,至少可以追溯到 1.5 版,甚至更早的版本。
答案2
我不确定您是否可以在请求中跟踪的响应中增加粘性计数器。有一个类似的 http-response track-sc2,但我认为它们不会交叉。
https://www.haproxy.com/documentation/hapee/1-9r1/onepage/#4.2-http-response%20track-sc0
答案3
我正在做一些非常相似的事情。我不确定为什么我的有效而你的无效。我肯定是在请求中跟踪的响应中增加了一个计数器。我确实看到 gpc0 在我的设置中递增。一个可能的区别:我的 sc 操作是在前端。另外,我使用的是 sc0 而不是 sc2。我认为这两个都不重要。我正在运行 1.8.8。我的 cfg 摘录:
在 FE 中:
http-request track-sc0 src table Penalty_Box
http-response sc-inc-gpc0(0) if { status 403 } || { status 404 }
http-request deny if { sc_get_gpc0(0) gt 5 }
BE 粘贴表:
后端Penalty_Box
stick-table type ip size 2000 expire 10m store http_req_rate(10s),gpc0
如果您已设法使您的配置正常工作,我当然想知道您必须做什么。