HAPROXY sc_get_gpc0 acl не работает в течение длительного периода блокировки - PullRequest
0 голосов
/ 10 июля 2020

Я изо всех сил пытался заставить эту конфигурацию ограничения скорости работать на HAProxy. Как видно ниже, я пытаюсь использовать "sc2_get_gpc0", чтобы получить второе значение, хранящееся в таблице ручки hour_hold. Это значение gp c увеличивается каждый раз, когда делается запрос, когда клиент уже достиг стандартного ограничения скорости. Это значение должно оставаться в таблице в течение 1 часа. Кажется, мне не удается заставить acl обнаружить, что значение больше 0, и заблокировать соединения после того, как стандартное ограничение скорости "is_abuse" прошло 20 секунд без скорости запросов, превышающей 10 запросов за 20 секунд.

backend hour_hold
    stick-table  type binary  len 8  size 100k  expire 60m  store gpc0

backend backend
    stick-table  type binary  len 8  size 100k  expire 60m  store http_req_rate(20s)
    http-request track-sc1 base32+src table backend
    http-request set-var(req.rate_limit)  path,map_beg(/usr/local/etc/haproxy/rates.map,10)
    http-request set-var(req.request_rate)  base32+src,table_http_req_rate(backend)
    acl is_abuse var(req.rate_limit),sub(req.request_rate) lt 0
    http-request track-sc2 base32+src table hour_hold if is_abuse
    http-request sc-inc-gpc0(2) if is_abuse
    # acl inc_abuse_cnt sc2_inc_gpc0(hour_hold) gt 0
    acl abuse_cnt sc2_get_gpc0(hour_hold) gt 0
    http-request deny deny_status 429 if is_abuse or abuse_cnt
    # http-request deny deny_status 429 if abuse_cnt
    # http-request deny deny_status 429 if is_abuse inc_abuse_cnt```
...